Miller-Rabin-Demo

Transcrição

Miller-Rabin-Demo
Miller-Rabin-Demo
with Statistics : with numtheory : with LinearAlgebra :
Zeugenmengen (Div, Euklid, Fermat, Miller-Rabin)
Dwitness d proc N
#
#` `Teilbarkeitszeugen für N
#
divisors N minus 1, N ;
end:
Ewitness d proc N
#
#` `ggT-Zeugen für N
#
select x/evalb igcd N, x O 1 , seq a, a = 2 ..N K 1
end:
Fwitness d proc N
#
#` `Fermat-Euler-Zeugen für N
#
remove x/evalb mod x N K 1 , N = 1 , seq a, a = 2 ..N K 1
end:
MRW dproc N, a
#
# Test, ob a ein Miller-Rabin-Zeuge für die Zusammengesetztheit
# von N ist: Antwort "true" besagt, dass das der Fall ist.
# Bei der Ausgabe wird noch angezeigt, ob a schon ein ggT-Zeuge
# oder eine Fermat-Zeuge für die Zusammengesetzheit ist.
#
local odd, b, e, ee;
#
if `mod` N, 2 = 0 or 1 ! igcd N, a then
RETURN true, `composite:euklid-yes`
end if;
odd := N K 1;
e := 0;
while `mod` odd, 2 = 0 do
odd := odd / 2;
e := e C 1
end do;
b := `mod` a &^ odd, N ;
if `mod` b, N = 1 then
RETURN false, no
end if;
for ee to e do
if `mod` b C 1, N = 0 then
RETURN false, no
end if;
if `mod` b K 1, N = 0 then
RETURN true, `composite:MR-yes`
end if;
b := `mod` b &^ 2, N
end do;
if `mod` b K 1, N = 0 then
RETURN true, `composite:MR-yes`
else
RETURN true, `composite:fermat-yes`
end if
end:
MRwitness d proc N
#
# Miller-Rabin-Zeugen für N
#
remove x/has MRW N, x , false , seq 2 ..N K 1
end:
dw d N/nops Dwitness N
:
ew d N/nops Ewitness N
:
fw d N/nops Fwitness N
:
mrw d N/nops MRwitness N
:
comparew d N/ dw N , ew N , fw N , mrw N
:
N d 14
14
(1.1.1)
2, 7
(1.1.2)
2, 4, 6, 7, 8, 10, 12
(1.1.3)
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
(1.1.4)
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
(1.1.5)
15
(1.1.6)
Dwitness N
Ewitness N
Fwitness N
MRwitness N
N d 15
Dwitness N
3, 5
(1.1.7)
3, 5, 6, 9, 10, 12
(1.1.8)
2, 3, 5, 6, 7, 8, 9, 10, 12, 13
(1.1.9)
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
(1.1.10)
17
(1.1.11)
Ewitness N
Fwitness N
MRwitness N
N d 17
Dwitness N
(1.1.12)
Ewitness N
(1.1.13)
Fwitness N
(1.1.14)
MRwitness N
(1.1.15)
comparew 14
2, 7, 12, 12
(1.1.16)
2, 6, 10, 12
(1.1.17)
3, 7, 14, 14
(1.1.18)
0, 0, 0, 0
(1.1.19)
1, 4, 20, 20
(1.1.20)
6, 21, 28, 28
(1.1.21)
6, 56, 88, 102
(1.1.22)
1, 12, 156, 156
(1.1.23)
6, 240, 240, 550
(1.1.24)
6, 336, 336, 1074
(1.1.25)
6, 432, 432, 1566
(1.1.26)
comparew 15
comparew 16
comparew 17
comparew 25
comparew 30
comparew 105
comparew 169
comparew 561
comparew 1105
comparew 1729
wit d proc N
dw N , ew N K dw N , fw N K ew N , mrw N K fw N , N K 2 K mrw N
end:
W d Transpose Matrix
seq wit N , N = 500 ..600
;
5 x 101 Matrix
Data Type: anything
Storage: rectangular
(1.1.27)
Order: Fortran_order
ColumnGraph convert W, listlist , format = stacked, scale = relative, color = white, yellow,
red, green, blue , gridlines
weiss : D-Zeugen
gelb : E-Zeugen, die keine D-Zeugen sind
rot : F-Zeugen, die keine E-Zeugen sind
grün : MR-Zeugen, die keine F-Zeugen sind
blau : Zahlen, die keine MR-Zeugen sind
Miller-Rabin-Test (probabilistisch)
MRtest dproc N, k
#
#` `MR-Primzahltest für N
# basierend auf der zufälligen Auswahl von k
# Kandidaten, die als Zeugen für die
# Zusammengesetztheit von überprüft werden.
# "true": es wurde ein Zeuge für die
#
Zusammengesetzheit von N gefunden
# "false": keiner der k Kandidaten ist
#
Zeuge - daher: N ist "probable prime"
#
mit Fehlerwahrscheinlichkeit 2^(-k)
local x, s, j;
#
x d rand 2 ..N K 1 ;
s := seq x , j = 1 ..k ;
for j to k do
if has MRW N, op j, s , true then
RETURN "composite"
end if
end do;
RETURN "probably prime"
end proc:
N d 230 C 7
1073741831
(1.2.1)
true
(1.2.2)
"probably prime"
(1.2.3)
1073741819
(1.2.4)
false
(1.2.5)
isprime N
MRtest N, 1
N d 230 K 5
isprime N
ifactor N
361651
2969
(1.2.6)
MRtest N, 1
"composite"
N d 1543595161734337272040623416173
1543595161734337272040623416173
MRtest N, 1
"composite"
(1.2.7)
(1.2.8)
(1.2.9)
ifactor N
1190807
1296259731202736692042139
(1.2.10)
N d 21471 C 7
653316492409148043908692672108874805151000914728843212576132230922411453\ (1.2.11)
92066467932718025309191959466139134777328814412279603162671383395333\
16165007279198774674899221459235486478880552869935137505956400994237\
25706550394338834031345795534912297780823794473941470523222079672835\
27108152128376271035309099916953508202391970618502473012978219898930\
41028107269611873360869157508386900099490458829050874710115614040853\
2803655479443331038049466318855
isprime N
false
(1.2.12)
MRtest N, 1
"composite"
(1.2.13)
"Konstruktion" von Primzahlen mittels MR-Test
findnextprime d proc n, k
#
# Mittels MR-Test wird die kleinste
# "probable" Primzahl, die gösser als n ist,
# gefunden,
# k Parameter für Anzahl der Kandidaten wie in MRtest
#
local N;
#
if `mod` n, 2 = 0 then
N := n C 1
else
N := n
end if;
while MRtest N, k = "composite" do
N := N C 2
end do;
RETURN N, isprime N
end proc:
N d 21471 C 7
6533164924091480439086926721088748051510009147288432125761322309224114539\ (1.3.1)
206646793271802530919195946613913477732881441227960316267138339533316\
165007279198774674899221459235486478880552869935137505956400994237257\
065503943388340313457955349122977808237944739414705232220796728352710\
815212837627103530909991695350820239197061850247301297821989893041028\
107269611873360869157508386900099490458829050874710115614040853280365\
5479443331038049466318855
findnextprime N, 2
(1.3.2)
653316492409148043908692672108874805151000914728843212576132230922411\
453920664679327180253091919594661391347773288144122796031626713833953\
331616500727919877467489922145923548647888055286993513750595640099423\
725706550394338834031345795534912297780823794473941470523222079672835\
271081521283762710353090999169535082023919706185024730129782198989304\
102810726961187336086915750838690009949045882905087471011561404085328\
03655479443331038049466320411, true
IntervallTest dproc n, N, k
#
# findet "probable primes" im Intervall 2nC1 bis 2NC1
# und vergleicht mit Maples Primzahl-Testprozedur.
# Nur die fehlerhaften "Primzahlen" werden angezeigt.
#
select has, seq findnextprime 2 * j C 1, k , j = n ..N , false
end proc:
IntervallTest 10000, 20000, 1
20591, false , 20845, false , 22177, false , 22213, false , 22603, false , 22849, (1.3.3)
false , 22841, false , 23521, false , 23711, false , 24643, false , 24649, false ,
25207, false , 26281, false , 26281, false , 28421, false , 30301, false ,
31417, false , 31621, false , 31621, false , 31753, false , 32551, false ,
37901, false , 38491, false , 38503, false , 38963, false , 39277, false ,
39601, false
IntervallTest 10000, 20000, 2
31621, false , 38503, false
(1.3.4)
IntervallTest 10000, 20000, 3
(1.3.5)