close
login
A385493
Number of distinct states in Conway's Game of Life acting on a (2n+1) X (2n+1) toroidal grid starting with (x,y) turned on if and only if x-n + (y-n)*i is a Gaussian prime.
0
1, 1, 1, 6, 9, 4, 4, 5, 14, 12, 17, 5, 8, 19, 15, 34, 20, 21, 19, 77, 52, 29, 58, 39, 27, 27, 68, 31, 27, 27, 27, 70, 49, 129, 83, 43, 153, 40, 82, 128, 60, 457, 436, 79, 99, 71, 71, 178, 125, 281, 121, 121, 94, 231, 94, 94, 385, 122, 94, 94, 175, 306, 156
OFFSET
0,4
EXAMPLE
For a(3), the sequence of Conway's Game of Life is
| . o . o . o . | . o . o . o . | . o . . . o . |
| o . o . o . o | o . . . . . o | o o o o o o o |
| . o o . o o . | . . o . o . . | . o . . . o . |
| o . . . . . o | o . . . . . o | . o . . . o . |
| . o o . o o . | . . o . o . . | . o . . . o . |
| o . o . o . o | o . . . . . o | o o o o o o o |
| . o . o . o . | . o . o . o . | . o . . . o . |
(generation 1) (generation 2) (generation 3)
| . . . o . . . | . . o o o . . | . o . . . o . |
| . . . o . . . | . . o o o . . | o . . . . . o |
| . . . o . . . | o o . o . o o | . . . . . . . |
| o o o . o o o | o o o . o o o | . . . . . . . |
| . . . o . . . | o o . o . o o | . . . . . . . |
| . . . o . . . | . . o o o . . | o . . . . . o |
| . . . o . . . | . . o o o . . | . o . . . o . |
(generation 4) (generation 5) (generation 6)
Every generation after 6 is identical to generation 6, so this sequence has 6 unique states. Thus, a(3) = 6.
PROG
(Python)
import torch
import numpy as np
def prime_mask(limit):
is_prime = torch.ones(limit + 1, dtype=torch.bool)
is_prime[:2] = False
for i in range(2, int(limit**0.5) + 1):
if is_prime[i]:
is_prime[i*i : limit+1 : i] = False
return is_prime
def Gauss_primes(N):
A, B = torch.meshgrid(torch.arange(-N, N+1), torch.arange(-N, N+1))
norm = A**2 + B**2
is_prime = prime_mask(2*N**2)
mask = (A != 0) & (B != 0) & is_prime[norm]
axis_mask = ((A == 0) ^ (B == 0))
axis_val = (A + B).abs()
axis_mask &= is_prime[axis_val] & ((axis_val % 4) == 3)
return mask | axis_mask
def update(G):
shifts = [(1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0), (-1, -1), (0, -1), (1, -1)]
neighbors = sum(torch.roll(G, shifts=shift, dims=(0, 1)) for shift in shifts)
return (G & ((neighbors == 2) | (neighbors == 3))) | (~G & (neighbors == 3))
def a(n):
if n == 0 or n == 1:
return 1
G = Gauss_primes(n).to("cuda").to(torch.uint8)
seen, step = set(), 0
while True:
flat = G.flatten().to("cpu").numpy()
key = bytes(np.packbits(flat))
if key in seen:
return step
seen.add(key)
G = update(G)
step += 1
CROSSREFS
Cf. A055025.
Sequence in context: A143735 A216117 A021148 * A269981 A133749 A201130
KEYWORD
nonn
AUTHOR
Luke Bennet, Jun 30 2025
STATUS
approved