main
Program na overenie, či je zadané číslo prvočíslom.
1"""Program na overenie, či je zadané číslo prvočíslom.""" 2 3# Importujeme knižnicu random pre generovanie náhodných čísel, 4# pretože ju budeme potrebovať pri heuristickej metóde Miller-Rabin Test. 5 6import random 7 8 9def prvocislo(n: int) -> bool: 10 """Funkcia 'prvocislo' na overenie, či je číslo prvočíslo. 11 12 Delenie od 2 do sqrt(n): Táto 13 metóda zahŕňa delenie čísla n od 2 až do jeho druhej 14 odmocniny. Ak sa nedá deliť žiadnym číslom v tomto rozsahu, 15 potom sa považuje za prvočíslo. 16 17 :param n: Testované číslo. 18 :return: Existencia prvočísla. 19 """ 20 # Overenie či číslo je menšie alebo rovné 2 21 if n <= 2: 22 return n == 2 23 # Overenie či číslo je párne 24 elif n % 2 == 0: 25 return False 26 # Iterovanie od 3 po odmocninu z čísla + 1 27 for i in range(3, int(n ** 0.5) + 1, 2): 28 # Ak sa delí bez zvyšku, nie je to prvočíslo 29 if n % i == 0: 30 return False 31 # Ak sa nenašlo žiadne deliteľné číslo, je to prvočíslo 32 return True 33 34 35def prvocislo_mr(n: int, k: int = 5) -> bool: 36 """Funkcia 'prvocislo_mr' naoverenie či je číslo prvočíslo. 37 38 Miller-Rabin test funguje tak, 39 že pre zadané číslo n, prvý krok je rozklad n-1 na d*2^r. 40 Potom sa vyberie náhodné číslo a, ktoré sa zvolí z 41 intervalu od 2 do n-2. Ďalej sa vykoná výpočet a^d mod n. 42 Ak sa výsledok rovná 1 alebo n-1, číslo sa považuje za 43 možné prvočíslo a test sa opakuje s iným číslom a. 44 Ak sa výsledok nerovná ani 1 ani n-1, prechádza sa 45 cez cyklus, kde sa výpočet opakuje s výsledkom 46 predchádzajúceho výpočtu, kým sa neobjaví výsledok 47 n-1 alebo kým sa nevykoná r-1 iterácií. Ak sa v cykle 48 nedosiahne výsledok n-1, číslo sa považuje za zložené. 49 50 :param n: Testované číslo. 51 :param k: Počet iterácií Miller-Rabin testu. 52 :return: Existencia prvočísla. 53 """ 54 # Ak je číslo párne alebo delitelné 3, vrátime False. 55 if n % 2 == 0 or n % 3 == 0: 56 return False 57 # Inicializujeme premenné 'r' a 'd' pre kroky Miller-Rabin testu. 58 r, d = 0, n - 1 59 # rozklad n-1 na d*2^r 60 while d % 2 == 0: 61 r += 1 62 d //= 2 63 # Pomocou for cyklu vykonáme 'k' iterácií Miller-Rabin testu 64 # s náhodnými číslami od 2 do n-2. 65 for _ in range(k): 66 a = random.randint(2, n - 2) 67 # výpočet a^d mod n 68 x = pow(a, d, n) 69 """ 70 Ak sa výsledok nerovná ani 1 ani n-1, prechádza sa cez cyklus, 71 kde sa výpočet opakuje s výsledkom predchádzajúceho výpočtu. 72 kým sa neobjaví výsledok n-1 alebo kým sa nevykoná r-1 iterácií. 73 """ 74 if x == 1 or x == n - 1: 75 continue 76 for _ in range(r - 1): 77 x = pow(x, 2, n) 78 """ 79 Ak sa v cykle nedosiahne výsledok n-1, 80 číslo sa považuje za zložené. 81 """ 82 if x == n - 1: 83 break 84 else: 85 return False 86 return True 87 88 89if __name__ == '__main__': 90 while True: 91 """ 92 Vstup čísla od používateľa a jeho ošetrienie aby bolo 93 číslo zadané užívateľom kladné celé číslo. 94 """ 95 try: 96 cislo = int(input("Zadaj cislo: ")) 97 # Podmienka na overenie kladnosti čísla. 98 if cislo <= 0: 99 print("Zadaj kladne celo cislo.") 100 continue 101 break 102 # Výpis chybovej hlášky ak sa zadal vstup iný ako typ int 103 except ValueError: 104 print("Zadaj validne cele cislo.") 105 106 # Volanie funkcií 107 """ 108 Ak je číslo väčšie ako 1000 zavolá funkciu 'prvocislo_mr', čiže 109 heuristickú metódu Miller-Rabin test. 110 """ 111 if cislo > 1000: 112 if prvocislo_mr(cislo): 113 print(f"{cislo} je prvocislo." 114 f" Pouzita heuristicka metoda: Miller-Rabin test.") 115 else: 116 print(f"{cislo} nie je prvocislo. " 117 f"Pouzita heuristicka metoda: Miller-Rabin test.") 118 """ 119 Ak je číslo menšie alebo rovno 1000 zavolá funkciu 'prvocislo', 120 čiže metódu delenia od 2 do sqrt(n) 121 """ 122 else: 123 if prvocislo(cislo): 124 print(f"{cislo} je prvocislo. Pouzita deterministicka metoda.") 125 else: 126 print(f"{cislo} nie je prvocislo. Pouzita deterministicka metoda.")
10def prvocislo(n: int) -> bool: 11 """Funkcia 'prvocislo' na overenie, či je číslo prvočíslo. 12 13 Delenie od 2 do sqrt(n): Táto 14 metóda zahŕňa delenie čísla n od 2 až do jeho druhej 15 odmocniny. Ak sa nedá deliť žiadnym číslom v tomto rozsahu, 16 potom sa považuje za prvočíslo. 17 18 :param n: Testované číslo. 19 :return: Existencia prvočísla. 20 """ 21 # Overenie či číslo je menšie alebo rovné 2 22 if n <= 2: 23 return n == 2 24 # Overenie či číslo je párne 25 elif n % 2 == 0: 26 return False 27 # Iterovanie od 3 po odmocninu z čísla + 1 28 for i in range(3, int(n ** 0.5) + 1, 2): 29 # Ak sa delí bez zvyšku, nie je to prvočíslo 30 if n % i == 0: 31 return False 32 # Ak sa nenašlo žiadne deliteľné číslo, je to prvočíslo 33 return True
Funkcia 'prvocislo' na overenie, či je číslo prvočíslo.
Delenie od 2 do sqrt(n): Táto metóda zahŕňa delenie čísla n od 2 až do jeho druhej odmocniny. Ak sa nedá deliť žiadnym číslom v tomto rozsahu, potom sa považuje za prvočíslo.
Parameters
- n: Testované číslo.
Returns
Existencia prvočísla.
36def prvocislo_mr(n: int, k: int = 5) -> bool: 37 """Funkcia 'prvocislo_mr' naoverenie či je číslo prvočíslo. 38 39 Miller-Rabin test funguje tak, 40 že pre zadané číslo n, prvý krok je rozklad n-1 na d*2^r. 41 Potom sa vyberie náhodné číslo a, ktoré sa zvolí z 42 intervalu od 2 do n-2. Ďalej sa vykoná výpočet a^d mod n. 43 Ak sa výsledok rovná 1 alebo n-1, číslo sa považuje za 44 možné prvočíslo a test sa opakuje s iným číslom a. 45 Ak sa výsledok nerovná ani 1 ani n-1, prechádza sa 46 cez cyklus, kde sa výpočet opakuje s výsledkom 47 predchádzajúceho výpočtu, kým sa neobjaví výsledok 48 n-1 alebo kým sa nevykoná r-1 iterácií. Ak sa v cykle 49 nedosiahne výsledok n-1, číslo sa považuje za zložené. 50 51 :param n: Testované číslo. 52 :param k: Počet iterácií Miller-Rabin testu. 53 :return: Existencia prvočísla. 54 """ 55 # Ak je číslo párne alebo delitelné 3, vrátime False. 56 if n % 2 == 0 or n % 3 == 0: 57 return False 58 # Inicializujeme premenné 'r' a 'd' pre kroky Miller-Rabin testu. 59 r, d = 0, n - 1 60 # rozklad n-1 na d*2^r 61 while d % 2 == 0: 62 r += 1 63 d //= 2 64 # Pomocou for cyklu vykonáme 'k' iterácií Miller-Rabin testu 65 # s náhodnými číslami od 2 do n-2. 66 for _ in range(k): 67 a = random.randint(2, n - 2) 68 # výpočet a^d mod n 69 x = pow(a, d, n) 70 """ 71 Ak sa výsledok nerovná ani 1 ani n-1, prechádza sa cez cyklus, 72 kde sa výpočet opakuje s výsledkom predchádzajúceho výpočtu. 73 kým sa neobjaví výsledok n-1 alebo kým sa nevykoná r-1 iterácií. 74 """ 75 if x == 1 or x == n - 1: 76 continue 77 for _ in range(r - 1): 78 x = pow(x, 2, n) 79 """ 80 Ak sa v cykle nedosiahne výsledok n-1, 81 číslo sa považuje za zložené. 82 """ 83 if x == n - 1: 84 break 85 else: 86 return False 87 return True
Funkcia 'prvocislo_mr' naoverenie či je číslo prvočíslo.
Miller-Rabin test funguje tak, že pre zadané číslo n, prvý krok je rozklad n-1 na d*2^r. Potom sa vyberie náhodné číslo a, ktoré sa zvolí z intervalu od 2 do n-2. Ďalej sa vykoná výpočet a^d mod n. Ak sa výsledok rovná 1 alebo n-1, číslo sa považuje za možné prvočíslo a test sa opakuje s iným číslom a. Ak sa výsledok nerovná ani 1 ani n-1, prechádza sa cez cyklus, kde sa výpočet opakuje s výsledkom predchádzajúceho výpočtu, kým sa neobjaví výsledok n-1 alebo kým sa nevykoná r-1 iterácií. Ak sa v cykle nedosiahne výsledok n-1, číslo sa považuje za zložené.
Parameters
- n: Testované číslo.
- k: Počet iterácií Miller-Rabin testu.
Returns
Existencia prvočísla.