\\ n -> "digits" (least significant first) encode(n) = { my (d=[]); for (r=2, oo, if (n==0, return (d), d = concat(d, n%r); n\=r; ); ); } \\ "digits" -> n decode(d) = { sum(k=1, #d, d[k]*k!) } \\ lunar addition A(n, k) = { my (nn=encode(n), kk=encode(k)); decode(vector(max(#nn, #kk), i, max(if (i<=#nn, nn[i], 0), if (i<=#kk, kk[i], 0)))) } \\ lunar multiplication M(n, k) = { my (nn=encode(n), kk=encode(k), vv=vector(max(0, #nn+#kk-1))); for (i=1, #nn, for (j=1, #kk, vv[i+j-1] = max(vv[i+j-1], min(nn[i], kk[j])); ); ); decode(vv); } a(n) = M(n, n) for (n=0, 7!-1, print (n " " a(n))) quit