Python Implementation of Problem 58

View source code here on GitHub!

Includes

Problem Solution

Project Euler Problem 58

Problem:

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%?

python.src.p0058.main() int
 1"""
 2Project Euler Problem 58
 3
 4Problem:
 5
 6Starting with 1 and spiralling anticlockwise in the following way, a square spiral with side length 7 is formed.
 7
 837 36 35 34 33 32 31
 938 17 16 15 14 13 30
1039 18  5  4  3 12 29
1140 19  6  1  2 11 28
1241 20  7  8  9 10 27
1342 21 22 23 24 25 26
1443 44 45 46 47 48 49
15
16It is interesting to note that the odd squares lie along the bottom right diagonal, but what is more interesting is
17that 8 out of the 13 numbers lying along both diagonals are prime; that is, a ratio of 8/13 ≈ 62%.
18
19If one complete new layer is wrapped around the spiral above, a square spiral with side length 9 will be formed. If
20this process is continued, what is the side length of the square spiral for which the ratio of primes along both
21diagonals first falls below 10%?
22"""
23from itertools import count
24
25from .lib.iters import spiral_corners
26from .lib.primes import is_prime
27
28
29def main() -> int:
30    total = 1
31    primes = 0
32    for x in count(1):
33        for p in spiral_corners(x)[:3]:  # last one is a square always
34            if is_prime(p):
35                primes += 1
36        total += 4
37        if primes < total / 10:
38            return 2 * x + 1
39    return -1  # pragma: no cover

Tags: grid-pattern, prime-number, python-iterator