R = [ [1,0], [2,1], [3,3], [0,1] ] W = 200 reset() = { G = vector(#R, r, gcd(R[r][1],R[r][2])); MIX = vector(#R, r, vector(G[r], g, vector(1+W*(R[r][1]+R[r][2])))); } \\ /!\ 1 <= x <= W, 1 <= y <= W find(x,y) = { my (mix=0, g=vector(#R), m=vector(#R)); for (r=1, #R, g[r] = 1+if (G[r]==1, 0, R[r][1]==0, y%R[r][2], floor(x/(R[r][1]/G[r]))%G[r]); m[r] = 1+(W-x)*R[r][2]+y*R[r][1]; mix = bitor(mix, MIX[r][g[r]][m[r]]); ); my (v=valuation(mix+1,2)); for (r=1, #R, MIX[r][g[r]][m[r]] = bitor(MIX[r][g[r]][m[r]], 2^v); ); return (v); } { reset(); my (n=-1); for (d=1, W, for (y=1, d, my (x=d+1-y); print (n++ " " find(x,y)); ); ); } quit