Rebased projecteuler folder, now includes all contest programming stuff
This commit is contained in:
67
projecteuler/058/main.py
Normal file
67
projecteuler/058/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