# (c) GPL by kirby urner, 4d solutions def getmaxroot(n): for i in range(9,0,-1): if i*i <= n: return i def getpairs(n): sn = str(n) if len(sn)%2: yield sn[0:1] sn = sn[1:] + '00' while True: yield sn[0:2] sn = sn[2:] + '00' def root2(n): g = getpairs(n) pair = g.next() root = getmaxroot(int(pair)) newval = int(str(int(pair)-root*root) + g.next()) ans = str(root) while True: yield ans prefix = str(2*int(ans)) for i in range(9,-1,-1): value = int(prefix + str(i)) * i if value <= newval: break ans += str(i) newval = int(str(int(newval)-value) + g.next()) def test(val): gen = root2(val) for i in range(30): ans = gen.next() return "Value = %s ans = %s, ans * ans = %s" % (val, ans, int(ans) * int(ans))