uptoqdigits(n) = { qchecks = 0; maxqd = n; pd = vector(n+1, i, possibledigits(i)); pow10s = vector(n, i, 10^(i)); my(i); res = List(); for(i = 1, 9, process(i, 1); print(qchecks); ); Set(res); } process(n, qd) = { qchecks++; if(issquare(n), listput(res, n); ); if(!issquare(Mod(n, 10^(qd))), return ); my(cn, cqd = qd + 1, i); if(qd >= maxqd, return ); for(i = 1, #pd[qd+1], cn = pow10s[qd] * pd[qd+1][i] + n; process(cn, cqd) ); } possibledigits(n) = { if(n == 1, return([1..9])); my(d = divisors(n), res = List()); if(d[2] > 9, return(List([1])); ); for(i = 2, #d, if(d[i] < 10, listput(res, d[i]) , break ) ); for(i = 2, 9\n, listput(res, n*i); ); res }