67 lines
1.8 KiB
Python
67 lines
1.8 KiB
Python
'''
|
|
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%?
|
|
'''
|
|
|
|
import time
|
|
import math
|
|
import numpy as np
|
|
from sympy import isprime
|
|
|
|
def sieve(n):
|
|
assert n > 1
|
|
|
|
ns = [True] * n
|
|
|
|
for i in range(2, math.ceil(np.sqrt(n))):
|
|
if ns[i]:
|
|
j = pow(i, 2)
|
|
|
|
while j < n:
|
|
ns[j] = False
|
|
j = j + i
|
|
|
|
return [i for i,val in enumerate(ns) if val][2:]
|
|
|
|
def corners(n):
|
|
if n == 1:
|
|
return [1]
|
|
|
|
layer = list(range((n*2-3)**2+1, (n*2-1)**2+1))
|
|
cList = []
|
|
for i in range(4):
|
|
cList.append(layer[-1 - (2*n-2)*i])
|
|
|
|
return cList
|
|
|
|
def main():
|
|
print("Hello, this is Patrick")
|
|
t0 = time.time()
|
|
|
|
# primes = set(sieve(1000000000))
|
|
numberPrimes = 0
|
|
n = 2
|
|
|
|
while True:
|
|
cs = corners(n)
|
|
for c in cs:
|
|
if isprime(c):
|
|
numberPrimes += 1
|
|
if numberPrimes / ((n-1)*4 + 1) < 0.1:
|
|
print(n*2-1, time.time() - t0)
|
|
break
|
|
n += 1
|
|
|
|
if __name__ == "__main__":
|
|
main() |