Skip to content

Commit 2104fa7

Browse files
ngiachoupoyea
andauthoredSep 14, 2022
Unify O(sqrt(N)) is_prime functions under project_euler (TheAlgorithms#6258)
* fixes TheAlgorithms#5434 * fixes broken solution * removes assert * removes assert * Apply suggestions from code review Co-authored-by: John Law <johnlaw.po@gmail.com> * Update project_euler/problem_003/sol1.py Co-authored-by: John Law <johnlaw.po@gmail.com>
1 parent 81e30fd commit 2104fa7

File tree

12 files changed

+310
-132
lines changed

12 files changed

+310
-132
lines changed
 

Diff for: ‎project_euler/problem_003/sol1.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import math
1414

1515

16-
def is_prime(num: int) -> bool:
17-
"""
18-
Returns boolean representing primality of given number num.
16+
def is_prime(number: int) -> bool:
17+
"""Checks to see if a number is a prime in O(sqrt(n)).
18+
A number is prime if it has exactly two factors: 1 and itself.
19+
Returns boolean representing primality of given number (i.e., if the
20+
result is true, then the number is indeed prime else it is not).
1921
2022
>>> is_prime(2)
2123
True
@@ -26,23 +28,21 @@ def is_prime(num: int) -> bool:
2628
>>> is_prime(2999)
2729
True
2830
>>> is_prime(0)
29-
Traceback (most recent call last):
30-
...
31-
ValueError: Parameter num must be greater than or equal to two.
31+
False
3232
>>> is_prime(1)
33-
Traceback (most recent call last):
34-
...
35-
ValueError: Parameter num must be greater than or equal to two.
33+
False
3634
"""
3735

38-
if num <= 1:
39-
raise ValueError("Parameter num must be greater than or equal to two.")
40-
if num == 2:
36+
if 1 < number < 4:
37+
# 2 and 3 are primes
4138
return True
42-
elif num % 2 == 0:
39+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
40+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
4341
return False
44-
for i in range(3, int(math.sqrt(num)) + 1, 2):
45-
if num % i == 0:
42+
43+
# All primes number are in format of 6k +/- 1
44+
for i in range(5, int(math.sqrt(number) + 1), 6):
45+
if number % i == 0 or number % (i + 2) == 0:
4646
return False
4747
return True
4848

Diff for: ‎project_euler/problem_007/sol1.py

+20-12
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,37 @@
1515
from math import sqrt
1616

1717

18-
def is_prime(num: int) -> bool:
19-
"""
20-
Determines whether the given number is prime or not
18+
def is_prime(number: int) -> bool:
19+
"""Checks to see if a number is a prime in O(sqrt(n)).
20+
A number is prime if it has exactly two factors: 1 and itself.
21+
Returns boolean representing primality of given number (i.e., if the
22+
result is true, then the number is indeed prime else it is not).
2123
2224
>>> is_prime(2)
2325
True
24-
>>> is_prime(15)
26+
>>> is_prime(3)
27+
True
28+
>>> is_prime(27)
2529
False
26-
>>> is_prime(29)
30+
>>> is_prime(2999)
2731
True
2832
>>> is_prime(0)
2933
False
34+
>>> is_prime(1)
35+
False
3036
"""
3137

32-
if num == 2:
38+
if 1 < number < 4:
39+
# 2 and 3 are primes
3340
return True
34-
elif num % 2 == 0:
41+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
42+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
3543
return False
36-
else:
37-
sq = int(sqrt(num)) + 1
38-
for i in range(3, sq, 2):
39-
if num % i == 0:
40-
return False
44+
45+
# All primes number are in format of 6k +/- 1
46+
for i in range(5, int(sqrt(number) + 1), 6):
47+
if number % i == 0 or number % (i + 2) == 0:
48+
return False
4149
return True
4250

4351

Diff for: ‎project_euler/problem_007/sol2.py

+23-6
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,39 @@
1111
References:
1212
- https://en.wikipedia.org/wiki/Prime_number
1313
"""
14+
import math
1415

1516

1617
def is_prime(number: int) -> bool:
17-
"""
18-
Determines whether the given number is prime or not
18+
"""Checks to see if a number is a prime in O(sqrt(n)).
19+
A number is prime if it has exactly two factors: 1 and itself.
20+
Returns boolean representing primality of given number (i.e., if the
21+
result is true, then the number is indeed prime else it is not).
1922
2023
>>> is_prime(2)
2124
True
22-
>>> is_prime(15)
25+
>>> is_prime(3)
26+
True
27+
>>> is_prime(27)
2328
False
24-
>>> is_prime(29)
29+
>>> is_prime(2999)
2530
True
31+
>>> is_prime(0)
32+
False
33+
>>> is_prime(1)
34+
False
2635
"""
2736

28-
for i in range(2, int(number**0.5) + 1):
29-
if number % i == 0:
37+
if 1 < number < 4:
38+
# 2 and 3 are primes
39+
return True
40+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
41+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
42+
return False
43+
44+
# All primes number are in format of 6k +/- 1
45+
for i in range(5, int(math.sqrt(number) + 1), 6):
46+
if number % i == 0 or number % (i + 2) == 0:
3047
return False
3148
return True
3249

Diff for: ‎project_euler/problem_007/sol3.py

+23-6
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,37 @@
1616

1717

1818
def is_prime(number: int) -> bool:
19-
"""
20-
Determines whether a given number is prime or not
19+
"""Checks to see if a number is a prime in O(sqrt(n)).
20+
A number is prime if it has exactly two factors: 1 and itself.
21+
Returns boolean representing primality of given number (i.e., if the
22+
result is true, then the number is indeed prime else it is not).
2123
2224
>>> is_prime(2)
2325
True
24-
>>> is_prime(15)
26+
>>> is_prime(3)
27+
True
28+
>>> is_prime(27)
2529
False
26-
>>> is_prime(29)
30+
>>> is_prime(2999)
2731
True
32+
>>> is_prime(0)
33+
False
34+
>>> is_prime(1)
35+
False
2836
"""
2937

30-
if number % 2 == 0 and number > 2:
38+
if 1 < number < 4:
39+
# 2 and 3 are primes
40+
return True
41+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
42+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
3143
return False
32-
return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2))
44+
45+
# All primes number are in format of 6k +/- 1
46+
for i in range(5, int(math.sqrt(number) + 1), 6):
47+
if number % i == 0 or number % (i + 2) == 0:
48+
return False
49+
return True
3350

3451

3552
def prime_generator():

Diff for: ‎project_euler/problem_010/sol1.py

+20-7
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
- https://en.wikipedia.org/wiki/Prime_number
1212
"""
1313

14-
from math import sqrt
14+
import math
1515

1616

17-
def is_prime(n: int) -> bool:
18-
"""
19-
Returns boolean representing primality of given number num.
17+
def is_prime(number: int) -> bool:
18+
"""Checks to see if a number is a prime in O(sqrt(n)).
19+
A number is prime if it has exactly two factors: 1 and itself.
20+
Returns boolean representing primality of given number num (i.e., if the
21+
result is true, then the number is indeed prime else it is not).
2022
2123
>>> is_prime(2)
2224
True
@@ -26,13 +28,24 @@ def is_prime(n: int) -> bool:
2628
False
2729
>>> is_prime(2999)
2830
True
31+
>>> is_prime(0)
32+
False
33+
>>> is_prime(1)
34+
False
2935
"""
3036

31-
if 1 < n < 4:
37+
if 1 < number < 4:
38+
# 2 and 3 are primes
3239
return True
33-
elif n < 2 or not n % 2:
40+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
41+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
3442
return False
35-
return not any(not n % i for i in range(3, int(sqrt(n) + 1), 2))
43+
44+
# All primes number are in format of 6k +/- 1
45+
for i in range(5, int(math.sqrt(number) + 1), 6):
46+
if number % i == 0 or number % (i + 2) == 0:
47+
return False
48+
return True
3649

3750

3851
def solution(n: int = 2000000) -> int:

Diff for: ‎project_euler/problem_010/sol2.py

+19-4
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717

1818
def is_prime(number: int) -> bool:
19-
"""
20-
Returns boolean representing primality of given number num.
19+
"""Checks to see if a number is a prime in O(sqrt(n)).
20+
A number is prime if it has exactly two factors: 1 and itself.
21+
Returns boolean representing primality of given number num (i.e., if the
22+
result is true, then the number is indeed prime else it is not).
2123
2224
>>> is_prime(2)
2325
True
@@ -27,11 +29,24 @@ def is_prime(number: int) -> bool:
2729
False
2830
>>> is_prime(2999)
2931
True
32+
>>> is_prime(0)
33+
False
34+
>>> is_prime(1)
35+
False
3036
"""
3137

32-
if number % 2 == 0 and number > 2:
38+
if 1 < number < 4:
39+
# 2 and 3 are primes
40+
return True
41+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
42+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
3343
return False
34-
return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2))
44+
45+
# All primes number are in format of 6k +/- 1
46+
for i in range(5, int(math.sqrt(number) + 1), 6):
47+
if number % i == 0 or number % (i + 2) == 0:
48+
return False
49+
return True
3550

