Skip to content

Commit 9cc2d7d

Browse files
Fix: deduplicated is_prime functions
1 parent 1d457be commit 9cc2d7d

File tree

11 files changed

+37
-257
lines changed

11 files changed

+37
-257
lines changed

maths/prime_check.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66

77
def prime_check(number: int) -> bool:
8-
"""Checks to see if a number is a prime.
8+
"""Checks to see if a number is a prime in O(sqrt(n)).
99
1010
A number is prime if it has exactly two factors: 1 and itself.
1111
"""

maths/primelib.py

+11-46
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
99
Overview:
1010
11-
isPrime(number)
1211
sieveEr(N)
1312
getPrimeNumbers(N)
1413
primeFactorization(number)
@@ -38,41 +37,7 @@
3837
3938
"""
4039

41-
from math import sqrt
42-
43-
44-
def isPrime(number):
45-
"""
46-
input: positive integer 'number'
47-
returns true if 'number' is prime otherwise false.
48-
"""
49-
50-
# precondition
51-
assert isinstance(number, int) and (
52-
number >= 0
53-
), "'number' must been an int and positive"
54-
55-
status = True
56-
57-
# 0 and 1 are none primes.
58-
if number <= 1:
59-
status = False
60-
61-
for divisor in range(2, int(round(sqrt(number))) + 1):
62-
63-
# if 'number' divisible by 'divisor' then sets 'status'
64-
# of false and break up the loop.
65-
if number % divisor == 0:
66-
status = False
67-
break
68-
69-
# precondition
70-
assert isinstance(status, bool), "'status' must been from type bool"
71-
72-
return status
73-
74-
75-
# ------------------------------------------
40+
from prime_check import prime_check
7641

7742

7843
def sieveEr(N):
@@ -129,7 +94,7 @@ def getPrimeNumbers(N):
12994
# if a number is prime then appends to list 'ans'
13095
for number in range(2, N + 1):
13196

132-
if isPrime(number):
97+
if prime_check(number):
13398

13499
ans.append(number)
135100

@@ -164,11 +129,11 @@ def primeFactorization(number):
164129
ans.append(number)
165130

166131
# if 'number' not prime then builds the prime factorization of 'number'
167-
elif not isPrime(number):
132+
elif not prime_check(number):
168133

169134
while quotient != 1:
170135

171-
if isPrime(factor) and (quotient % factor == 0):
136+
if prime_check(factor) and (quotient % factor == 0):
172137
ans.append(factor)
173138
quotient /= factor
174139
else:
@@ -317,8 +282,8 @@ def goldbach(number):
317282
isinstance(ans, list)
318283
and (len(ans) == 2)
319284
and (ans[0] + ans[1] == number)
320-
and isPrime(ans[0])
321-
and isPrime(ans[1])
285+
and prime_check(ans[0])
286+
and prime_check(ans[1])
322287
), "'ans' must contains two primes. And sum of elements must been eq 'number'"
323288

324289
return ans
@@ -462,11 +427,11 @@ def getPrime(n):
462427

463428
# if ans not prime then
464429
# runs to the next prime number.
465-
while not isPrime(ans):
430+
while not prime_check(ans):
466431
ans += 1
467432

