1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| import doctest
from math import sqrt
import sys
import unittest
def sieve_of_eratosthenes(n):
"""
Return the prime numbers from 2 to n.
Algorithm: sieve of Eratosthenes
https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
>>> sieve_of_eratosthenes(10)
[2, 3, 5, 7]
>>> sieve_of_eratosthenes(11)
[2, 3, 5, 7, 11]
"""
assert isinstance(n, int)
assert n >= 1
primeness_list = [False, False] + [True] * (n - 1)
for number in range(2, int(sqrt(n)) + 1):
the_number_is_prime = primeness_list[number]
if not the_number_is_prime:
continue
for multiple_of_number in range(number*2, n+1, number):
primeness_list[multiple_of_number] = False
return [number for number, is_prime in enumerate(primeness_list) if is_prime]
class Test(unittest.TestCase):
def test(self):
self.assertEqual(sieve_of_eratosthenes(1), [])
self.assertEqual(sieve_of_eratosthenes(2), [2])
self.assertEqual(
sieve_of_eratosthenes(100),
[
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
53, 59, 61, 67, 71, 73, 79, 83, 89, 97
]
)
if __name__ == "__main__":
failure_count, _ = doctest.testmod()
if failure_count != 0:
sys.exit(1)
unittest.main() |
Partager