mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
bc8df6de31
* [pre-commit.ci] pre-commit autoupdate updates: - [github.com/astral-sh/ruff-pre-commit: v0.2.2 → v0.3.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.2.2...v0.3.2) - [github.com/pre-commit/mirrors-mypy: v1.8.0 → v1.9.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.8.0...v1.9.0) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
"""
|
|
Project Euler Problem 35
|
|
https://projecteuler.net/problem=35
|
|
|
|
Problem Statement:
|
|
|
|
The number 197 is called a circular prime because all rotations of the digits:
|
|
197, 971, and 719, are themselves prime.
|
|
There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73,
|
|
79, and 97.
|
|
How many circular primes are there below one million?
|
|
|
|
To solve this problem in an efficient manner, we will first mark all the primes
|
|
below 1 million using the Sieve of Eratosthenes. Then, out of all these primes,
|
|
we will rule out the numbers which contain an even digit. After this we will
|
|
generate each circular combination of the number and check if all are prime.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
sieve = [True] * 1000001
|
|
i = 2
|
|
while i * i <= 1000000:
|
|
if sieve[i]:
|
|
for j in range(i * i, 1000001, i):
|
|
sieve[j] = False
|
|
i += 1
|
|
|
|
|
|
def is_prime(n: int) -> bool:
|
|
"""
|
|
For 2 <= n <= 1000000, return True if n is prime.
|
|
>>> is_prime(87)
|
|
False
|
|
>>> is_prime(23)
|
|
True
|
|
>>> is_prime(25363)
|
|
False
|
|
"""
|
|
return sieve[n]
|
|
|
|
|
|
def contains_an_even_digit(n: int) -> bool:
|
|
"""
|
|
Return True if n contains an even digit.
|
|
>>> contains_an_even_digit(0)
|
|
True
|
|
>>> contains_an_even_digit(975317933)
|
|
False
|
|
>>> contains_an_even_digit(-245679)
|
|
True
|
|
"""
|
|
return any(digit in "02468" for digit in str(n))
|
|
|
|
|
|
def find_circular_primes(limit: int = 1000000) -> list[int]:
|
|
"""
|
|
Return circular primes below limit.
|
|
>>> len(find_circular_primes(100))
|
|
13
|
|
>>> len(find_circular_primes(1000000))
|
|
55
|
|
"""
|
|
result = [2] # result already includes the number 2.
|
|
for num in range(3, limit + 1, 2):
|
|
if is_prime(num) and not contains_an_even_digit(num):
|
|
str_num = str(num)
|
|
list_nums = [int(str_num[j:] + str_num[:j]) for j in range(len(str_num))]
|
|
if all(is_prime(i) for i in list_nums):
|
|
result.append(num)
|
|
return result
|
|
|
|
|
|
def solution() -> int:
|
|
"""
|
|
>>> solution()
|
|
55
|
|
"""
|
|
return len(find_circular_primes())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print(f"{len(find_circular_primes()) = }")
|