big = 1 000 000 s = 0 S = Set([]) unseen = 1 seen(v) = if (v < big, bit test(s, v), set search(S, v)) see(v) = if (v < big, s = bit or(s, 2^v), S = set union(S, Set([v]))); while (seen(unseen), unseen++) tr(v)=if (v>=0, 1+2*v, -2*v) row = vector(1+2*M=50, k, 1) col = vector(#row, k, 1) 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); } rad(n) = my (f=factor(n)); prod (k=1, #f~, f[k,1]) { n=0; z=0; while (max(abs(x=real(z)), abs(y=imag(z)))<=M, prv = col[tr(x)] * row[tr(y)]; forstep (v=if (prv%2==0, unseen + (unseen%2==0), unseen), oo, if (prv%2==0, 2, 1), if (!seen(v) && gcd(prv, v)==1, print (n++ " " v); see(v); col[tr(x)] *= r=rad(v); row[tr(y)] *= r; break; ); ); z=move(z); ); } quit