Wszystkie zadania z 1 zajęć

This commit is contained in:
s464968 2024-10-20 21:36:32 +02:00
parent bc08f780b7
commit 994c287af6
6 changed files with 143 additions and 19 deletions

35
1/2.py
View File

@ -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
View File

@ -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
View 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
View 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
View 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

Binary file not shown.