Jump to content

Legendre prime counting function: Difference between revisions

m
use the precalculated values from Nim example
m (→‎{{header|Julia}}: add trans from nim)
m (use the precalculated values from Nim example)
Line 2,060:
{{trans|Nim}}
<syntaxhighlight lang="julia">
const masks = [1, 2, 4, 8, 16, 32, 64, 128]
function countprimes(n::Integer)
 
n < 3 && return typeof(n)(n > 1)
function countprimes(n::Integer)
@inline half(i::Integer) = (i - 1) >> 1
n < 3 && return typeof(n)(n > 1)
rtlmt = isqrt(n)
mxndx = (rtlmt - 1) ÷ 2
smallsrilmt = [imxndx for+ i in 0:mxndx+1]
roughssmalls = [i + i + 1 for i in 0:mxndx+1rilmt]
largesroughs = [(n ÷ (i + i + 1) - 1) ÷ 2 for i in 0:mxndx+1rilmt]
cmpstslarges = falses[(mxndxn ÷ (i + i + 1) - 1) ÷ 2 for i in 0:rilmt]
bp,cullbuf npc= zeros(Int, mxri(mxndx =+ 3,8) 0,÷ mxndx8)
whilenbps true= 0
for i = bp >>in 1:typemax(UInt32)
sqri = (i + i) * (i + 1)
sqri > mxndx && break
ifcullbuf[i !cmpsts>> 3 + 1] & masks[i & 7 + 1] != 0 && continue
cmpstscullbuf[i >> 3 + 1] |= truemasks[i & 7 + 1]
bp = i + fori c+ in sqri:bp:mxndx1
for cmpsts[c +in sqri:bp:arrlen-1] = true
cullbuf[c >> 3 + c1] |= smallsmasks[kc >>& 17 + 1] - npc
end
mnri = mxndx0
for jori in 10:mxririlmt-1
p r = roughs[jori + 1]
mxrirci = rir ->> 1
cullbuf[rci >> 3 + 1] & masks[rci & 7 + 1] != 0 && continue
d = r * endbp
npct += 10
if d m -<= 1rtlmt
t = larges[smalls[md>>1 + 1] -= cnbps + 1]
while m >= eeelse
eet = smalls[(kn *÷ bpd - 1) >> 1 + 1]
end
rilarges[nri + 1] = 0larges[ori + 1] - t + nbps
forroughs[nri k+ in1] 0:mxri= r
nri q += roughs[k + 1]
qi = q >> 1end
si = cmpsts[qi + 1] && continuemxndx
for pm in (rtlmt ÷ bp - 1) d| =1 bp: *-2 q: bp
c = largessmalls[ri + pm>>1] = larges[k + 1] + npc -
e = (dpm <=* rtlmt ? larges[smalls[dbp) >> 1 + 1] - npc + 1] : smalls[half(n ÷ d) + 1])
while si roughs[ri + 1] >= qe
rismalls[si += 1] -= (c - nbps)
result -= (ee - j) * (npc + jsi -= 1)
end
m = mxndx
for k in (rtlmt ÷ bp - 1) | 1 : -2 : bp
c = smalls[k >> 1 + 1] - npc
ee = (k * bp) >> 1
while m >= ee
smalls[m + 1] -= c
m -= 1
end
end
mxri = ri - 1
npc += 1
end
bprilmt += 2nri
resultnbps -+= larges[i]1
end
ans = larges[1] + ((rilmt + 2*(nbps-1)) * (rilmt - 1) ÷ 2)
 
resultfor =ri larges[in 1:rilmt-1]
for i in 2:mxri ans -= larges[ri + 1]
result -= larges[i]
end
for ri in 1:typemax(UInt32)
result += (mxri + 1 + 2 * (npc - 1)) * mxri ÷ 2
p = roughs[ri + 1]
 
for j in 1:mxri
p = roughs[j + 1]
m = n ÷ p
eeei = smalls[half((m ÷ p) - 1) >> 1 + 1] - npcnbps
eeei <= jri && break
forans k-= in(ei - ri) * (nbps j+ ri - 1:ee)
for sri in ri+1:ei
resultans += smalls[half(m ÷ (roughs[ksri + 1]) - 1) >> 1 + 1]
end
result -= (ee - j) * (npc + j - 1)
end
return resultans + 1
end
 
4,105

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.