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.

A274640 Counterclockwise square spiral constructed by greedy algorithm, so that each row, column, and diagonal contains distinct numbers.

Original entry on oeis.org

1, 2, 3, 4, 2, 3, 4, 5, 6, 1, 4, 6, 2, 1, 6, 5, 3, 1, 5, 2, 6, 1, 2, 4, 5, 3, 7, 8, 5, 4, 9, 7, 8, 3, 10, 11, 4, 7, 8, 6, 3, 9, 5, 7, 8, 9, 10, 11, 12, 6, 8, 9, 11, 10, 12, 13, 7, 6, 10, 9, 12, 13, 14, 15, 8, 2, 9, 12, 7, 10, 11, 13, 14, 10, 9, 6, 13, 5, 3, 15, 16, 7, 1, 10, 13, 12, 14, 11, 15, 3, 8, 5, 1, 12, 11, 14, 7, 4, 2, 16, 9, 17, 1, 8, 11
Offset: 0

Views

Author

Zak Seidov and Kerry Mitchell, Jun 30 2016

Keywords

Comments

Presumably every row, column, and diagonal is a permutation of the natural numbers, but is there a proof? - N. J. A. Sloane, Jul 10 2016
The n-th cell in the spiral has coordinates x = A174344(n+1), y = A274923(n+1). - N. J. A. Sloane, Jul 11 2016
From Robert G. Wilson v, Dec 25 2016: (Start) [Memo: all these numbers need to decreased by 1, since the offset here is 0. See A324481. - N. J. A. Sloane, Jul 23 2017. Furthermore, the numbers don't seem correct, even after subtracting 1. - N. J. A. Sloane, Jul 04 2019]
Index of first appearance of k = 1,2,3,...: 1, 2, 3, 7, 8, 15, 17, 25, 35, 41, 47, 61, 62, 89, 98, 99, 121, 129, 130, 143, 197, 208, 225, 239, 271, ..., .
1 appears at: 1, 4, 12, 19, 22, 33, 42, 68, 79, 120, 179, 194, 302, 311, 445, 489, 511, 558, 630, 708, 847, 877, 907, ..., .
2 appears at: 2, 5, 9, 16, 48, 52, 70, 73, 88, 95, 110, 146, 280, 291, 309, 327, 488, 605, 656, 681, 735, 778, 1000, ..., .
3 appears at: 3, 6, 10, 23, 29, 36, 56, 76, 97, 105, 153, 168, 184, 252, 338, 437, 457, 670, 818, 906, 953, 967, ..., . (End).

Examples

			The spiral begins:
.
   9--16---2---4---7--14--11--12---1---5---8
   |                                       |
  17   8--15--14--13--12---9--10---6---7   3
   |   |                               |   |
   1   2   4--11--10---3---8---7---9  13  15
   |   |   |                       |   |   |
   8   9   7   3---5---6---1---2   4  12  11
   |   |   |   |               |   |   |   |
  11  12   8   1   2---4---3   6   5  10  14
   |   |   |   |   |       |   |   |   |   |
  15   7   6   5   3   1---2   4   8  11  12
   |   |   |   |   |           |   |   |   |
  14  10   3   2   4---5---6---1   7   9  13
   |   |   |   |                   |   |   |
   7  11   9   6---1---2---4---5---3   8  10
   |   |   |                           |   |
   4  13   5---7---8---9--10--11--12---6   1
   |   |                                   |
  12  14--10---9---6--13---5---3--15--16---7
   |
  10--15---1--12--16---8--14--13--11--18--17
.
The 8 spokes (A274924-A274931) begin:
  E:  1, 2, 4,  8, 11, 12, 16,  9, 19, 24, 22, ...
  NE: 1, 3, 2,  9,  7,  8, 12, 15, 13, 17, 20, ...
  N:  1, 4, 6,  3, 12, 14, 15, 18, 20, 26, 25, ...
  NW: 1, 2, 3,  4,  8,  9,  7, 11, 14, 10, 22, ...
  W:  1, 3, 5,  6,  7, 15, 10, 17, 13, 25, 14, ...
  SW: 1, 4, 6,  5, 14, 10, 11, 23, 16, 18, 21, ...
  S:  1, 5, 2,  9, 13,  8,  7, 11, 10, 17, 19, ...
  SE: 1, 6, 5, 12, 16, 17, 21, 24, 27, 13, 15, ...
		

Crossrefs

Cf. A274641 (the same spiral, but starting with 0 not 1), A174344, A274923.
The 8 spokes are A274924-A274931.
The East-West axis is A275877 (see also A324680), the North-South axis is A276036.
Positions of 1's and 2's give A273059 and A275116.
In the same spirit as the infinite Sudoku array A269526.
Cf. A324481 (position of first n).
Cf. A274821 (the same construction on a hexagonal tiling).

Programs

  • Maple
    #  Maple program from Alois P. Heinz, Jul 12 2016:
    fx:= proc(n) option remember; `if`(n=1, 0, (k->
           fx(n-1)+sin(k*Pi/2))(floor(sqrt(4*(n-2)+1)) mod 4))
         end:
    fy:= proc(n) option remember; `if`(n=1, 0, (k->
           fy(n-1)-cos(k*Pi/2))(floor(sqrt(4*(n-2)+1)) mod 4))
         end:
    b:= proc() 0 end:
    a:= proc(n) local x,y,s,i,t,m;
          x, y:= fx(n+1), fy(n+1);
          if b(x, y) > 0 then b(x, y)
        else s:={};
        for i do t:=b(x+i,y+i); if t>0 then s:=s union {t} else break fi od;
        for i do t:=b(x-i,y-i); if t>0 then s:=s union {t} else break fi od;
        for i do t:=b(x+i,y-i); if t>0 then s:=s union {t} else break fi od;
        for i do t:=b(x-i,y+i); if t>0 then s:=s union {t} else break fi od;
        for i do t:=b(x+i,y  ); if t>0 then s:=s union {t} else break fi od;
        for i do t:=b(x-i,y  ); if t>0 then s:=s union {t} else break fi od;
        for i do t:=b(x  ,y+i); if t>0 then s:=s union {t} else break fi od;
        for i do t:=b(x  ,y-i); if t>0 then s:=s union {t} else break fi od;
             for m while m in s do od;
             b(x,y):= m
          fi
        end:
    seq(a(n), n=0..1000);
  • Mathematica
    fx[n_] := fx[n] = If[n == 1, 0, Function[k, fx[n-1] + Sin[k*Pi/2]][Mod[Floor[Sqrt[4*(n-2)+1]], 4]]]; fy[n_] := fy[n] = If[n == 1, 0, Function[k, fy[n-1] - Cos[k*Pi/2]][Mod[Floor[Sqrt[4*(n-2)+1]], 4]]]; Clear[b]; b[, ] = 0; a[n_] := Module[{x, y, s, i, t, m}, {x, y} = {fx[n+1], fy[n+1]}; If[b[x, y] > 0, b[x, y], s = {};
    For[i=1, True, i++, t=b[x+i, y+i]; If[t>0, s=Union[s,{t}], Break[]]];
    For[i=1, True, i++, t=b[x-i, y-i]; If[t>0, s=Union[s,{t}], Break[]]];
    For[i=1, True, i++, t=b[x+i, y-i]; If[t>0, s=Union[s,{t}], Break[]]];
    For[i=1, True, i++, t=b[x-i, y+i]; If[t>0, s=Union[s,{t}], Break[]]];
    For[i=1, True, i++, t=b[x+i, y  ]; If[t>0, s=Union[s,{t}], Break[]]];
    For[i=1, True, i++, t=b[x-i, y  ]; If[t>0, s=Union[s,{t}], Break[]]];
    For[i=1, True, i++, t=b[x  , y+i]; If[t>0, s=Union[s,{t}], Break[]]];
    For[i=1, True, i++, t=b[x  , y-i]; If[t>0, s=Union[s,{t}], Break[]]];
    m = 1; While[MemberQ[s, m], m++]; b[x, y] = m]]; Table[a[n], {n, 0, 1000}] (* Jean-François Alcover, Nov 14 2016, after Alois P. Heinz *)
  • Python
    class Lines: # manage lines in direction d = dx + dy*1j
        def _init_(self, d):
            self.lines={}; self.t = d.real/d.imag if d.imag else None
        def _call_(self, pos): # Return the line through pos in direction d
            index = pos.imag if self.t is None else pos.real - pos.imag*self.t
            if index not in self.lines: self.lines[index] = Values()
            return self.lines[index]
    class Values(set): # the set of used numbers on a given line
        def next(self, n): # return least k >= n not on this line
            return min(m+1 for m in self if m+1 >= n and m+1 not in self
                       ) if n in self else n
    def A274640(): # generator of the sequence, see below for possible usage
        lines = [Lines(d) for d in (1, 1+1j, 1j, 1-1j)]; pos = 0
        for side in range(9**9):
            for _ in range(side//2 + 1):
                n = 1; lines_here = [L(pos) for L in lines]
                while any(n < (n := L.next(n)) for L in lines_here): pass
                yield n; any(L.add(n) for L in lines_here); pos += 1j**side
    [a for a,A274640(),range(99))%5D%20%23%20_M.%20F.%20Hasler"> in zip(A274640(),range(99))] # _M. F. Hasler, Feb 01 2025

Extensions

Corrected and extended by Alois P. Heinz, Jul 12 2016