from math import sqrt from random import randint # returns the greatest divisor and # how many times it goes into num as a list def gd(num): if is_prime(num): return [1, num] else: i = round(num / 2) + 1 while i >= 2: for n in range(2, i + 1): if i * n == num: return [i, n] i -= 1 def list_check(f, nums): for i in nums: if not f(i): return False return True # fermat's primality test, runs ten times def is_prime(x): test_num = 0 for i in range(0, 11): test_num = randint(1, x) if (test_num ** x % x) == (test_num % x): continue else: return False return True def simplify(problem): nums = {} for i in problem: nums[i] = 0 for i in problem: if i != 1: nums[i] += 1 return nums def divisor_count(num): nums = {} problem = [] current_divisors = [] current_divisors = gd(num) for i in current_divisors: problem.append(i) while(list_check(is_prime, problem) == False): for i in range(0, len(problem)): if not is_prime(problem[i]): current_divisors = gd(problem[i]) problem[i] = current_divisors[0] problem.append(current_divisors[1]) nums = simplify(problem) divisors = 1 for k, v in nums.items(): divisors *= v + 1 return divisors def sum(lower, next, f, upper, total): if lower > upper: return total else: sum(next(lower), next, f, upper, total + f(lower)) def pe_12(num, divisors): i = 0 while(divisors < 500): if i % 10 == 0: print(divisors) i += 1 num += 1 divisors = divisor_count(triangle_num(num)) print(num) def triangle_num(x): sum = 0 while x > 0: sum += x x -= 1 return sum