From 4117826798873e4df41c06b16fba70a7fb0c373c Mon Sep 17 00:00:00 2001 From: Megan Payne Date: Sun, 8 Oct 2023 16:10:24 +0200 Subject: [PATCH 1/9] Added algorithm for Germain Primes to maths folder --- maths/germain_primes.py | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 maths/germain_primes.py diff --git a/maths/germain_primes.py b/maths/germain_primes.py new file mode 100644 index 000000000000..52969712f2e5 --- /dev/null +++ b/maths/germain_primes.py @@ -0,0 +1,46 @@ +""" +A Germain prime is any prime p, where 2p + 1 is also prime. +The second number, 2p + 1 is called a safe prime. + +Examples of Germain primes include: 2, 3, 5, 11, 23 + +Their corresponding safe primes: 5, 7, 11, 23, 47 +https://en.wikipedia.org/wiki/Safe_and_Sophie_Germain_primes +""" + +from maths.prime_check import is_prime + + +def is_germain_prime(number: int) -> bool: + """ Checks if input number and 2*number + 1 are prime. + + >>> is_germain_prime(3) + True + >>> is_germain_prime(11) + True + >>> is_germain_prime(4) + False + >>> is_germain_prime(23) + True + >>> is_germain_prime(13) + False + >>> is_germain_prime(20) + False + >>> is_germain_prime('abc') + Traceback (most recent call last): + ... + TypeError: Input value must be a positive integer. Input value: 'abc' + """ + if not isinstance(number, int) or not number >= 1: + msg = f"Input value must be a positive integer. Input value: {number}" + raise TypeError(msg) + + if is_prime(number) and is_prime(2*number + 1): + return True + return False + + +if __name__ == "__main__": + from doctest import testmod + + testmod() From f8df92dd861432cb79b2c6a6cf5e83f48277954e Mon Sep 17 00:00:00 2001 From: Megan Payne Date: Sun, 8 Oct 2023 16:29:32 +0200 Subject: [PATCH 2/9] Fixed test errors Germain primes. --- maths/germain_primes.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/maths/germain_primes.py b/maths/germain_primes.py index 52969712f2e5..9d36780aabc2 100644 --- a/maths/germain_primes.py +++ b/maths/germain_primes.py @@ -8,28 +8,28 @@ https://en.wikipedia.org/wiki/Safe_and_Sophie_Germain_primes """ -from maths.prime_check import is_prime +from prime_check import is_prime def is_germain_prime(number: int) -> bool: """ Checks if input number and 2*number + 1 are prime. >>> is_germain_prime(3) - True + True >>> is_germain_prime(11) - True + True >>> is_germain_prime(4) - False + False >>> is_germain_prime(23) - True + True >>> is_germain_prime(13) - False + False >>> is_germain_prime(20) - False + False >>> is_germain_prime('abc') Traceback (most recent call last): ... - TypeError: Input value must be a positive integer. Input value: 'abc' + TypeError: Input value must be a positive integer. Input value: abc """ if not isinstance(number, int) or not number >= 1: msg = f"Input value must be a positive integer. Input value: {number}" From 5a651e893c0b38adb6a272676104caef61b4ecb0 Mon Sep 17 00:00:00 2001 From: Megan Payne Date: Sun, 8 Oct 2023 16:41:13 +0200 Subject: [PATCH 3/9] Formatting Germain primes after pre-commit --- maths/germain_primes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/germain_primes.py b/maths/germain_primes.py index 9d36780aabc2..15a09ef4b753 100644 --- a/maths/germain_primes.py +++ b/maths/germain_primes.py @@ -12,7 +12,7 @@ def is_germain_prime(number: int) -> bool: - """ Checks if input number and 2*number + 1 are prime. + """Checks if input number and 2*number + 1 are prime. >>> is_germain_prime(3) True @@ -35,7 +35,7 @@ def is_germain_prime(number: int) -> bool: msg = f"Input value must be a positive integer. Input value: {number}" raise TypeError(msg) - if is_prime(number) and is_prime(2*number + 1): + if is_prime(number) and is_prime(2 * number + 1): return True return False From d3786fd478ca72297c76dab7c1117f6e484ae4f6 Mon Sep 17 00:00:00 2001 From: Megan Payne Date: Sun, 8 Oct 2023 17:33:31 +0200 Subject: [PATCH 4/9] Fixed path to maths --- maths/germain_primes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/germain_primes.py b/maths/germain_primes.py index 15a09ef4b753..a6b21de9cdba 100644 --- a/maths/germain_primes.py +++ b/maths/germain_primes.py @@ -8,7 +8,7 @@ https://en.wikipedia.org/wiki/Safe_and_Sophie_Germain_primes """ -from prime_check import is_prime +from maths.prime_check import is_prime def is_germain_prime(number: int) -> bool: From b01463c247d085055a962dd80a48aa61e1b40e20 Mon Sep 17 00:00:00 2001 From: Megan Payne Date: Sun, 8 Oct 2023 20:15:59 +0200 Subject: [PATCH 5/9] Update maths/germain_primes.py Co-authored-by: Tianyi Zheng --- maths/germain_primes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/germain_primes.py b/maths/germain_primes.py index a6b21de9cdba..6e311fb2eb80 100644 --- a/maths/germain_primes.py +++ b/maths/germain_primes.py @@ -1,5 +1,5 @@ """ -A Germain prime is any prime p, where 2p + 1 is also prime. +A Sophie Germain prime is any prime p, where 2p + 1 is also prime. The second number, 2p + 1 is called a safe prime. Examples of Germain primes include: 2, 3, 5, 11, 23 From eb6a6fd39bd2c3289c15bcbc2168a0a0718166bc Mon Sep 17 00:00:00 2001 From: Megan Payne Date: Sun, 8 Oct 2023 20:16:28 +0200 Subject: [PATCH 6/9] Update maths/germain_primes.py Co-authored-by: Tianyi Zheng --- maths/germain_primes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/germain_primes.py b/maths/germain_primes.py index 6e311fb2eb80..a108fa536400 100644 --- a/maths/germain_primes.py +++ b/maths/germain_primes.py @@ -31,7 +31,7 @@ def is_germain_prime(number: int) -> bool: ... TypeError: Input value must be a positive integer. Input value: abc """ - if not isinstance(number, int) or not number >= 1: + if not isinstance(number, int) or number < 1: msg = f"Input value must be a positive integer. Input value: {number}" raise TypeError(msg) From a082e47c3ddad3fbd227ab690e1535b9f1f33994 Mon Sep 17 00:00:00 2001 From: Megan Payne Date: Sun, 8 Oct 2023 20:56:23 +0200 Subject: [PATCH 7/9] Added function for safe primes --- maths/germain_primes.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/maths/germain_primes.py b/maths/germain_primes.py index a108fa536400..867058dd1dff 100644 --- a/maths/germain_primes.py +++ b/maths/germain_primes.py @@ -40,6 +40,37 @@ def is_germain_prime(number: int) -> bool: return False +def is_safe_prime(number: int) -> bool: + """Checks if input number and (number - 1)/2 are prime. + The smallest safe prime is 5, with the Germain prime is 2. + + >>> is_safe_prime(5) + True + >>> is_safe_prime(11) + True + >>> is_safe_prime(1) + False + >>> is_safe_prime(2) + False + >>> is_safe_prime(3) + False + >>> is_safe_prime(47) + True + >>> is_safe_prime('abc') + Traceback (most recent call last): + ... + TypeError: Input value must be a positive integer. Input value: abc + """ + if not isinstance(number, int) or number < 1: + msg = f"Input value must be a positive integer. Input value: {number}" + raise TypeError(msg) + + if is_prime(number): + if (number - 1) % 2 == 0 and is_prime((number - 1) // 2): + return True + return False + + if __name__ == "__main__": from doctest import testmod From 7c7d824fc29c2e241a0e053c30fd50a438626373 Mon Sep 17 00:00:00 2001 From: Megan Payne Date: Sun, 8 Oct 2023 22:05:01 +0200 Subject: [PATCH 8/9] Update maths/germain_primes.py Co-authored-by: Tianyi Zheng --- maths/germain_primes.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/maths/germain_primes.py b/maths/germain_primes.py index 867058dd1dff..2a565dbde346 100644 --- a/maths/germain_primes.py +++ b/maths/germain_primes.py @@ -35,9 +35,7 @@ def is_germain_prime(number: int) -> bool: msg = f"Input value must be a positive integer. Input value: {number}" raise TypeError(msg) - if is_prime(number) and is_prime(2 * number + 1): - return True - return False + return is_prime(number) and is_prime(2 * number + 1) def is_safe_prime(number: int) -> bool: From 0257507917fd25ad79121fc21f7017467dcc1a7d Mon Sep 17 00:00:00 2001 From: Tianyi Zheng Date: Sun, 8 Oct 2023 17:28:13 -0400 Subject: [PATCH 9/9] Apply suggestions from code review --- maths/germain_primes.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/maths/germain_primes.py b/maths/germain_primes.py index 2a565dbde346..078d1967f41a 100644 --- a/maths/germain_primes.py +++ b/maths/germain_primes.py @@ -63,10 +63,7 @@ def is_safe_prime(number: int) -> bool: msg = f"Input value must be a positive integer. Input value: {number}" raise TypeError(msg) - if is_prime(number): - if (number - 1) % 2 == 0 and is_prime((number - 1) // 2): - return True - return False + return (number - 1) % 2 == 0 and is_prime(number) and is_prime((number - 1) // 2) if __name__ == "__main__":