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.
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
Keywords
Examples
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.
Crossrefs
Cf. A055025.
Programs
-
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