From 1f09714d469bd8f7ea832c4bdbb357a6f7b9d34c Mon Sep 17 00:00:00 2001 From: felixm Date: Sat, 20 Apr 2024 15:19:37 -0400 Subject: [PATCH] Solve problem 203. --- python/e203.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 python/e203.py diff --git a/python/e203.py b/python/e203.py new file mode 100644 index 0000000..e28513e --- /dev/null +++ b/python/e203.py @@ -0,0 +1,55 @@ +from lib_prime import primes +from math import sqrt + + +def pascal_numbers_till(row): + def pascal_next(xs): + r = [xs[0]] + for i in range(len(xs) - 1): + r.append(xs[i] + xs[i + 1]) + r.append(xs[-1]) + return r + + all = set([1]) + xs = [1] + for _ in range(row - 1): + xs = pascal_next(xs) + all |= set(xs) + return sorted(list(set(all))) + + +def is_square_free(ps, n): + for p in ps: + if n % p == 0: + return False + return True + + +def solve(n): + r = 0 + pascals = pascal_numbers_till(n) + ps = [p * p for p in primes(int(sqrt(max(pascals))))] + for n in pascals: + if is_square_free(ps, n): + r += n + return r + + +def test(): + assert pascal_numbers_till(1) == [1] + assert pascal_numbers_till(2) == [1] + assert pascal_numbers_till(3) == [1, 2] + assert pascal_numbers_till(8) == [1, 2, 3, 4, 5, 6, 7, 10, 15, 20, 21, 35] + assert solve(8) == 105 + + +def euler_203(): + test() + return solve(51) + + +if __name__ == "__main__": + solution = euler_203() + print("e203.py: " + str(solution)) + assert solution == 34029210557338 +