35 lines
828 B
Python
35 lines
828 B
Python
|
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)
|