'''--------------------------------------------------------------- This program prints all excellent numbers of a given length ... ... is "excellent": when split on half m=ab, b*b – a*a = m. For example, 48 is excellent, because 8**2 - 4**2 == 48. [ link ] I take advantage of the fact that, with n = length/2, we can rewrite m to be a*10**n + b, set the two m's equal to another, simplify to b * b – b == a * (a + 10**n), and solve for b: 1 + sqrt[4a^2 + 4(10^n)a + 1] b = ----------------------------- 2 So we loop through all values for a with n digits, find its b, and see if b is an integer. In Python: ---------------------------------------------------------------''' from is_excellent import is_excellent import sys def EXP(base, exp): return base ** exp def SQRT(n): return n ** 0.5 def EVEN(n): #return (n == int(n)) and ((int(n) % 2) == 0) return n == 2 * (int(n) // 2) def IS_ROOT(r, n): return n == r*r ''' for a in range(lower, 10*lower): b = ((4*a**2+400000*a+1)**0.5+1) / 2.0 if b == int(b): result = int(str(a)+str(int(b))) print(result) THEN for a in range(lower, 10*lower): b1 = SQRT(4*EXP(a, 2)+4*EXP(10, n)*a+1) + 1 print('candidate', b1) if EVEN(b1): b = b1 / 2.0 result = int(a * EXP(10, n) + b) # int(str(a)+str(int(b))) print(result) ''' def print_candidate_and_continue(a, n, upper, candidate): print(candidate) return a_loop(a+1, n, upper) def a_loop_3(a, n, upper, det, root, candidate): if IS_ROOT(root, det) and EVEN(root + 1) and is_excellent(candidate): print_candidate_and_continue(a, n, upper, candidate) else: return a_loop(a+1, n, upper) def a_loop_2(a, n, upper, det, root): a_loop_3(a, n, upper, det, root, int(a * EXP(10, n) + ((root + 1) / 2.0))) def a_loop_1(a, n, upper, det): a_loop_2(a, n, upper, det, SQRT(det)) def a_loop(a, n, upper): if a < upper: a_loop_1(a, n, upper, 4*EXP(a, 2) + 4*EXP(10, n)*a + 1) def create_loop(a, n): a_loop(a, n, 10*a) # ---------------------------------------------------------------- sys.setrecursionlimit(50000) # for 8-digit numbers, still crashes Python length = int(sys.argv[1]) # 6 # int(sys.argv[1]) n = length // 2 lower = EXP(10, n-1) create_loop(lower, n) # ----------------------------------------------------------------