Skip to content

Commit a2b695d

Browse files
megpaymeganpayneconsultingtianyizheng02
authored
Added Germain primes algorithm to the maths folder (#10120)
* Added algorithm for Germain Primes to maths folder * Fixed test errors Germain primes. * Formatting Germain primes after pre-commit * Fixed path to maths * Update maths/germain_primes.py Co-authored-by: Tianyi Zheng <[email protected]> * Update maths/germain_primes.py Co-authored-by: Tianyi Zheng <[email protected]> * Added function for safe primes * Update maths/germain_primes.py Co-authored-by: Tianyi Zheng <[email protected]> * Apply suggestions from code review --------- Co-authored-by: Megan Payne <[email protected]> Co-authored-by: Tianyi Zheng <[email protected]>
1 parent 66e4ea6 commit a2b695d

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

Diff for: maths/germain_primes.py

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
"""
2+
A Sophie Germain prime is any prime p, where 2p + 1 is also prime.
3+
The second number, 2p + 1 is called a safe prime.
4+
5+
Examples of Germain primes include: 2, 3, 5, 11, 23
6+
7+
Their corresponding safe primes: 5, 7, 11, 23, 47
8+
https://en.wikipedia.org/wiki/Safe_and_Sophie_Germain_primes
9+
"""
10+
11+
from maths.prime_check import is_prime
12+
13+
14+
def is_germain_prime(number: int) -> bool:
15+
"""Checks if input number and 2*number + 1 are prime.
16+
17+
>>> is_germain_prime(3)
18+
True
19+
>>> is_germain_prime(11)
20+
True
21+
>>> is_germain_prime(4)
22+
False
23+
>>> is_germain_prime(23)
24+
True
25+
>>> is_germain_prime(13)
26+
False
27+
>>> is_germain_prime(20)
28+
False
29+
>>> is_germain_prime('abc')
30+
Traceback (most recent call last):
31+
...
32+
TypeError: Input value must be a positive integer. Input value: abc
33+
"""
34+
if not isinstance(number, int) or number < 1:
35+
msg = f"Input value must be a positive integer. Input value: {number}"
36+
raise TypeError(msg)
37+
38+
return is_prime(number) and is_prime(2 * number + 1)
39+
40+
41+
def is_safe_prime(number: int) -> bool:
42+
"""Checks if input number and (number - 1)/2 are prime.
43+
The smallest safe prime is 5, with the Germain prime is 2.
44+
45+
>>> is_safe_prime(5)
46+
True
47+
>>> is_safe_prime(11)
48+
True
49+
>>> is_safe_prime(1)
50+
False
51+
>>> is_safe_prime(2)
52+
False
53+
>>> is_safe_prime(3)
54+
False
55+
>>> is_safe_prime(47)
56+
True
57+
>>> is_safe_prime('abc')
58+
Traceback (most recent call last):
59+
...
60+
TypeError: Input value must be a positive integer. Input value: abc
61+
"""
62+
if not isinstance(number, int) or number < 1:
63+
msg = f"Input value must be a positive integer. Input value: {number}"
64+
raise TypeError(msg)
65+
66+
return (number - 1) % 2 == 0 and is_prime(number) and is_prime((number - 1) // 2)
67+
68+
69+
if __name__ == "__main__":
70+
from doctest import testmod
71+
72+
testmod()

0 commit comments

Comments
 (0)