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
+
1
13
from numpy import sqrt
2
14
3
15
N = 120000
4
16
5
17
6
- def generate_primes (n : int ):
18
+ def generate_primes (n : int ) -> list [bool ]:
19
+ """
20
+ Generates primes boolean array up to n.
21
+ """
7
22
primes = [True ] * (n + 1 )
8
23
primes [0 ] = primes [1 ] = False
9
24
for i in range (2 , int (sqrt (n + 1 )) + 1 ):
@@ -15,7 +30,11 @@ def generate_primes(n: int):
15
30
return primes
16
31
17
32
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
+ """
19
38
f = 1
20
39
for p in primes_list :
21
40
if p > n :
@@ -25,16 +44,23 @@ def rad(n: int, primes_list: list[int]):
25
44
return f
26
45
27
46
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
+ """
29
52
while b :
30
53
a , b = b , a % b
31
54
return a
32
55
33
56
34
57
def solution (c_less : int = 120000 ) -> int :
58
+ """
59
+ Calculates all primes, rads, and then loops over a, b checking the conditions.
60
+
61
+ """
35
62
primes_bool = generate_primes (c_less )
36
63
primes_list = []
37
- print ("primes generated" )
38
64
for i in range (2 , len (primes_bool )):
39
65
if primes_bool [i ]:
40
66
primes_list += [i ]
@@ -46,7 +72,6 @@ def solution(c_less: int = 120000) -> int:
46
72
rads [i ] = rad (i , primes_list )
47
73
48
74
sum_c = 0
49
- print ("start main" )
50
75
for a in range (1 , c_less ):
51
76
rad_a = rads [a ]
52
77
if a % 2 == 1 :
0 commit comments