From 17d591c658b45a700d4d6cacaf5147bc423c57e6 Mon Sep 17 00:00:00 2001 From: Philippe Zwietering Date: Sun, 11 Apr 2021 02:14:57 +0200 Subject: [PATCH] For some reason the execution time is very variable, also I learned that sympy isprime exists --- 58/main.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 58/main.py diff --git a/58/main.py b/58/main.py new file mode 100644 index 0000000..0588483 --- /dev/null +++ b/58/main.py @@ -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() \ No newline at end of file