3651

3752
def prime_generator() -> Iterator[int]:

Diff for: ‎project_euler/problem_027/sol1.py

+29-12
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,39 @@
2323
import math
2424

2525

26-
def is_prime(k: int) -> bool:
27-
"""
28-
Determine if a number is prime
29-
>>> is_prime(10)
26+
def is_prime(number: int) -> bool:
27+
"""Checks to see if a number is a prime in O(sqrt(n)).
28+
A number is prime if it has exactly two factors: 1 and itself.
29+
Returns boolean representing primality of given number num (i.e., if the
30+
result is true, then the number is indeed prime else it is not).
31+
32+
>>> is_prime(2)
33+
True
34+
>>> is_prime(3)
35+
True
36+
>>> is_prime(27)
3037
False
31-
>>> is_prime(11)
38+
>>> is_prime(2999)
3239
True
40+
>>> is_prime(0)
41+
False
42+
>>> is_prime(1)
43+
False
44+
>>> is_prime(-10)
45+
False
3346
"""
34-
if k < 2 or k % 2 == 0:
35-
return False
36-
elif k == 2:
47+
48+
if 1 < number < 4:
49+
# 2 and 3 are primes
3750
return True
38-
else:
39-
for x in range(3, int(math.sqrt(k) + 1), 2):
40-
if k % x == 0:
41-
return False
51+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
52+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
53+
return False
54+
55+
# All primes number are in format of 6k +/- 1
56+
for i in range(5, int(math.sqrt(number) + 1), 6):
57+
if number % i == 0 or number % (i + 2) == 0:
58+
return False
4259
return True
4360

4461

Diff for: ‎project_euler/problem_037/sol1.py

+36-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
"""
2+
Truncatable primes
3+
Problem 37: https://projecteuler.net/problem=37
4+
25
The number 3797 has an interesting property. Being prime itself, it is possible
36
to continuously remove digits from left to right, and remain prime at each stage:
47
3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3.
@@ -11,28 +14,46 @@
1114

