Legendre prime counting function: Difference between revisions
Content added Content deleted
m (use the precalculated values from Nim example) |
|||
Line 2,063: | Line 2,063: | ||
function countprimes(n) |
function countprimes(n) |
||
n < 3 && return n > 1 |
n < 3 && return typeof(n)(n > 1) |
||
rtlmt = isqrt(n) |
rtlmt = isqrt(n) |
||
mxndx = (rtlmt - 1) ÷ 2 |
mxndx = (rtlmt - 1) ÷ 2 |
||
smalls::Array{UInt32} = [i for i in 0:mxndx+1] |
|||
rilmt = mxndx + 1 |
|||
roughs::Array{UInt32} = [i + i + 1 for i in 0:mxndx+1] |
|||
larges::Array{Int64} = [(n ÷ (i + i + 1) - 1) ÷ 2 for i in 0:mxndx+1] |
|||
cmpsts = falses(mxndx + 1) |
|||
bp, npc, mxri = 3, 0, mxndx |
|||
while true |
|||
i = bp >> 1 |
|||
sqri = (i + i) * (i + 1) |
sqri = (i + i) * (i + 1) |
||
sqri > mxndx && break |
sqri > mxndx && break |
||
if !cmpsts[i + 1] |
|||
cmpsts[i + 1] = true |
|||
for c in sqri:bp:mxndx |
|||
cmpsts[c + 1] = true |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
cullbuf[rci >> 3 + 1] & masks[rci & 7 + 1] != 0 && continue |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
ri = 0 |
|||
for k in 0:mxri |
|||
q = roughs[k + 1] |
|||
qi = q >> 1 |
|||
cmpsts[qi + 1] && continue |
|||
d = UInt64(bp) * UInt64(q) |
|||
larges[ri + 1] = larges[k + 1] + npc - |
|||
(d <= rtlmt ? larges[smalls[d >> 1 + 1] - npc + 1] |
|||
: smalls[(Int(floor(n / d)) - 1) >> 1 + 1]) |
|||
roughs[ri + 1] = q |
|||
ri += 1 |
|||
end |
end |
||
⚫ | |||
for k in (rtlmt ÷ bp - 1) | 1 : -2 : bp |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
bp += 2 |
|||
⚫ | |||
end |
end |
||
ans = larges[1] + ((rilmt + 2*(nbps-1)) * (rilmt - 1) ÷ 2) |
|||
result = larges[1] |
|||
for i in 2:mxri+1 |
|||
⚫ | |||
end |
end |
||
result += (mxri + 1 + 2 * (npc - 1)) * mxri ÷ 2 |
|||
for ri in 1:typemax(UInt32) |
|||
p = roughs[ri + 1] |
|||
⚫ | |||
⚫ | |||
m = n ÷ p |
m = n ÷ p |
||
ee = smalls[(Int(floor(m / p)) - 1) >> 1 + 1] - npc |
|||
ee <= j && break |
|||
for k in j+1:ee |
|||
⚫ | |||
for sri in ri+1:ei |
|||
⚫ | |||
end |
end |
||
result -= (ee - j) * (npc + j - 1) |
|||
end |
end |
||
return |
return result + 1 |
||
end |
end |
||
Line 2,129: | Line 2,129: | ||
println("π(10^$i) = ", countprimes(10^i)) |
println("π(10^$i) = ", countprimes(10^i)) |
||
end |
end |
||
@time countprimes(10^14) |
|||
</syntaxhighlight>{{out}} |
</syntaxhighlight>{{out}} |
||
<pre> |
<pre> |
||
Line 2,146: | Line 2,149: | ||
π(10^13) = 346065536839 |
π(10^13) = 346065536839 |
||
π(10^14) = 3204941750802 |
π(10^14) = 3204941750802 |
||
4.744442 seconds (13 allocations: 153.185 MiB, 0.16% gc time) |
|||
</pre> |
</pre> |
||