login
Number of free polyominoes with 4n cells that can be tiled by n copies of the L-tetromino; equivalently, the number of n-fold multiples of the L-tetromino, counted up to rotation and reflection.
7

%I #8 Jun 19 2026 17:31:06

%S 1,64,3808,299773,24990111,2171041745

%N Number of free polyominoes with 4n cells that can be tiled by n copies of the L-tetromino; equivalently, the number of n-fold multiples of the L-tetromino, counted up to rotation and reflection.

%C In the divisibility language of Polyomino Number Theory (Cibulis, Liu, and Wainwright), a polyomino assembled from n copies of a polyomino P is an n-fold multiple of P. This sequence counts the distinct free n-fold multiples of the L-tetromino. The pieces may be placed in any of their orientations; copies must meet edge to edge and may not overlap.

%H A. Cibulis, A. Liu, and B. Wainwright, <a href="http://www.paulsalomon.com/uploads/2/8/3/3/28331113/polyomino_number_theory_(i).pdf">Polyomino Number Theory I</a>, Crux Mathematicorum 28(3) (2002), 147-150.

%H Solomon W. Golomb, <a href="https://www.jstor.org/stable/2320673">Normed Division Domains</a>, The American Mathematical Monthly, Vol. 88, No. 9 (Nov., 1981), pp. 680-686.

%H Haoyang Xu, <a href="/A397021/a397021.png">Illustration of a(1) and a(2)</a>

%e a(1) = 1 (the L-tetromino itself). a(2) = 64: two L-tetrominoes joined edge to edge form 64 distinct free octominoes.

%o (Python)

%o def _norm(s):

%o mx = min(x for x, y in s); my = min(y for x, y in s)

%o return frozenset((x - mx, y - my) for x, y in s)

%o def _orients(s):

%o out = set(); c = _norm(s)

%o for _ in range(4):

%o out.add(c)

%o out.add(_norm(frozenset((-x, y) for x, y in c)))

%o c = _norm(frozenset((-y, x) for x, y in c))

%o return out

%o def _canon(s):

%o return min(tuple(sorted(o)) for o in _orients(s))

%o def a(n, piece=frozenset({(0,0),(0,1),(0,2),(1,0)})):

%o states = {frozenset(_canon(list(_orients(piece))[0]))}

%o O = list(_orients(piece))

%o for _ in range(n - 1):

%o nxt = set()

%o for st in states:

%o xs = [x for x, y in st]; ys = [y for x, y in st]

%o for o in O:

%o ox = [p[0] for p in o]; oy = [p[1] for p in o]

%o for dx in range(min(xs)-max(ox)-1, max(xs)-min(ox)+2):

%o for dy in range(min(ys)-max(oy)-1, max(ys)-min(oy)+2):

%o t = frozenset((p[0]+dx, p[1]+dy) for p in o)

%o if t & st: continue

%o if any((x+1,y) in st or (x-1,y) in st or (x,y+1) in st or (x,y-1) in st for x,y in t):

%o nxt.add(st | t)

%o states = {frozenset(k) for k in {_canon(s) for s in nxt}}

%o return len(states)

%o print([a(n) for n in range(1, 5)]) # 1, 64, 3808, 299773

%o # larger terms by the parallel hash-sharded on-disk method. _Haoyang Xu_

%Y Cf. A390620 (O-column, free polynars), A000105 (free polyominoes); A397019 (I), A397020 (T), A397022 (S), A397023 (A390620 - A000105).

%K nonn,more,hard

%O 1,2

%A _Haoyang Xu_, Jun 13 2026