133 lines
2.0 KiB
Ruby
Executable File
133 lines
2.0 KiB
Ruby
Executable File
#!/usr/bin/ruby
|
|
|
|
#####################################
|
|
#
|
|
# Marcin Woźniak
|
|
# s434812
|
|
#
|
|
# Last edit: 27-10-2020
|
|
#
|
|
#####################################
|
|
|
|
#!/usr/bin/ruby
|
|
|
|
require 'prime'
|
|
require 'openssl'
|
|
require 'securerandom'
|
|
require 'prime'
|
|
|
|
def extended_euklides(a, b)
|
|
return 1, 0 if b == 0
|
|
|
|
q, r = a.divmod b
|
|
s, t = extended_euklides(b, r)
|
|
|
|
return t, s - q * t
|
|
end
|
|
|
|
## Zad. 1.1
|
|
def random_gen_Zn(n,k)
|
|
if 2**(k-1) < n && k > 0 then
|
|
if k == 1 then
|
|
min = 0
|
|
max = 1
|
|
else
|
|
min = 2**(k-1)
|
|
max = (2**k)-1
|
|
end
|
|
end
|
|
|
|
while true do
|
|
r = rand(min..max)
|
|
if r < n then
|
|
break
|
|
end
|
|
end
|
|
|
|
return ra
|
|
|
|
end
|
|
|
|
## Zad. 1.2
|
|
def reciprocal_Phi_p(n,p)
|
|
# n mod p
|
|
u = extended_euklides(n,p)[0]
|
|
v = extended_euklides(n,p)[1]
|
|
|
|
if u * n % p == 1
|
|
puts u
|
|
else
|
|
puts v
|
|
end
|
|
end
|
|
|
|
## Zad. 1.3
|
|
def betterExponentiation(x,k,n)
|
|
b = k.to_s(2).reverse
|
|
l = b.count "[0-1]"
|
|
y = 1
|
|
i = l - 1
|
|
|
|
while i >= 0
|
|
y = y**2 % n
|
|
if b[i]=="1" then
|
|
y = y * x % n
|
|
end
|
|
i = i - 1
|
|
end
|
|
return y
|
|
end
|
|
|
|
## Zad. 1.4
|
|
def remSqEuler(a,p)
|
|
ans = betterExponentiation(a,(p-1)/2,p)
|
|
|
|
if ans == 1 && Prime.prime?(p) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
## Zad. 1.5
|
|
def squareRootFp(p,b)
|
|
if p % 4 == 3 && remSqEuler(p,b) == true then
|
|
for i in 1..p
|
|
a = betterExponentiation(i, (p+1)/4, p)
|
|
#puts i.inspect + " " + a.inspect + "=" + b.inspect
|
|
if a == b then
|
|
puts i
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
## Zad. 1.6
|
|
def primalityTest(n)
|
|
if n == 1 then
|
|
return false
|
|
end
|
|
|
|
if n == 2 || n == 3 then
|
|
return true
|
|
end
|
|
|
|
counter = rand(3..n)
|
|
while (counter != 0) do
|
|
b = rand(2..n-2) # Tez dziala n-1
|
|
if betterExponentiation(b,n-1,n) != 1 then
|
|
return false
|
|
end
|
|
counter = counter - 1
|
|
end
|
|
return true
|
|
end
|
|
|
|
#1 puts random_gen_Zn(50,3)
|
|
#2 puts reciprocal_Phi_p(5,7)
|
|
#3 puts betterExponentiation(24637864786278436723,10,3)
|
|
#4 puts remSqEuler(5,13)
|
|
#5 puts squareRootFp(7,2)
|
|
#6 puts primalityTest(13)
|