145
2-lab/module1.py
Normal file
145
2-lab/module1.py
Normal file
@ -0,0 +1,145 @@
|
||||
import random
|
||||
|
||||
def extendedEuclidean(x, N):
|
||||
A, B = N, x
|
||||
U, V = 0, 1
|
||||
while True:
|
||||
q = A//B
|
||||
temp1, temp2 = B, A + (-q * B)
|
||||
A, B = temp1, temp2
|
||||
temp1, temp2 = V, U + (-q * V)
|
||||
U, V = temp1, temp2
|
||||
if B == 0:
|
||||
break
|
||||
d, u = A, U
|
||||
v = (d - x * u) // N
|
||||
return (u, v, d)
|
||||
|
||||
print(extendedEuclidean(10,13))
|
||||
|
||||
# Zadanie 1
|
||||
def generateRandomInteger(n, k):
|
||||
try:
|
||||
assert k > 0, "You need at least one bit to write an integer"
|
||||
assert n > 0, "Cannot divide by 0"
|
||||
if k == 1:
|
||||
minValue = 0
|
||||
maxValue = 1
|
||||
else:
|
||||
assert 2**(k-1) < n, "No numbers to choose from"
|
||||
minValue = 2**(k-1)
|
||||
maxValue = (2**k)-1
|
||||
generator = random.SystemRandom()
|
||||
while True:
|
||||
randomNumber = generator.randint(minValue, maxValue)
|
||||
if randomNumber < n:
|
||||
break
|
||||
print(randomNumber)
|
||||
except AssertionError as error:
|
||||
print("Error: {}".format(error))
|
||||
main()
|
||||
|
||||
# Zadanie 2
|
||||
def inverseValueInPhi(n, b):
|
||||
value = 0
|
||||
found = False
|
||||
for i in range(1, n):
|
||||
value = (i * b) % n
|
||||
if value == 1:
|
||||
if extendedEuclidean(n, value)[2] == 1:
|
||||
found = True
|
||||
value = i
|
||||
break
|
||||
if found:
|
||||
print("Result: {}".format(value))
|
||||
else:
|
||||
print("Result: No inverse number exists")
|
||||
|
||||
# Zadanie 3
|
||||
def exponentialSquaring(n, k, b):
|
||||
temp = 1
|
||||
while (k > 0):
|
||||
if (k % 2 != 0):
|
||||
temp = (temp * b) % n
|
||||
b = (b * b) % n
|
||||
k = k // 2
|
||||
return(temp % n)
|
||||
|
||||
# Zadanie 4
|
||||
def quadricResidue(p, b):
|
||||
try:
|
||||
assert p > 2, "p must be higher than 2"
|
||||
if exponentialSquaring(p, (p-1)/2, b) == 1:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
except AssertionError as error:
|
||||
print("Error: {}".format(error))
|
||||
main()
|
||||
|
||||
# Zadanie 5
|
||||
def squareRoot(p, b):
|
||||
try:
|
||||
assert p % 4 == 3, "p mod 4 != 3"
|
||||
assert quadricResidue(p, b), "b is not a quadric residue in p"
|
||||
print("{}" . format(p))
|
||||
for i in range(0, p):
|
||||
a = exponentialSquaring(p, (p+1)//4, i)
|
||||
print("%d %d %d" % (i, a, b, ))
|
||||
if a == b:
|
||||
return("Result: {}".format(i))
|
||||
return False
|
||||
except AssertionError as error:
|
||||
print("Error: {}".format(error))
|
||||
main()
|
||||
|
||||
# Zadanie 6
|
||||
def primalityTest(n):
|
||||
if n == 1:
|
||||
return False
|
||||
if n == 2 or n == 3:
|
||||
return True
|
||||
generator = random.SystemRandom()
|
||||
counter = generator.randint(n//2, n)
|
||||
while(counter != 0):
|
||||
b = generator.randint(2, n-2)
|
||||
if exponentialSquaring(n, n-1, b) != 1:
|
||||
return False
|
||||
counter = counter - 1
|
||||
return True
|
||||
|
||||
# User interface
|
||||
def main():
|
||||
while True:
|
||||
print("""
|
||||
Choose function:
|
||||
Type "1 n k" for generateRandomInteger(n,k)
|
||||
Type "2 n b" for inverseValueInPhi(n, b)
|
||||
Type "3 n k b" for exponentialSquaring(n, k, b)
|
||||
Type "4 p b" for quadricResidue(p, b)
|
||||
Type "5 p b" for squareRoot(p,b)
|
||||
Type "6 n" for primalityTest(n)
|
||||
Type "exit" to end program's execution
|
||||
""")
|
||||
userInput = input("Choose desired action: ")
|
||||
if userInput == "exit":
|
||||
exit()
|
||||
userInput = list(map(int, userInput.split(" ")))
|
||||
if userInput[0] == 1:
|
||||
for i in range(0, int(input("How many times to run the function?: "))):
|
||||
generateRandomInteger(userInput[1], userInput[2])
|
||||
elif userInput[0] == 2:
|
||||
inverseValueInPhi(userInput[1], userInput[2])
|
||||
elif userInput[0] == 3:
|
||||
print("Result: {}".format(exponentialSquaring(userInput[1], userInput[2], userInput[3])))
|
||||
elif userInput[0] == 4:
|
||||
print("Result: {}".format(quadricResidue(userInput[1], userInput[2])))
|
||||
elif userInput[0] == 5:
|
||||
print(squareRoot(userInput[1], userInput[2]))
|
||||
elif userInput[0] == 6:
|
||||
print("Result: {}".format(primalityTest(userInput[1])))
|
||||
else:
|
||||
print("Error: Wrong instruction. Try again")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Reference in New Issue
Block a user