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