1215
from __future__ import annotations
1316

14-
seive = [True] * 1000001
15-
seive[1] = False
16-
i = 2
17-
while i * i <= 1000000:
18-
if seive[i]:
19-
for j in range(i * i, 1000001, i):
20-
seive[j] = False
21-
i += 1
17+
import math
2218

2319

24-
def is_prime(n: int) -> bool:
25-
"""
26-
Returns True if n is prime,
27-
False otherwise, for 1 <= n <= 1000000
28-
>>> is_prime(87)
20+
def is_prime(number: int) -> bool:
21+
"""Checks to see if a number is a prime in O(sqrt(n)).
22+
23+
A number is prime if it has exactly two factors: 1 and itself.
24+
25+
>>> is_prime(0)
2926
False
3027
>>> is_prime(1)
3128
False
32-
>>> is_prime(25363)
29+
>>> is_prime(2)
30+
True
31+
>>> is_prime(3)
32+
True
33+
>>> is_prime(27)
34+
False
35+
>>> is_prime(87)
36+
False
37+
>>> is_prime(563)
38+
True
39+
>>> is_prime(2999)
40+
True
41+
>>> is_prime(67483)
3342
False
3443
"""
35-
return seive[n]
44+
45+
if 1 < number < 4:
46+
# 2 and 3 are primes
47+
return True
48+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
49+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
50+
return False
51+
52+
# All primes number are in format of 6k +/- 1
53+
for i in range(5, int(math.sqrt(number) + 1), 6):
54+
if number % i == 0 or number % (i + 2) == 0:
55+
return False
56+
return True
3657

3758

3859
def list_truncated_nums(n: int) -> list[int]:

Diff for: ‎project_euler/problem_041/sol1.py

+30-10
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,45 @@
1212
"""
1313
from __future__ import annotations
1414

