Skip to content

Commit 2104fa7

Browse files
ngiachoupoyea
andauthored
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 <[email protected]> * Update project_euler/problem_003/sol1.py Co-authored-by: John Law <[email protected]>
1 parent 81e30fd commit 2104fa7

File tree

12 files changed

+310
-132
lines changed

12 files changed

+310
-132
lines changed

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

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

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

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():

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:

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]:

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

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]:

0 commit comments

Comments
 (0)