Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,59 @@
|
|||
function MRIsPrime(n, k)
|
||||
-- If n is prime, returns true (without fail).
|
||||
-- If n is not prime, then returns false with probability ≥ 4^(-k), true otherwise.
|
||||
-- First, deal with 1 and multiples of 2.
|
||||
if n == 1 then
|
||||
return false
|
||||
elseif n == 2 then
|
||||
return true
|
||||
elseif n%2 == 0 then
|
||||
return false
|
||||
end
|
||||
-- Now n is odd and greater than 1.
|
||||
-- Find the unique expression n = 1 + t*2^h for n, where t is odd and h≥1.
|
||||
t = (n-1)/2
|
||||
h = 1
|
||||
while t%2 == 0 do
|
||||
t = t/2
|
||||
h = h + 1
|
||||
end
|
||||
for i = 1, k do
|
||||
-- Generate a random integer between 1 and n-1 inclusive.
|
||||
a = math.random(n-1)
|
||||
-- Test whether a is an element of the set L, and return false if not.
|
||||
if not IsInL(n, a, t, h) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
-- All generated a were in the set L; thus with high probability, n is prime.
|
||||
return true
|
||||
end
|
||||
|
||||
function IsInL(n, a, t, h)
|
||||
local b = PowerMod(a, t, n)
|
||||
if b == 1 then
|
||||
return true
|
||||
end
|
||||
for j = 0, h-1 do
|
||||
if b == n-1 then
|
||||
return true
|
||||
elseif b == 1 then
|
||||
return false
|
||||
end
|
||||
b = (b^2)%n
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function PowerMod(x, y, m)
|
||||
-- Computes x^y mod m.
|
||||
local z = 1
|
||||
while y > 0 do
|
||||
if y%2 == 0 then
|
||||
x, y, z = (x^2)%m, y//2, z
|
||||
else
|
||||
x, y, z = (x^2)%m, y//2, (x*z)%m
|
||||
end
|
||||
end
|
||||
return z
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue