Legendre prime counting function: Difference between revisions
Content added Content deleted
m (→{{header|Julia}}: add trans from nim) |
m (use the precalculated values from Nim example) |
||
Line 2,060: | Line 2,060: | ||
{{trans|Nim}} |
{{trans|Nim}} |
||
<syntaxhighlight lang="julia"> |
<syntaxhighlight lang="julia"> |
||
const masks = [1, 2, 4, 8, 16, 32, 64, 128] |
|||
⚫ | |||
⚫ | |||
⚫ | |||
@inline half(i::Integer) = (i - 1) >> 1 |
|||
⚫ | |||
rtlmt = isqrt(n) |
rtlmt = isqrt(n) |
||
mxndx = (rtlmt - 1) ÷ 2 |
mxndx = (rtlmt - 1) ÷ 2 |
||
rilmt = mxndx + 1 |
|||
smalls = [i for i in 0:rilmt] |
|||
roughs = [i + i + 1 for i in 0:rilmt] |
|||
larges = [(n ÷ (i + i + 1) - 1) ÷ 2 for i in 0:rilmt] |
|||
cullbuf = zeros(Int, (mxndx + 8) ÷ 8) |
|||
nbps = 0 |
|||
for i in 1:typemax(UInt32) |
|||
sqri = (i + i) * (i + 1) |
sqri = (i + i) * (i + 1) |
||
sqri > mxndx && break |
sqri > mxndx && break |
||
cullbuf[i >> 3 + 1] & masks[i & 7 + 1] != 0 && continue |
|||
cullbuf[i >> 3 + 1] |= masks[i & 7 + 1] |
|||
bp = i + i + 1 |
|||
for c in sqri:bp:arrlen-1 |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
cullbuf[rci >> 3 + 1] & masks[rci & 7 + 1] != 0 && continue |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
larges[nri + 1] = larges[ori + 1] - t + nbps |
|||
roughs[nri + 1] = r |
|||
nri += 1 |
|||
end |
|||
si = mxndx |
|||
for pm in (rtlmt ÷ bp - 1) | 1 : -2 : bp |
|||
c = smalls[pm>>1 + 1] |
|||
e = (pm * bp) >> 1 |
|||
while si >= e |
|||
smalls[si + 1] -= (c - nbps) |
|||
⚫ | |||
end |
end |
||
⚫ | |||
for k in (rtlmt ÷ bp - 1) | 1 : -2 : bp |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
rilmt = nri |
|||
⚫ | |||
end |
end |
||
ans = larges[1] + ((rilmt + 2*(nbps-1)) * (rilmt - 1) ÷ 2) |
|||
for ri in 1:rilmt-1 |
|||
ans -= larges[ri + 1] |
|||
⚫ | |||
end |
end |
||
for ri in 1:typemax(UInt32) |
|||
result += (mxri + 1 + 2 * (npc - 1)) * mxri ÷ 2 |
|||
p = roughs[ri + 1] |
|||
⚫ | |||
⚫ | |||
m = n ÷ p |
m = n ÷ p |
||
ei = smalls[((m ÷ p) - 1) >> 1 + 1] - nbps |
|||
ei <= ri && break |
|||
ans -= (ei - ri) * (nbps + ri - 1) |
|||
for sri in ri+1:ei |
|||
ans += smalls[(m ÷ (roughs[sri + 1]) - 1) >> 1 + 1] |
|||
end |
end |
||
⚫ | |||
end |
end |
||
return |
return ans + 1 |
||
end |
end |
||