Use prime factor util in 12 and move divisors code into util

This commit is contained in:
Linus Miller 2018-03-29 12:05:17 +02:00
parent 40158db6a1
commit 39030caf40
2 changed files with 49 additions and 41 deletions

66
0012.py
View File

@ -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 collections import Counter
from functools import reduce from functools import reduce
import util
def find_prime_factors(n): target = 76576500
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
for i in range(1, 100000): for i in range(1, 100000):
result = reduce(lambda x,y: x + y, list(range(1, i + 1))) result = reduce(lambda x,y: x + y, list(range(1, i + 1)))
# divisers = find_divisers(result) # divisers = find_divisers(result)
factors = find_prime_factors(result) factors = util.find_prime_factors(result)
total_count = 1 total_count = 1
@ -52,7 +35,8 @@ for i in range(1, 100000):
total_count *= count + 1 total_count *= count + 1
if (total_count >= 500): if (total_count >= 500):
print(i) # print(i)
# print(total_count)
print(result) print(result)
print(total_count) print(result == target)
break break

24
util.py
View File

@ -1,5 +1,29 @@
from collections import Counter
from functools import reduce 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): def find_largest_prime_factor(n):
prime_factor = 1 prime_factor = 1
factors.append(prime_factor) factors.append(prime_factor)