15+
import math
1516
from itertools import permutations
16-
from math import sqrt
1717

1818

19-
def is_prime(n: int) -> bool:
20-
"""
21-
Returns True if n is prime,
22-
False otherwise.
23-
>>> is_prime(67483)
19+
def is_prime(number: int) -> bool:
20+
"""Checks to see if a number is a prime in O(sqrt(n)).
21+
22+
A number is prime if it has exactly two factors: 1 and itself.
23+
24+
>>> is_prime(0)
2425
False
25-
>>> is_prime(563)
26+
>>> is_prime(1)
27+
False
28+
>>> is_prime(2)
2629
True
30+
>>> is_prime(3)
31+
True
32+
>>> is_prime(27)
33+
False
2734
>>> is_prime(87)
2835
False
36+
>>> is_prime(563)
37+
True
38+
>>> is_prime(2999)
39+
True
40+
>>> is_prime(67483)
41+
False
2942
"""
30-
if n % 2 == 0:
43+
44+
if 1 < number < 4:
45+
# 2 and 3 are primes
46+
return True
47+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
48+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
3149
return False
32-
for i in range(3, int(sqrt(n) + 1), 2):
33-
if n % i == 0:
50+
51+
# All primes number are in format of 6k +/- 1
52+
for i in range(5, int(math.sqrt(number) + 1), 6):
53+
if number % i == 0 or number % (i + 2) == 0:
3454
return False
3555
return True
3656

Diff for: ‎project_euler/problem_046/sol1.py

+34-15
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,49 @@
1919

2020
from __future__ import annotations
2121

22-
seive = [True] * 100001
23-
i = 2
24-
while i * i <= 100000:
25-
if seive[i]:
26-
for j in range(i * i, 100001, i):
27-
seive[j] = False
28-
i += 1
22+
import math
2923

3024

31-
def is_prime(n: int) -> bool:
32-
"""
33-
Returns True if n is prime,
34-
False otherwise, for 2 <= n <= 100000
25+
def is_prime(number: int) -> bool:
26+
"""Checks to see if a number is a prime in O(sqrt(n)).
27+
28+
A number is prime if it has exactly two factors: 1 and itself.
29+
30+
>>> is_prime(0)
31+
False
32+
>>> is_prime(1)
33+
False
34+
>>> is_prime(2)
35+
True
36+
>>> is_prime(3)
37+
True
38+
>>> is_prime(27)
39+
False
3540
>>> is_prime(87)
3641
False
37-
>>> is_prime(23)
42+
>>> is_prime(563)
43+
True
44+
>>> is_prime(2999)
3845
True
39-
>>> is_prime(25363)
46+
>>> is_prime(67483)
4047
False
4148
"""
42-
return seive[n]
49+
50+
if 1 < number < 4:
51+
# 2 and 3 are primes
52+
return True
53+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
54+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
55+
return False
56+
57+
# All primes number are in format of 6k +/- 1
58+
for i in range(5, int(math.sqrt(number) + 1), 6):
59+
if number % i == 0 or number % (i + 2) == 0:
60+
return False
61+
return True
4362

