cp's OEIS Frontend

This is a front-end for the Online Encyclopedia of Integer Sequences, made by Christian Perfect. The idea is to provide OEIS entries in non-ancient HTML, and then to think about how they're presented visually. The source code is on GitHub.

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.

Original entry on oeis.org

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

Views

Author

Luke Bennet, Jun 30 2025

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