From 39030caf409b02966909400314590d524d7e99a2 Mon Sep 17 00:00:00 2001 From: Linus Miller Date: Thu, 29 Mar 2018 12:05:17 +0200 Subject: [PATCH] Use prime factor util in 12 and move divisors code into util --- 0012.py | 66 ++++++++++++++++++++++----------------------------------- util.py | 24 +++++++++++++++++++++ 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/0012.py b/0012.py index 1e0975b..f2517ec 100644 --- a/0012.py +++ b/0012.py @@ -1,50 +1,33 @@ +# Highly divisible triangular number +# Problem 12 +# The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be: + +# 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... + +# Let us list the factors of the first seven triangle numbers: + +# 1: 1 +# 3: 1,3 +# 6: 1,2,3,6 +# 10: 1,2,5,10 +# 15: 1,3,5,15 +# 21: 1,3,7,21 +# 28: 1,2,4,7,14,28 +# We can see that 28 is the first triangle number to have over five divisors. + +# What is the value of the first triangle number to have over five hundred divisors? + from collections import Counter from functools import reduce +import util -def find_prime_factors(n): - factors = [] - - i = 2 - - while i <= n / i: - if n % i == 0: - factors.append(i) - n = int(n / i) - else: - i += 1 - - factors.append(n) - - return factors - -def find_divisers(num): - def recurse(tuples, product = 1): - factor, count = tuples[0] - - for i in range(0, count + 1): - if (i != 0): - product = product * factor - - if (len(tuples) > 1): - recurse(tuples[1:], product) - else: - result.append(product) - - factors = find_prime_factors(num) - - - recurse(list(Counter(factors).items())) - - result.sort() - - return result - +target = 76576500 for i in range(1, 100000): result = reduce(lambda x,y: x + y, list(range(1, i + 1))) # divisers = find_divisers(result) - factors = find_prime_factors(result) + factors = util.find_prime_factors(result) total_count = 1 @@ -52,7 +35,8 @@ for i in range(1, 100000): total_count *= count + 1 if (total_count >= 500): - print(i) + # print(i) + # print(total_count) print(result) - print(total_count) + print(result == target) break diff --git a/util.py b/util.py index 6c63983..43c68da 100644 --- a/util.py +++ b/util.py @@ -1,5 +1,29 @@ +from collections import Counter from functools import reduce +def divisors(num): + result = [] + def recurse(tuples, product = 1): + factor, count = tuples[0] + + for i in range(0, count + 1): + if (i != 0): + product = product * factor + + if (len(tuples) > 1): + recurse(tuples[1:], product) + else: + result.append(product) + + factors = find_prime_factors(num) + + recurse(list(Counter(factors).items())) + + result.sort() + + return result + + def find_largest_prime_factor(n): prime_factor = 1 factors.append(prime_factor)