For some reason the execution time is very variable, also I learned that sympy isprime exists
This commit is contained in:
67
58/main.py
Normal file
67
58/main.py
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
'''
|
||||||
|
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()
|
||||||
Reference in New Issue
Block a user