1
1
import math
2
2
from collections .abc import Generator
3
-
4
-
5
- def slow_primes (max_n : int ) -> Generator [int , None , None ]:
6
- """
7
- Return a list of all primes numbers up to max.
8
- >>> list(slow_primes(0))
9
- []
10
- >>> list(slow_primes(-1))
11
- []
12
- >>> list(slow_primes(-10))
13
- []
14
- >>> list(slow_primes(25))
15
- [2, 3, 5, 7, 11, 13, 17, 19, 23]
16
- >>> list(slow_primes(11))
17
- [2, 3, 5, 7, 11]
18
- >>> list(slow_primes(33))
19
- [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
20
- >>> list(slow_primes(1000))[-1]
21
- 997
22
- """
23
- numbers : Generator = (i for i in range (1 , (max_n + 1 )))
24
- for i in (n for n in numbers if n > 1 ):
25
- for j in range (2 , i ):
26
- if (i % j ) == 0 :
27
- break
28
- else :
29
- yield i
30
-
31
-
32
- def primes (max_n : int ) -> Generator [int , None , None ]:
33
- """
34
- Return a list of all primes numbers up to max.
35
- >>> list(primes(0))
36
- []
37
- >>> list(primes(-1))
38
- []
39
- >>> list(primes(-10))
40
- []
41
- >>> list(primes(25))
42
- [2, 3, 5, 7, 11, 13, 17, 19, 23]
43
- >>> list(primes(11))
44
- [2, 3, 5, 7, 11]
45
- >>> list(primes(33))
46
- [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
47
- >>> list(primes(1000))[-1]
48
- 997
49
- """
50
- numbers : Generator = (i for i in range (1 , (max_n + 1 )))
51
- for i in (n for n in numbers if n > 1 ):
52
- # only need to check for factors up to sqrt(i)
53
- bound = int (math .sqrt (i )) + 1
54
- for j in range (2 , bound ):
55
- if (i % j ) == 0 :
56
- break
57
- else :
58
- yield i
59
-
60
-
61
3
def fast_primes (max_n : int ) -> Generator [int , None , None ]:
62
4
"""
63
5
Return a list of all primes numbers up to max.
@@ -76,19 +18,14 @@ def fast_primes(max_n: int) -> Generator[int, None, None]:
76
18
>>> list(fast_primes(1000))[-1]
77
19
997
78
20
"""
79
- numbers : Generator = (i for i in range (1 , (max_n + 1 ), 2 ))
80
- # It's useless to test even numbers as they will not be prime
81
- if max_n > 2 :
82
- yield 2 # Because 2 will not be tested, it's necessary to yield it now
83
- for i in (n for n in numbers if n > 1 ):
84
- bound = int (math .sqrt (i )) + 1
85
- for j in range (3 , bound , 2 ):
86
- # As we removed the even numbers, we don't need them now
87
- if (i % j ) == 0 :
88
- break
89
- else :
90
- yield i
91
-
21
+ #it is useless to calculate who is already 2 multiple
22
+ def countPrimes (self , max_n : int ) -> int :
23
+ seen , ans = [0 ] * max_n , 0
24
+ for num in range (2 , max_n ):
25
+ if seen [num ]: continue
26
+ ans += 1
27
+ seen [num * num :n :num ] = [1 ] * ((max_n - 1 ) // num - num + 1 )
28
+ return ans
92
29
93
30
def benchmark ():
94
31
"""
0 commit comments