4463

45-
odd_composites = [num for num in range(3, len(seive), 2) if not is_prime(num)]
64+
odd_composites = [num for num in range(3, 100001, 2) if not is_prime(num)]
4665

4766

4867
def compute_nums(n: int) -> list[int]:

Diff for: ‎project_euler/problem_049/sol1.py

+26-12
Original file line numberDiff line numberDiff line change
@@ -25,32 +25,46 @@
2525
The bruteforce of this solution will be about 1 sec.
2626
"""
2727

28+
import math
2829
from itertools import permutations
29-
from math import floor, sqrt
3030

3131

3232
def is_prime(number: int) -> bool:
33-
"""
34-
function to check whether the number is prime or not.
35-
>>> is_prime(2)
36-
True
37-
>>> is_prime(6)
33+
"""Checks to see if a number is a prime in O(sqrt(n)).
34+
35+
A number is prime if it has exactly two factors: 1 and itself.
36+
37+
>>> is_prime(0)
3838
False
3939
>>> is_prime(1)
4040
False
41-
>>> is_prime(-800)
41+
>>> is_prime(2)
42+
True
43+
>>> is_prime(3)
44+
True
45+
>>> is_prime(27)
46+
False
47+
>>> is_prime(87)
4248
False
43-
>>> is_prime(104729)
49+
>>> is_prime(563)
4450
True
51+
>>> is_prime(2999)
52+
True
53+
>>> is_prime(67483)
54+
False
4555
"""
4656

47-
if number < 2:
57+
if 1 < number < 4:
58+
# 2 and 3 are primes
59+
return True
60+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
61+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
4862
return False
4963

50-
for i in range(2, floor(sqrt(number)) + 1):
51-
if number % i == 0:
64+
# All primes number are in format of 6k +/- 1
65+
for i in range(5, int(math.sqrt(number) + 1), 6):
66+
if number % i == 0 or number % (i + 2) == 0:
5267
return False
53-
5468
return True
5569

5670

Diff for: ‎project_euler/problem_058/sol1.py

+35-18
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,46 @@
3333
count of current primes.
3434
3535
"""
36-
from math import isqrt
36+
import math
3737

3838

39-
def is_prime(number: int) -> int:
40-
"""
41-
Returns whether the given number is prime or not
39+
def is_prime(number: int) -> bool:
40+
"""Checks to see if a number is a prime in O(sqrt(n)).
41+
42+
A number is prime if it has exactly two factors: 1 and itself.
43+
44+
>>> is_prime(0)
45+
False
4246
>>> is_prime(1)
43-
0
44-
>>> is_prime(17)
45-
1
46-
>>> is_prime(10000)
47-
0
47+
False
48+
>>> is_prime(2)
49+
True
50+
>>> is_prime(3)
51+
True
52+
>>> is_prime(27)
53+
False
54+
>>> is_prime(87)
55+
False
56+
>>> is_prime(563)
57+
True
58+
>>> is_prime(2999)
59+
True
60+
>>> is_prime(67483)
61+
False
4862
"""
49-
if number == 1:
50-
return 0
51-
52-
if number % 2 == 0 and number > 2:
53-
return 0
5463

55-
for i in range(3, isqrt(number) + 1, 2):
56-
if number % i == 0:
57-
return 0
58-
return 1
64+
if 1 < number < 4:
65+
# 2 and 3 are primes
66+
return True
67+
elif number < 2 or number % 2 == 0 or number % 3 == 0:
68+
# Negatives, 0, 1, all even numbers, all multiples of 3 are not primes
69+
return False
70+
71+
# All primes number are in format of 6k +/- 1
72+
for i in range(5, int(math.sqrt(number) + 1), 6):
73+
if number % i == 0 or number % (i + 2) == 0:
74+
return False
75+
return True
5976

6077

6178
def solution(ratio: float = 0.1) -> int:

0 commit comments

Comments
 (0)
Please sign in to comment.