import math def is_square(apositiveint): """ From: https://stackoverflow.com/a/2489519 """ x = apositiveint // 2 seen = set([x]) while x * x != apositiveint: x = (x + (apositiveint // x)) // 2 if x in seen: return False seen.add(x) return True def canditates(current_value, depth): if depth <= 0: yield current_value else: d = 10 ** depth for i in range(10): for new_value in canditates(current_value - i * d, depth - 2): yield new_value def euler_206(): c = 1929394959697989990 for i, c in enumerate(canditates(c, 17)): if is_square(c): return int(math.sqrt(c)) if __name__ == "__main__": solution = euler_206() print("e206.py: " + str(solution)) assert(solution == 1389019170)