move(z) = { my (w=max(abs(real(z)), abs(imag(z)))); if (imag(z)==-w, z+1, real(z)==-w, z-I, imag(z)==+w, z-1, z+I); } index(z) = { my (x=real(z), y=imag(z)); if (x>abs(y), ((2*x-1)^2) + (x+y-1), x>y, 2*-y*(1-2*y) + (x-y), y>=abs(x), 2*y*(2*y-1) + (y-x), (4*x^2) + (-y-x) ) + 1; } big = 1 000 000 s = 0 S = [] unseen = 1 seen(v) = if (v < big, bittest(s, v), setsearch(S, v)) see(v) = if (v < big, s = bitor(s, 2^v), S = setunion(S, [v])); while (seen(unseen), unseen++) M = 50 T = matrix(2*M+1, 2*M+1) out(z) = min(real(z), imag(z)) < -M || max(real(z), imag(z)) > +M get(z) = if (out(z), 0, T[1+M+real(z), 1+M+imag(z)]) set(z, v) = T[1+M+real(z), 1+M+imag(z)] = v dz = powers(I, 3) dz = concat(dz * (2+I), dz * (2-I)) { n = 0; z = 0; while (!out(z), x = 1; for (k = 1, #dz, x *= max(1, get(z + dz[k])); ); for (v = unseen, oo, if (!seen(v) && gcd(x, v)==1, see(v); set(z, v); print (n++ " " v); break; ); ); z = move(z); ); }