-
Notifications
You must be signed in to change notification settings - Fork 0
/
euler_p58.py
44 lines (40 loc) · 1.48 KB
/
euler_p58.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#Euler - problem 58
"""
Starting with 1 and spiralling anticlockwise in the following way, a square spiral with side length 7 is formed.
37 36 35 34 33 32 31
38 17 16 15 14 13 30
39 18 5 4 3 12 29
40 19 6 1 2 11 28
41 20 7 8 9 10 27
42 21 22 23 24 25 26
43 44 45 46 47 48 49
It is interesting to note that the odd squares lie along the bottom right diagonal, but what is more interesting
is that 8 out of the 13 numbers lying along both diagonals are prime; that is, a ratio of 8/13 ≈ 62%.
If one complete new layer is wrapped around the spiral above, a square spiral with side length 9 will be formed.
If this process is continued, what is the side length of the square spiral for which the ratio of primes along both
diagonals first falls below 10%?
"""
#IDEA: diagonal elements are 1, 3, 5, 7, 9, 13, 17, 21, 25, 31, 37, ...
# therefore, increment the progression by 2 after every four numbers
def isPrime(num):
if num in [2, 3, 5, 7, 11, 13, 17, 19, 23]:
return True
elif num%2 == 0: return False
elif num%3 == 0: return False
else:
i = 5
k = 2
while i**2 <= num:
if num%i == 0: return False
i += k
k = 6 - k
return True
ratio = 0
nprimes, primeratio = 0, 1
spiralsize = 1
while primeratio > 0.1:
spiralsize += 2
ratio += 2
nprimes += sum([isPrime((spiralsize - 2)**2 + ratio*i) for i in range(1, 4)])
primeratio = nprimes/(2*spiralsize - 1)
print(str(spiralsize) + ' : ' + str(primeratio))