kryptografia/1/5.py

35 lines
828 B
Python
Raw Permalink Normal View History

2024-10-20 21:36:32 +02:00
import gmpy2
from gmpy2 import mpz
def sqrt_mod(b):
p = mpz(7)
b = mpz(b) % p
if p % 4 != 3:
raise ValueError("Liczba p musi spełniać p ≡ 3 mod 4.")
legendre_symbol = gmpy2.powmod(b, (p - 1) // 2, p)
if legendre_symbol != 1:
raise ValueError(f"{b} nie jest resztą kwadratową modulo {p}.")
exponent = (p + 1) // 4
a = gmpy2.powmod(b, exponent, p)
if (a * a) % p != b:
raise ValueError("Nie udało się znaleźć pierwiastka kwadratowego.")
return a
b_input = input("Podaj wartość b: ")
try:
b = mpz(b_input)
except ValueError:
print("Błędne dane: b musi być liczbą całkowitą.")
exit()
try:
wynik = sqrt_mod(b)
print(f"Pierwiastek kwadratowy z {b} modulo 7 to {wynik}.")
except ValueError as e:
print(e)