This commit is contained in:
2026-06-24 16:33:34 +02:00
commit 1611444153
26 changed files with 1400 additions and 0 deletions
View File
+138
View File
@@ -0,0 +1,138 @@
import sys
import unittest
sys.path.append('../')
from functions import extended_gcd
from sympy import prevprime
import random
class TestExtendedEuclideanAlgorithm(unittest.TestCase):
def test_positive_numbers(self):
gcd, x, y = extended_gcd(240, 46)
self.assertEqual(gcd, 2)
self.assertEqual(240 * x + 46 * y, gcd)
gcd, x, y = extended_gcd(123456, 789012)
self.assertEqual(gcd, 12)
self.assertEqual(123456 * x + 789012 * y, gcd)
gcd, x, y = extended_gcd(65345, 323160)
self.assertEqual(gcd, 5)
self.assertEqual(65345 * x + 323160 * y, gcd)
gcd, x, y = extended_gcd(2330646462, 3044333)
self.assertEqual(gcd, 1)
self.assertEqual(2330646462 * x + 3044333 * y, gcd)
gcd, x, y = extended_gcd(926467262, 6430314335)
self.assertEqual(gcd, 1)
self.assertEqual(926467262 * x + 6430314335 * y, gcd)
def test_one_zero(self):
gcd, x, y = extended_gcd(7, 0)
self.assertEqual(gcd, 7)
self.assertEqual(7 * x + 0 * y, gcd)
gcd, x, y = extended_gcd(0, 239402839)
self.assertEqual(gcd, 239402839)
self.assertEqual(0 * x + 239402839 * y, gcd)
gcd, x, y = extended_gcd(0, 29342093849283409283984234)
self.assertEqual(gcd, 29342093849283409283984234)
self.assertEqual(0 * x + 29342093849283409283984234 * y, gcd)
gcd, x, y = extended_gcd(888888888888888888888888, 0)
self.assertEqual(gcd, 888888888888888888888888)
self.assertEqual(888888888888888888888888 * x + 0 * y, gcd)
gcd, x, y = extended_gcd(10**100, 0)
self.assertEqual(gcd, 10**100)
self.assertEqual(10**100 * x + 0 * y, gcd)
def test_both_zeros(self):
gcd, x, y = extended_gcd(0, 0)
self.assertEqual(gcd, 0)
self.assertEqual(0 * x + 0 * y, gcd)
def test_negative_numbers(self):
gcd, x, y = extended_gcd(-120, 23)
self.assertEqual(gcd, 1)
self.assertEqual(abs((-120) * x + 23 * y), gcd)
gcd, x, y = extended_gcd(-120, 23)
self.assertEqual(gcd, 1)
self.assertEqual(abs((-120) * x + 23 * y), gcd)
gcd, x, y = extended_gcd(-15, 4)
self.assertEqual(gcd, 1)
self.assertEqual(abs((-15) * x + 4 * y), gcd)
gcd, x, y = extended_gcd(-123456, 78901)
self.assertEqual(gcd, 1)
self.assertEqual(abs((-123456) * x + 78901 * y), gcd)
gcd, x, y = extended_gcd(101, -50)
self.assertEqual(gcd, 1)
self.assertEqual(abs(101 * x + (-50) * y), gcd)
gcd, x, y = extended_gcd(100000, -45000)
self.assertEqual(gcd, 5000)
self.assertEqual(abs(100000 * x + (-45000) * y), gcd)
def test_both_negatives(self):
gcd, x, y = extended_gcd(-10, -25)
self.assertEqual(gcd, 5)
self.assertEqual(abs((-10) * x + (-25) * y), gcd)
gcd, x, y = extended_gcd(-120, -360)
self.assertEqual(gcd, 120)
self.assertEqual(abs((-120) * x + (-360) * y), gcd)
gcd, x, y = extended_gcd(-123456, -789012)
self.assertEqual(gcd, 12)
self.assertEqual(abs((-123456) * x + (-789012) * y), gcd)
gcd, x, y = extended_gcd(-101, -103)
self.assertEqual(gcd, 1)
self.assertEqual(abs((-101) * x + (-103) * y), gcd)
gcd, x, y = extended_gcd(-1001, -997)
self.assertEqual(gcd, 1)
self.assertEqual(abs((-1001) * x + (-997) * y), gcd)
def test_very_large_numbers(self):
large_prime_1 = prevprime(10**50)
large_prime_2 = prevprime(10**100)
gcd, x, y = extended_gcd(large_prime_1, large_prime_2)
self.assertEqual(gcd, 1)
self.assertEqual(large_prime_1 * x + large_prime_2 * y, gcd)
random_num = random.randint(1, 10**50)
gcd, x, y = extended_gcd(random_num, random_num * large_prime_2)
self.assertEqual(gcd, random_num)
self.assertEqual(random_num * x + random_num * large_prime_2 * y, gcd)
random_num = random.randint(1, 10**50)
large_prime_2 = prevprime(10**500)
gcd, x, y = extended_gcd(random_num, random_num * large_prime_2)
self.assertEqual(gcd, random_num)
self.assertEqual(random_num * x + random_num * large_prime_2 * y, gcd)
random_num = random.randint(1, 10**50)
large_prime_2 = prevprime(10**750)
gcd, x, y = extended_gcd(random_num, random_num * large_prime_2)
self.assertEqual(gcd, random_num)
self.assertEqual(random_num * x + random_num * large_prime_2 * y, gcd)
random_num = random.randint(1, 10**50)
large_prime_2 = prevprime(10**1000)
gcd, x, y = extended_gcd(random_num, random_num * large_prime_2)
self.assertEqual(gcd, random_num)
self.assertEqual(random_num * x + random_num * large_prime_2 * y, gcd)
if __name__ == '__main__':
unittest.main()
+31
View File
@@ -0,0 +1,31 @@
import sys
import unittest
sys.path.append('../../')
from generate import generate
from encrypt import encrypt
from decrypt import decrypt
class TestEncryptDecrypt(unittest.TestCase):
def test_encrypt_decrypt(self):
test_strings = [
"Manifesto of the Communist Party A spectre is haunting Europe — the spectre of communism. All the powers of old Europe have entered into a holy alliance to exorcise this spectre: Pope and Tsar, Metternich and Guizot, French Radicals and German police-spies.", # 257-character string
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
'没有共产党就没有新中国',
'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän kymmenen',
'Jag förstår inte.',
'12 апреля 1961 года Юрий Гагарин стал первым человеком в мировой истории, совершившим полёт в космическое пространство.'
]
for ORIGINAL_STRING in test_strings:
(n, e, d) = generate()
encrypted = encrypt(ORIGINAL_STRING, n, e)
self.assertNotEqual(ORIGINAL_STRING, encrypted, 'The encrypted string is not the same as the original string.')
self.assertIsInstance(encrypted, str, 'The result of the encryption is indeed a string.')
decrypted = decrypt(encrypted, d, n)
self.assertEqual(ORIGINAL_STRING, decrypted, 'The decrypted string matches the original string.')
if __name__ == '__main__':
unittest.main()
+20
View File
@@ -0,0 +1,20 @@
import sys
import unittest
sys.path.append('../../')
from generate import generate
from functions import primality_test
class TestGenerator(unittest.TestCase):
def test_generate(self):
(n, e, d) = generate()
self.assertIsInstance(n, int, 'n is correctly returned as an integer.')
self.assertIsInstance(e, int, 'e is correctly returned as an integer.')
self.assertIsInstance(d, int, 'd is correctly returned as an integer.')
self.assertFalse(primality_test(n), 'n is not a prime number.')
if __name__ == '__main__':
unittest.main()
+70
View File
@@ -0,0 +1,70 @@
import sys
import unittest
import random
sys.path.append('../')
from functions import primality_test
class TestPrimalityTest(unittest.TestCase):
def test_prime_number(self):
self.assertTrue(primality_test(5), msg='5 is a prime number.')
self.assertTrue(primality_test(7), msg='7 is a prime number.')
self.assertTrue(primality_test(29), msg='29 is a prime number.')
self.assertTrue(primality_test(34841), msg='34841 is a prime number.')
self.assertTrue(primality_test(8328989), msg='8328989 is a prime number.')
large_prime = (2**32 + 1) // 641
self.assertTrue(primality_test(large_prime), msg=f'{large_prime} is a prime number.')
large_prime = (10**18 + 1) // 1000001
self.assertTrue(primality_test(large_prime), msg=f'{large_prime} is a prime number.')
large_prime = 170141183460469231731687303715884105727
self.assertTrue(primality_test(large_prime), msg=f'{large_prime} is a prime number.')
large_prime = 180 * large_prime**2 + 1
self.assertTrue(primality_test(large_prime), msg=f'{large_prime} is a prime number.')
large_prime = 531137992816767098689588206552468627329593117727031923199444138200403559860852242739162502265229285668889329486246501015346579337652707239409519978766587351943831270835393219031728127
self.assertTrue(primality_test(large_prime), msg=f'{large_prime} is a prime number.')
def test_non_prime_number(self):
self.assertFalse(primality_test(4), msg='4 is not a prime number.')
self.assertFalse(primality_test(6), msg='6 is not a prime number.')
self.assertFalse(primality_test(8), msg='8 is not a prime number.')
self.assertFalse(primality_test(17650839), msg='17650839 is not a prime number.')
large_non_prime = 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151 + 1
self.assertFalse(primality_test(large_non_prime), msg=f'{large_non_prime} is not a prime number.')
large_prime = (2**64 + 1) // 274177
large_prime_2 = (2 * 32 + 1) // 641
large_non_prime = large_prime * large_prime_2
self.assertFalse(primality_test(large_non_prime), msg=f'{large_non_prime} is not a prime number.')
large_non_prime = large_prime * random.randint(1, 10**1000)
self.assertFalse(primality_test(large_non_prime), msg=f'{large_non_prime} is not a prime number.')
large_non_prime = large_prime_2 * random.randint(1, 7**750)
self.assertFalse(primality_test(large_non_prime), msg=f'{large_non_prime} is not a prime number.')
large_non_prime = random.randint(1, 10**1000) * random.randint(1, 10**1000)
self.assertFalse(primality_test(large_non_prime), msg=f'{large_non_prime} is not a prime number.')
large_prime = 531137992816767098689588206552468627329593117727031923199444138200403559860852242739162502265229285668889329486246501015346579337652707239409519978766587351943831270835393219031728127
large_prime_2 = (2**64 + 1) // 274177
large_non_prime = large_prime * large_prime_2
self.assertFalse(primality_test(large_non_prime), msg=f'{large_non_prime} is not a prime number.')
def test_edge_cases(self):
self.assertFalse(primality_test(0), msg='0 is not a prime number.')
self.assertFalse(primality_test(1), msg='1 is not a prime number.')
self.assertTrue(primality_test(2), msg='2 is a prime number.')
self.assertTrue(primality_test(3), msg='3 is a prime number.')
self.assertTrue(primality_test(5), msg='5 is a prime number.')
if __name__ == '__main__':
unittest.main()