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:
|
||||
return a, 1, 0
|
||||
dzielnik,x,y = nwd(b,a%b)
|
||||
returned_y = x - (x//y)*y
|
||||
returned_x = y
|
||||
return dzielnik,returned_x,returned_y
|
||||
return (a, mpz(1), mpz(0))
|
||||
else:
|
||||
gcd, x1, y1 = extended_gcd(b, a % b)
|
||||
x = y1
|
||||
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()
|
||||
b = input()
|
||||
a,b = mpz(a),mpz(b)
|
||||
a = input("Podaj podstawę (b): ")
|
||||
b = input("Podaj wykładnik (k): ")
|
||||
n = input("Podaj moduł (n): ")
|
||||
|
||||
wynik = 1
|
||||
baza = a
|
||||
a = mpz(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):
|
||||
wynik = wynik * baza
|
||||
baza = baza * baza
|
||||
wynik = (wynik * baza) % n
|
||||
baza = (baza * baza) % n
|
||||
|
||||
|
||||
print(wynik)
|
||||
print(f"Wynik: {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