468433
# precondition
469-
assert isinstance(ans, int) and isPrime(
434+
assert isinstance(ans, int) and prime_check(
470435
ans
471436
), "'ans' must been a prime number and from type int"
472437

@@ -486,7 +451,7 @@ def getPrimesBetween(pNumber1, pNumber2):
486451

487452
# precondition
488453
assert (
489-
isPrime(pNumber1) and isPrime(pNumber2) and (pNumber1 < pNumber2)
454+
prime_check(pNumber1) and prime_check(pNumber2) and (pNumber1 < pNumber2)
490455
), "The arguments must been prime numbers and 'pNumber1' < 'pNumber2'"
491456

492457
number = pNumber1 + 1 # jump to the next number
@@ -495,7 +460,7 @@ def getPrimesBetween(pNumber1, pNumber2):
495460

496461
# if number is not prime then
497462
# fetch the next prime number.
498-
while not isPrime(number):
463+
while not prime_check(number):
499464
number += 1
500465

501466
while number < pNumber2:
@@ -505,7 +470,7 @@ def getPrimesBetween(pNumber1, pNumber2):
505470
number += 1
506471

507472
# fetch the next prime number.
508-
while not isPrime(number):
473+
while not prime_check(number):
509474
number += 1
510475

511476
# precondition

project_euler/problem_003/sol1.py

+5-37
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,7 @@
1212
"""
1313
import math
1414

15-
16-
def isprime(num: int) -> bool:
17-
"""
18-
Returns boolean representing primality of given number num.
19-
20-
>>> isprime(2)
21-
True
22-
>>> isprime(3)
23-
True
24-
>>> isprime(27)
25-
False
26-
>>> isprime(2999)
27-
True
28-
>>> isprime(0)
29-
Traceback (most recent call last):
30-
...
31-
ValueError: Parameter num must be greater than or equal to two.
32-
>>> isprime(1)
33-
Traceback (most recent call last):
34-
...
35-
ValueError: Parameter num must be greater than or equal to two.
36-
"""
37-
38-
if num <= 1:
39-
raise ValueError("Parameter num must be greater than or equal to two.")
40-
if num == 2:
41-
return True
42-
elif num % 2 == 0:
43-
return False
44-
for i in range(3, int(math.sqrt(num)) + 1, 2):
45-
if num % i == 0:
46-
return False
47-
return True
15+
from maths.prime_check import prime_check
4816

4917

5018
def solution(n: int = 600851475143) -> int:
@@ -84,18 +52,18 @@ def solution(n: int = 600851475143) -> int:
8452
if n <= 0:
8553
raise ValueError("Parameter n must be greater than or equal to one.")
8654
max_number = 0
87-
if isprime(n):
55+
if prime_check(n):
8856
return n
8957
while n % 2 == 0:
9058
n //= 2
91-
if isprime(n):
59+
if prime_check(n):
9260
return n
9361
for i in range(3, int(math.sqrt(n)) + 1, 2):
9462
if n % i == 0:
95-
if isprime(n // i):
63+
if prime_check(n // i):
9664
max_number = n // i
9765
break
98-
elif isprime(i):
66+
elif prime_check(i):
9967
max_number = i
10068
return max_number
10169

project_euler/problem_007/sol1.py

+3-29
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,7 @@
1212
- https://en.wikipedia.org/wiki/Prime_number
1313
"""
1414

15-
from math import sqrt
16-
17-
18-
def is_prime(num: int) -> bool:
19-
"""
20-
Determines whether the given number is prime or not
21-
22-
>>> is_prime(2)
23-
True
24-
>>> is_prime(15)
25-
False
26-
>>> is_prime(29)
27-
True
28-
>>> is_prime(0)
29-
False
30-
"""
31-
32-
if num == 2:
33-
return True
34-
elif num % 2 == 0:
35-
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
41-
return True
15+
from maths.prime_check import prime_check
4216

4317

4418
def solution(nth: int = 10001) -> int:
@@ -63,11 +37,11 @@ def solution(nth: int = 10001) -> int:
6337
number = 1
6438
while count != nth and number < 3:
6539
number += 1
66-
if is_prime(number):
40+
if prime_check(number):
6741
count += 1
6842
while count != nth:
6943
number += 2
70-
if is_prime(number):
44+
if prime_check(number):
7145
count += 1
7246
return number
7347

project_euler/problem_007/sol2.py

+2-18
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,7 @@
1212
- https://en.wikipedia.org/wiki/Prime_number
1313
"""
1414

15-
16-
def isprime(number: int) -> bool:
17-
"""
18-
Determines whether the given number is prime or not
19-
20-
>>> isprime(2)
21-
True
22-
>>> isprime(15)
23-
False
24-
>>> isprime(29)
25-
True
26-
"""
27-
28-
for i in range(2, int(number ** 0.5) + 1):
29-
if number % i == 0:
30-
return False
31-
return True
15+
from maths.prime_check import prime_check
3216

3317

3418
def solution(nth: int = 10001) -> int:
@@ -76,7 +60,7 @@ def solution(nth: int = 10001) -> int:
7660
primes: list[int] = []
7761
num = 2
7862
while len(primes) < nth:
79-
if isprime(num):
63+
if prime_check(num):
8064
primes.append(num)
8165
num += 1
8266
else:

project_euler/problem_010/sol1.py

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

14-
from math import sqrt
15-
16-
17-
def is_prime(n: int) -> bool:
18-
"""
19-
Returns boolean representing primality of given number num.
20-
21-
>>> is_prime(2)
22-
True
23-
>>> is_prime(3)
24-
True
25-
>>> is_prime(27)
26-
False
27-
>>> is_prime(2999)
28-
True
29-
"""
30-
31-
for i in range(2, int(sqrt(n)) + 1):
32-
if n % i == 0:
33-
return False
34-
35-
return True
14+
from maths.prime_check import prime_check
3615

3716

3817
def solution(n: int = 2000000) -> int:
@@ -55,7 +34,7 @@ def solution(n: int = 2000000) -> int:
5534
return 0
5635

5736
for i in range(3, n, 2):
58-
if is_prime(i):
37+
if prime_check(i):
5938
sum_of_primes += i
6039

6140
return sum_of_primes

project_euler/problem_010/sol2.py

+2-20
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,10 @@
1010
References:
1111
- https://en.wikipedia.org/wiki/Prime_number
1212
"""
13-
import math
1413
from itertools import takewhile
1514
from typing import Iterator
1615

17-
18-
def is_prime(number: int) -> bool:
19-
"""
20-
Returns boolean representing primality of given number num.
21-
22-
>>> is_prime(2)
23-
True
24-
>>> is_prime(3)
25-
True
26-
>>> is_prime(27)
27-
False
28-
>>> is_prime(2999)
29-
True
30-
"""
31-
32-
if number % 2 == 0 and number > 2:
33-
return False
34-
return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2))
16+
from maths.prime_check import prime_check
3517

3618

3719
def prime_generator() -> Iterator[int]:
@@ -41,7 +23,7 @@ def prime_generator() -> Iterator[int]:
4123

4224
num = 2
4325
while True:
44-
if is_prime(num):
26+
if prime_check(num):
4527
yield num
4628
num += 1
4729

0 commit comments

Comments
 (0)