Wszystkie zadania z 1 zajęć
This commit is contained in:
parent
bc08f780b7
commit
994c287af6
35
1/2.py
35
1/2.py
@ -1,11 +1,30 @@
|
|||||||
#TODO: DOKOŃCZYĆ
|
from gmpy2 import mpz
|
||||||
|
|
||||||
def nwd(a, b):
|
def extended_gcd(a, b):
|
||||||
if b == 0:
|
if b == 0:
|
||||||
return a, 1, 0
|
return (a, mpz(1), mpz(0))
|
||||||
dzielnik,x,y = nwd(b,a%b)
|
else:
|
||||||
returned_y = x - (x//y)*y
|
gcd, x1, y1 = extended_gcd(b, a % b)
|
||||||
returned_x = y
|
x = y1
|
||||||
return dzielnik,returned_x,returned_y
|
y = x1 - (a // b) * y1
|
||||||
|
return (gcd, x, y)
|
||||||
|
|
||||||
print(nwd(13.0,5.0))
|
def modinv(b, n):
|
||||||
|
gcd, x, y = extended_gcd(b, n)
|
||||||
|
if gcd != 1:
|
||||||
|
raise ValueError(f"Odwrotność modulo nie istnieje, ponieważ gcd({b}, {n}) = {gcd} ≠ 1.")
|
||||||
|
else:
|
||||||
|
return x % n
|
||||||
|
|
||||||
|
n = mpz(input("Podaj n: "))
|
||||||
|
b = mpz(input("Podaj b: "))
|
||||||
|
|
||||||
|
try:
|
||||||
|
inverse = modinv(b, n)
|
||||||
|
print(f"Odwrotność {b} modulo {n} to {inverse}.")
|
||||||
|
if (b * inverse) % n == 1:
|
||||||
|
print(f"Sprawdzenie: ({b} * {inverse}) mod {n} = 1\n")
|
||||||
|
else:
|
||||||
|
print("Błąd w obliczeniach.\n")
|
||||||
|
except ValueError as e:
|
||||||
|
print(f"Dla b = {b}, n = {n}: {e}\n")
|
24
1/3.py
24
1/3.py
@ -1,17 +1,19 @@
|
|||||||
from gmpy2 import *
|
from gmpy2 import mpz
|
||||||
|
|
||||||
a = input()
|
a = input("Podaj podstawę (b): ")
|
||||||
b = input()
|
b = input("Podaj wykładnik (k): ")
|
||||||
a,b = mpz(a),mpz(b)
|
n = input("Podaj moduł (n): ")
|
||||||
|
|
||||||
wynik = 1
|
a = mpz(a)
|
||||||
baza = a
|
b = mpz(b)
|
||||||
|
n = mpz(n)
|
||||||
|
|
||||||
|
wynik = mpz(1)
|
||||||
|
baza = a % n
|
||||||
|
|
||||||
for i in range(0,b.bit_length()):
|
for i in range(b.bit_length()):
|
||||||
if b.bit_test(i):
|
if b.bit_test(i):
|
||||||
wynik = wynik * baza
|
wynik = (wynik * baza) % n
|
||||||
baza = baza * baza
|
baza = (baza * baza) % n
|
||||||
|
|
||||||
|
print(f"Wynik: {wynik}")
|
||||||
print(wynik)
|
|
35
1/4.py
Normal file
35
1/4.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import gmpy2
|
||||||
|
from gmpy2 import mpz
|
||||||
|
|
||||||
|
def is_quadratic_residue(b, p):
|
||||||
|
b = mpz(b)
|
||||||
|
p = mpz(p)
|
||||||
|
|
||||||
|
if b % p == 0:
|
||||||
|
return True
|
||||||
|
|
||||||
|
e = (p - 1) // 2
|
||||||
|
result = gmpy2.powmod(b, e, p)
|
||||||
|
|
||||||
|
if result == 1:
|
||||||
|
return True
|
||||||
|
elif result == p - 1:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
p = mpz(11)
|
||||||
|
b_input = input("Podaj wartość b: ")
|
||||||
|
try:
|
||||||
|
b = mpz(b_input)
|
||||||
|
except ValueError:
|
||||||
|
print("Błędne dane: b musi być liczbą całkowitą.")
|
||||||
|
exit()
|
||||||
|
|
||||||
|
if b < 0 or b >= p:
|
||||||
|
print("Błędne dane: b musi być w zakresie 0 <= b < p.")
|
||||||
|
else:
|
||||||
|
if is_quadratic_residue(b, p):
|
||||||
|
print(f"{b} jest resztą kwadratową modulo {p}.")
|
||||||
|
else:
|
||||||
|
print(f"{b} nie jest resztą kwadratową modulo {p}.")
|
35
1/5.py
Normal file
35
1/5.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
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)
|
33
1/6.py
Normal file
33
1/6.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import gmpy2
|
||||||
|
from gmpy2 import mpz, random_state, mpz_random, powmod
|
||||||
|
|
||||||
|
def is_prime_fermat(n, k=5):
|
||||||
|
n = mpz(n)
|
||||||
|
|
||||||
|
if n <= 1:
|
||||||
|
return False
|
||||||
|
if n == 2:
|
||||||
|
return True
|
||||||
|
if n % 2 == 0:
|
||||||
|
return False
|
||||||
|
|
||||||
|
rand_state = random_state()
|
||||||
|
|
||||||
|
for _ in range(k):
|
||||||
|
a = mpz_random(rand_state, n - 3) + 2
|
||||||
|
result = powmod(a, n - 1, n)
|
||||||
|
if result != 1:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
n_input = input("Podaj liczbę n do przetestowania: ")
|
||||||
|
try:
|
||||||
|
n = mpz(n_input)
|
||||||
|
except ValueError:
|
||||||
|
print("Błędne dane: n musi być liczbą całkowitą.")
|
||||||
|
exit()
|
||||||
|
|
||||||
|
if is_prime_fermat(n):
|
||||||
|
print(f"{n} jest prawdopodobnie liczbą pierwszą.")
|
||||||
|
else:
|
||||||
|
print(f"{n} jest liczbą złożoną.")
|
BIN
miniprojekt_nr1.pdf
Normal file
BIN
miniprojekt_nr1.pdf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user