Legendre prime counting function: Difference between revisions

m
m (use the precalculated values from Nim example)
Line 2,063:
 
function countprimes(n)
n < 3 && return typeof(n)(n > 1)
rtlmt = isqrt(n)
mxndx = (rtlmt - 1) ÷ 2
smalls::Array{UInt32} = [i for i in 0:mxndx+1]
rilmt = mxndx + 1
smallsroughs::Array{UInt32} = [i + i + 1 for i in 0:rilmtmxndx+1]
roughslarges::Array{Int64} = [(n ÷ (i + i + 1) - 1) ÷ 2 for i in 0:rilmtmxndx+1]
largescmpsts = [falses(n ÷ (i + imxndx + 1) - 1) ÷ 2 for i in 0:rilmt]
cullbufbp, = zeros(Intnpc, (mxndxmxri += 8)3, ÷0, 8)mxndx
nbpswhile = 0true
for i in= bp >> 1:typemax(UInt32)
sqri = (i + i) * (i + 1)
sqri > mxndx && break
cullbuf[iif >> 3 + 1] & masks!cmpsts[i & 7 + 1] != 0 && continue
cullbuf cmpsts[i >> 3 + 1] |= masks[i & 7 + 1]true
bp = i + ifor +c 1in sqri:bp:mxndx
for cmpsts[c in+ sqri:bp:arrlen-1] = true
cullbuf[c >> 3 + 1] |= masks[c & 7 + 1]
end
nri = 0
for ori in 0:rilmt-1
r = roughs[ori + 1]
rci = r >> 1
cullbuf[rci >> 3 + 1] & masks[rci & 7 + 1] != 0 && continue
d = r * bp
t = 0
if d <= rtlmt
t = larges[smalls[d>>1 + 1] - nbps + 1]
else
t = smalls[(n ÷ d - 1) >> 1 + 1]
end
larges[nri + 1]ri = larges[ori + 1] - t + nbps0
roughs[nrifor +k 1]in = r0:mxri
nri + q = roughs[k + 1]
end qi = q >> 1
si = mxndx cmpsts[qi + 1] && continue
for pm in (rtlmt ÷ bp - 1) |d 1= :UInt64(bp) -2* : bpUInt64(q)
c = smalls larges[pm>>ri + 1] = larges[k + 1] + npc -
e = (pmd *<= bp)rtlmt ? larges[smalls[d >> 1 + 1] - npc + 1]
while si : smalls[(Int(floor(n / d)) - 1) >=> 1 + e1])
smallsroughs[siri + 1] -= (c - nbps)q
siri -+= 1
end
nri m = 0mxndx
for k in (rtlmt ÷ bp - 1) | 1 : -2 : bp
cullbuf[c >> 3 + 1]c |= maskssmalls[ck &>> 71 + 1] - npc
tee = smalls[(nk ÷* d - 1bp) >> 1 + 1]
else while m >= ee
t = larges[ smalls[d>>1m + 1] -= nbps + 1]c
if d < m -= rtlmt1
d = r * bpend
end
rcimxri = rri >>- 1
tnpc += 01
end
rilmtbp += nri2
nbps += 1
end
 
ans = larges[1] + ((rilmt + 2*(nbps-1)) * (rilmt - 1) ÷ 2)
forresult ri= in 1:rilmt-larges[1]
for i in ans -= larges[ri 2:mxri+ 1]
nbpsresult +-= 1larges[i]
end
result += (mxri + 1 + 2 * (npc - 1)) * mxri ÷ 2
for ri in 1:typemax(UInt32)
 
p = roughs[ri + 1]
for orij in 01:rilmt-1mxri
rp = UInt64(roughs[orij + 1])
m = n ÷ p
eiee = smalls[(Int(floor(m ÷/ p)) - 1) >> 1 + 1] - nbpsnpc
eiee <= rij && break
ansfor -=k (ei - ri) * (nbpsin j+ ri - 1):ee
ansresult += smalls[(Int(floor(m ÷/ (roughs[srik + 1])) - 1) >> 1 + 1]
for sri in ri+1:ei
ans += smalls[(m ÷ (roughs[sri + 1]) - 1) >> 1 + 1]
end
result -= (ee - j) * (npc + j - 1)
end
return ansresult + 1
end
 
Line 2,129:
println("π(10^$i) = ", countprimes(10^i))
end
 
@time countprimes(10^14)
 
</syntaxhighlight>{{out}}
<pre>
Line 2,146 ⟶ 2,149:
π(10^13) = 346065536839
π(10^14) = 3204941750802
4.744442 seconds (13 allocations: 153.185 MiB, 0.16% gc time)
</pre>
 
4,102

edits