upto(qdigits) = {my(copr30 = select(x -> gcd(x, 30) == 1, [1..30], 1)); ulim = sqrtint(10^(qdigits)); res = List(); t = 0; u = 1000; i = 7; while(i <= ulim, s = i^2; t++; if(t > u, print1(i", "); u += 1000); qd = #digits(i); for(j = qd + 1, qdigits, process(s, j); ); i++; while(gcd(i, 30) > 1, i++); ); listsort(res); res } process(s, n) = {my(i, d = digits(s), x = vector(#d, i, [2, n-1]), w = vector(n)); if(#select(z -> !z, d) > 0, return); x[1] = [1, 1]; x[#d] = [n, n]; w[1] = d[1]; w[n] = d[#d]; forvec(v = x, cw = w; for(i = 2, #d - 1, cw[v[i]] = d[i]; ); fr = fromdigits(cw); if(isprime(fr), listput(res, fr)) , 2 ) }