1+ """
2+ Project Euler Problem 127: https://projecteuler.net/problem=127
3+
4+ abc-hits
5+
6+ It takes about 10 minutes to run.
7+ 'Brute-force' solution that uses the following simplifications:
8+ - if gcd(a, b) = 1 then gcd(a, c) = 1 and gcd(b, c) = 1
9+ - rad(a*b*c) = rad(a) * rad(b) * rad(c), for gcd(a, b) = 1
10+ - if a is even, b cannot b even for gcd(a, b) = 1 to be true.
11+ """
12+
113from numpy import sqrt
214
315N = 120000
416
517
6- def generate_primes (n : int ):
18+ def generate_primes (n : int ) -> list [bool ]:
19+ """
20+ Generates primes boolean array up to n.
21+ """
722 primes = [True ] * (n + 1 )
823 primes [0 ] = primes [1 ] = False
924 for i in range (2 , int (sqrt (n + 1 )) + 1 ):
@@ -15,7 +30,11 @@ def generate_primes(n: int):
1530 return primes
1631
1732
18- def rad (n : int , primes_list : list [int ]):
33+ def rad (n : int , primes_list : list [int ]) -> int :
34+ """
35+ Calculated rad - product of unique prime factors for n, using prime numbers
36+ list primes_list.
37+ """
1938 f = 1
2039 for p in primes_list :
2140 if p > n :
@@ -25,16 +44,23 @@ def rad(n: int, primes_list: list[int]):
2544 return f
2645
2746
28- def gcd (a : int , b : int ):
47+ def gcd (a : int , b : int ) -> int :
48+ """
49+ Calculates greatest common divisor of a and b.
50+
51+ """
2952 while b :
3053 a , b = b , a % b
3154 return a
3255
3356
3457def solution (c_less : int = 120000 ) -> int :
58+ """
59+ Calculates all primes, rads, and then loops over a, b checking the conditions.
60+
61+ """
3562 primes_bool = generate_primes (c_less )
3663 primes_list = []
37- print ("primes generated" )
3864 for i in range (2 , len (primes_bool )):
3965 if primes_bool [i ]:
4066 primes_list += [i ]
@@ -46,7 +72,6 @@ def solution(c_less: int = 120000) -> int:
4672 rads [i ] = rad (i , primes_list )
4773
4874 sum_c = 0
49- print ("start main" )
5075 for a in range (1 , c_less ):
5176 rad_a = rads [a ]
5277 if a % 2 == 1 :
0 commit comments