Files
contests/058/main.py

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()