51 lines
1022 B
Python
51 lines
1022 B
Python
|
import random, copy
|
||
|
|
||
|
#sprawdza czy liczby są pierwsze
|
||
|
def fermat(dokladnosc, liczba):
|
||
|
i = 0
|
||
|
while i < dokladnosc:
|
||
|
a = random.randint(1, liczba - 1)
|
||
|
if pow(a, (liczba - 1), liczba) == 1:
|
||
|
i = i + 1
|
||
|
else:
|
||
|
return False
|
||
|
return True
|
||
|
|
||
|
#x * u + N * v = d
|
||
|
#Jeśli d == 1 to liczby są względnie pierwsze
|
||
|
#d to NWD
|
||
|
def euklides(x, N):
|
||
|
A,B,U,V = N, x, 0, 1
|
||
|
while True:
|
||
|
q = A // B
|
||
|
A_new = copy.deepcopy(B)
|
||
|
B = A - B * q
|
||
|
A = A_new
|
||
|
U_new = copy.deepcopy(V)
|
||
|
V = U - V * q
|
||
|
U = U_new
|
||
|
if B == 0:
|
||
|
break
|
||
|
d, u = A, U
|
||
|
v = (d - x * u)/N
|
||
|
return u, v, d
|
||
|
|
||
|
|
||
|
#liczba odwrotna do b w modulo n
|
||
|
def odwrotnosc(b, n):
|
||
|
u, _, d = euklides(b, n)
|
||
|
if d == 1:
|
||
|
return u % n
|
||
|
else:
|
||
|
return False
|
||
|
|
||
|
|
||
|
#potegowanie x do k w mod n
|
||
|
def potegowanieimod(x, k, n):
|
||
|
y = 1
|
||
|
while k > 0:
|
||
|
if k & 1:
|
||
|
y = y*x % n
|
||
|
x = x**2 % n
|
||
|
k = k >> 1
|
||
|
return y
|