From 9cc2d7d5fbfb6fe7cbc79e40a46d583d24e866ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Murilo=20Gon=C3=A7alves?= Date: Wed, 20 Oct 2021 16:34:07 -0300 Subject: [PATCH] Fix: deduplicated is_prime functions --- maths/prime_check.py | 2 +- maths/primelib.py | 57 ++++++------------------------- project_euler/problem_003/sol1.py | 42 +++-------------------- project_euler/problem_007/sol1.py | 32 ++--------------- project_euler/problem_007/sol2.py | 20 ++--------- project_euler/problem_010/sol1.py | 25 ++------------ project_euler/problem_010/sol2.py | 22 ++---------- project_euler/problem_027/sol1.py | 25 ++------------ project_euler/problem_035/sol1.py | 19 +++-------- project_euler/problem_041/sol1.py | 22 ++---------- project_euler/problem_049/sol1.py | 28 ++------------- 11 files changed, 37 insertions(+), 257 deletions(-) diff --git a/maths/prime_check.py b/maths/prime_check.py index e2bcb7b8f151..e2a438e5b4ce 100644 --- a/maths/prime_check.py +++ b/maths/prime_check.py @@ -5,7 +5,7 @@ def prime_check(number: int) -> bool: - """Checks to see if a number is a prime. + """Checks to see if a number is a prime in O(sqrt(n)). A number is prime if it has exactly two factors: 1 and itself. """ diff --git a/maths/primelib.py b/maths/primelib.py index 37883d9cf591..6f0b6aff9b64 100644 --- a/maths/primelib.py +++ b/maths/primelib.py @@ -8,7 +8,6 @@ Overview: -isPrime(number) sieveEr(N) getPrimeNumbers(N) primeFactorization(number) @@ -38,41 +37,7 @@ """ -from math import sqrt - - -def isPrime(number): - """ - input: positive integer 'number' - returns true if 'number' is prime otherwise false. - """ - - # precondition - assert isinstance(number, int) and ( - number >= 0 - ), "'number' must been an int and positive" - - status = True - - # 0 and 1 are none primes. - if number <= 1: - status = False - - for divisor in range(2, int(round(sqrt(number))) + 1): - - # if 'number' divisible by 'divisor' then sets 'status' - # of false and break up the loop. - if number % divisor == 0: - status = False - break - - # precondition - assert isinstance(status, bool), "'status' must been from type bool" - - return status - - -# ------------------------------------------ +from prime_check import prime_check def sieveEr(N): @@ -129,7 +94,7 @@ def getPrimeNumbers(N): # if a number is prime then appends to list 'ans' for number in range(2, N + 1): - if isPrime(number): + if prime_check(number): ans.append(number) @@ -164,11 +129,11 @@ def primeFactorization(number): ans.append(number) # if 'number' not prime then builds the prime factorization of 'number' - elif not isPrime(number): + elif not prime_check(number): while quotient != 1: - if isPrime(factor) and (quotient % factor == 0): + if prime_check(factor) and (quotient % factor == 0): ans.append(factor) quotient /= factor else: @@ -317,8 +282,8 @@ def goldbach(number): isinstance(ans, list) and (len(ans) == 2) and (ans[0] + ans[1] == number) - and isPrime(ans[0]) - and isPrime(ans[1]) + and prime_check(ans[0]) + and prime_check(ans[1]) ), "'ans' must contains two primes. And sum of elements must been eq 'number'" return ans @@ -462,11 +427,11 @@ def getPrime(n): # if ans not prime then # runs to the next prime number. - while not isPrime(ans): + while not prime_check(ans): ans += 1 # precondition - assert isinstance(ans, int) and isPrime( + assert isinstance(ans, int) and prime_check( ans ), "'ans' must been a prime number and from type int" @@ -486,7 +451,7 @@ def getPrimesBetween(pNumber1, pNumber2): # precondition assert ( - isPrime(pNumber1) and isPrime(pNumber2) and (pNumber1 < pNumber2) + prime_check(pNumber1) and prime_check(pNumber2) and (pNumber1 < pNumber2) ), "The arguments must been prime numbers and 'pNumber1' < 'pNumber2'" number = pNumber1 + 1 # jump to the next number @@ -495,7 +460,7 @@ def getPrimesBetween(pNumber1, pNumber2): # if number is not prime then # fetch the next prime number. - while not isPrime(number): + while not prime_check(number): number += 1 while number < pNumber2: @@ -505,7 +470,7 @@ def getPrimesBetween(pNumber1, pNumber2): number += 1 # fetch the next prime number. - while not isPrime(number): + while not prime_check(number): number += 1 # precondition diff --git a/project_euler/problem_003/sol1.py b/project_euler/problem_003/sol1.py index 1f329984203a..ccb64d81b37b 100644 --- a/project_euler/problem_003/sol1.py +++ b/project_euler/problem_003/sol1.py @@ -12,39 +12,7 @@ """ import math - -def isprime(num: int) -> bool: - """ - Returns boolean representing primality of given number num. - - >>> isprime(2) - True - >>> isprime(3) - True - >>> isprime(27) - False - >>> isprime(2999) - True - >>> isprime(0) - Traceback (most recent call last): - ... - ValueError: Parameter num must be greater than or equal to two. - >>> isprime(1) - Traceback (most recent call last): - ... - ValueError: Parameter num must be greater than or equal to two. - """ - - if num <= 1: - raise ValueError("Parameter num must be greater than or equal to two.") - if num == 2: - return True - elif num % 2 == 0: - return False - for i in range(3, int(math.sqrt(num)) + 1, 2): - if num % i == 0: - return False - return True +from maths.prime_check import prime_check def solution(n: int = 600851475143) -> int: @@ -84,18 +52,18 @@ def solution(n: int = 600851475143) -> int: if n <= 0: raise ValueError("Parameter n must be greater than or equal to one.") max_number = 0 - if isprime(n): + if prime_check(n): return n while n % 2 == 0: n //= 2 - if isprime(n): + if prime_check(n): return n for i in range(3, int(math.sqrt(n)) + 1, 2): if n % i == 0: - if isprime(n // i): + if prime_check(n // i): max_number = n // i break - elif isprime(i): + elif prime_check(i): max_number = i return max_number diff --git a/project_euler/problem_007/sol1.py b/project_euler/problem_007/sol1.py index 78fbcb511611..ec52ef85735a 100644 --- a/project_euler/problem_007/sol1.py +++ b/project_euler/problem_007/sol1.py @@ -12,33 +12,7 @@ - https://en.wikipedia.org/wiki/Prime_number """ -from math import sqrt - - -def is_prime(num: int) -> bool: - """ - Determines whether the given number is prime or not - - >>> is_prime(2) - True - >>> is_prime(15) - False - >>> is_prime(29) - True - >>> is_prime(0) - False - """ - - if num == 2: - return True - elif num % 2 == 0: - return False - else: - sq = int(sqrt(num)) + 1 - for i in range(3, sq, 2): - if num % i == 0: - return False - return True +from maths.prime_check import prime_check def solution(nth: int = 10001) -> int: @@ -63,11 +37,11 @@ def solution(nth: int = 10001) -> int: number = 1 while count != nth and number < 3: number += 1 - if is_prime(number): + if prime_check(number): count += 1 while count != nth: number += 2 - if is_prime(number): + if prime_check(number): count += 1 return number diff --git a/project_euler/problem_007/sol2.py b/project_euler/problem_007/sol2.py index 20c2ddf21ab8..c8da136ec855 100644 --- a/project_euler/problem_007/sol2.py +++ b/project_euler/problem_007/sol2.py @@ -12,23 +12,7 @@ - https://en.wikipedia.org/wiki/Prime_number """ - -def isprime(number: int) -> bool: - """ - Determines whether the given number is prime or not - - >>> isprime(2) - True - >>> isprime(15) - False - >>> isprime(29) - True - """ - - for i in range(2, int(number ** 0.5) + 1): - if number % i == 0: - return False - return True +from maths.prime_check import prime_check def solution(nth: int = 10001) -> int: @@ -76,7 +60,7 @@ def solution(nth: int = 10001) -> int: primes: list[int] = [] num = 2 while len(primes) < nth: - if isprime(num): + if prime_check(num): primes.append(num) num += 1 else: diff --git a/project_euler/problem_010/sol1.py b/project_euler/problem_010/sol1.py index bd49b3523c97..7e914318a694 100644 --- a/project_euler/problem_010/sol1.py +++ b/project_euler/problem_010/sol1.py @@ -11,28 +11,7 @@ - https://en.wikipedia.org/wiki/Prime_number """ -from math import sqrt - - -def is_prime(n: int) -> bool: - """ - Returns boolean representing primality of given number num. - - >>> is_prime(2) - True - >>> is_prime(3) - True - >>> is_prime(27) - False - >>> is_prime(2999) - True - """ - - for i in range(2, int(sqrt(n)) + 1): - if n % i == 0: - return False - - return True +from maths.prime_check import prime_check def solution(n: int = 2000000) -> int: @@ -55,7 +34,7 @@ def solution(n: int = 2000000) -> int: return 0 for i in range(3, n, 2): - if is_prime(i): + if prime_check(i): sum_of_primes += i return sum_of_primes diff --git a/project_euler/problem_010/sol2.py b/project_euler/problem_010/sol2.py index 3a2f485dde50..c013814058b6 100644 --- a/project_euler/problem_010/sol2.py +++ b/project_euler/problem_010/sol2.py @@ -10,28 +10,10 @@ References: - https://en.wikipedia.org/wiki/Prime_number """ -import math from itertools import takewhile from typing import Iterator - -def is_prime(number: int) -> bool: - """ - Returns boolean representing primality of given number num. - - >>> is_prime(2) - True - >>> is_prime(3) - True - >>> is_prime(27) - False - >>> is_prime(2999) - True - """ - - if number % 2 == 0 and number > 2: - return False - return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2)) +from maths.prime_check import prime_check def prime_generator() -> Iterator[int]: @@ -41,7 +23,7 @@ def prime_generator() -> Iterator[int]: num = 2 while True: - if is_prime(num): + if prime_check(num): yield num num += 1 diff --git a/project_euler/problem_027/sol1.py b/project_euler/problem_027/sol1.py index 6f28b925be08..15a4b0512a20 100644 --- a/project_euler/problem_027/sol1.py +++ b/project_euler/problem_027/sol1.py @@ -20,26 +20,7 @@ n = 0. """ -import math - - -def is_prime(k: int) -> bool: - """ - Determine if a number is prime - >>> is_prime(10) - False - >>> is_prime(11) - True - """ - if k < 2 or k % 2 == 0: - return False - elif k == 2: - return True - else: - for x in range(3, int(math.sqrt(k) + 1), 2): - if k % x == 0: - return False - return True +from maths.prime_check import prime_check def solution(a_limit: int = 1000, b_limit: int = 1000) -> int: @@ -58,10 +39,10 @@ def solution(a_limit: int = 1000, b_limit: int = 1000) -> int: longest = [0, 0, 0] # length, a, b for a in range((a_limit * -1) + 1, a_limit): for b in range(2, b_limit): - if is_prime(b): + if prime_check(b): count = 0 n = 0 - while is_prime((n ** 2) + (a * n) + b): + while prime_check((n ** 2) + (a * n) + b): count += 1 n += 1 if count > longest[0]: diff --git a/project_euler/problem_035/sol1.py b/project_euler/problem_035/sol1.py index 17a4e9088ae2..17cc953c0ba1 100644 --- a/project_euler/problem_035/sol1.py +++ b/project_euler/problem_035/sol1.py @@ -17,6 +17,8 @@ """ from __future__ import annotations +from maths.prime_check import prime_check + seive = [True] * 1000001 i = 2 while i * i <= 1000000: @@ -26,19 +28,6 @@ i += 1 -def is_prime(n: int) -> bool: - """ - For 2 <= n <= 1000000, return True if n is prime. - >>> is_prime(87) - False - >>> is_prime(23) - True - >>> is_prime(25363) - False - """ - return seive[n] - - def contains_an_even_digit(n: int) -> bool: """ Return True if n contains an even digit. @@ -62,10 +51,10 @@ def find_circular_primes(limit: int = 1000000) -> list[int]: """ result = [2] # result already includes the number 2. for num in range(3, limit + 1, 2): - if is_prime(num) and not contains_an_even_digit(num): + if prime_check(num) and not contains_an_even_digit(num): str_num = str(num) list_nums = [int(str_num[j:] + str_num[:j]) for j in range(len(str_num))] - if all(is_prime(i) for i in list_nums): + if all(prime_check(i) for i in list_nums): result.append(num) return result diff --git a/project_euler/problem_041/sol1.py b/project_euler/problem_041/sol1.py index 80ef2125b82a..1b5af698273f 100644 --- a/project_euler/problem_041/sol1.py +++ b/project_euler/problem_041/sol1.py @@ -13,26 +13,8 @@ from __future__ import annotations from itertools import permutations -from math import sqrt - -def is_prime(n: int) -> bool: - """ - Returns True if n is prime, - False otherwise. - >>> is_prime(67483) - False - >>> is_prime(563) - True - >>> is_prime(87) - False - """ - if n % 2 == 0: - return False - for i in range(3, int(sqrt(n) + 1), 2): - if n % i == 0: - return False - return True +from maths.prime_check import prime_check def solution(n: int = 7) -> int: @@ -48,7 +30,7 @@ def solution(n: int = 7) -> int: """ pandigital_str = "".join(str(i) for i in range(1, n + 1)) perm_list = [int("".join(i)) for i in permutations(pandigital_str, n)] - pandigitals = [num for num in perm_list if is_prime(num)] + pandigitals = [num for num in perm_list if prime_check(num)] return max(pandigitals) if pandigitals else 0 diff --git a/project_euler/problem_049/sol1.py b/project_euler/problem_049/sol1.py index dd2ef71a38a8..2c7ce2d4053d 100644 --- a/project_euler/problem_049/sol1.py +++ b/project_euler/problem_049/sol1.py @@ -26,32 +26,8 @@ """ from itertools import permutations -from math import floor, sqrt - -def is_prime(number: int) -> bool: - """ - function to check whether the number is prime or not. - >>> is_prime(2) - True - >>> is_prime(6) - False - >>> is_prime(1) - False - >>> is_prime(-800) - False - >>> is_prime(104729) - True - """ - - if number < 2: - return False - - for i in range(2, floor(sqrt(number)) + 1): - if number % i == 0: - return False - - return True +from maths.prime_check import prime_check def search(target: int, prime_list: list) -> bool: @@ -84,7 +60,7 @@ def solution(): >>> solution() 296962999629 """ - prime_list = [n for n in range(1001, 10000, 2) if is_prime(n)] + prime_list = [n for n in range(1001, 10000, 2) if prime_check(n)] candidates = [] for number in prime_list: