Miller-Rabin-Test

Transcrição

Miller-Rabin-Test
Miller-Rabin-Demo
with Statistics : with numtheory : with LinearAlgebra :
Miller-Rabin-Test
MRsteps dproc N, aa
#
# 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 Euklid-(ggT)-Zeuge oder ein Fermat-Zeuge
# für die Zusammengesetzheit ist.
# Diese Version print-protokolliert alle
# Schritte des Verfahrens.
#
local odd, a, b, e, ee;
#
if irem N, aa = 0 then RETURN true, `composite:divisibility-yes`
end if;
#
if mod N, 2 = 0 or 1 ! igcd N, aa then RETURN true, `composite:euklid-yes`
#
odd d N K1;
e d 0;
while mod odd, 2 = 0 do
odd d odd / 2;
e d eC1
end do;
b dmod aa &^ odd, N ;
print Zerlegung von NK1:, N K 1 ='odd 2e ','odd'= odd,'e'= e ;
print `a =`, aa ;
if `mod` b, N = 1 then RETURN false, no end if;
for ee to e do
ee K 1
ee K 1
print 'b'2
= 'a'odd$2
, `mod N =`, b ;
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 dmod b &^ 2, N
end do;
e
e
print 'b'2 = 'a'odd$2 , `mod N =`, b ;
if mod b K 1, N = 0 then
end if;
RETURN
true, `composite:MR-yes`
else
RETURN
end if
end proc:
true, `composite:fermat-yes`
N=25
> MRsteps 25, 2
Zerlegung von N-1:, 24 = odd 2e, odd = 3, e = 3
a =, 2
b = a3 , mod N =, 8
b2 = a6 , mod N =, 14
b4 = a12 , mod N =, 21
b8 = a24 , mod N =, 16
true, composite:fermat-yes
> MRsteps 25, 7
(1.1.1.1)
Zerlegung von N-1:, 24 = odd 2e, odd = 3, e = 3
a =, 7
b = a3 , mod N =, 18
> MRsteps 25, 5
b2 = a6 , mod N =, 24
false, no
(1.1.1.2)
true, composite:divisibility-yes
(1.1.1.3)
N=2047
> MRsteps 2047, 2
Zerlegung von N-1:, 2046 = odd 2e, odd = 1023, e = 1
a =, 2
false, no
(1.1.2.1)
> MRsteps 2047, 3
Zerlegung von N-1:, 2046 = odd 2e, odd = 1023, e = 1
a =, 3
b = a1023 , mod N =, 1565
b2 = a2046 , mod N =, 1013
true, composite:fermat-yes
(1.1.2.2)
> MRsteps 2047, 10
Zerlegung von N-1:, 2046 = odd 2e, odd = 1023, e = 1
a =, 10
(1.1.2.3)
b = a1023 , mod N =, 1034
b2 = a2046 , mod N =, 622
true, composite:fermat-yes
> ifactor 2047
23
89
(1.1.2.3)
(1.1.2.4)
N=341
> MRsteps 341, 2
Zerlegung von N-1:, 340 = odd 2e, odd = 85, e = 2
a =, 2
b = a85 , mod N =, 32
b2 = a170 , mod N =, 1
true, composite:MR-yes
(1.1.3.1)
> MRsteps 341, 3
Zerlegung von N-1:, 340 = odd 2e, odd = 85, e = 2
a =, 3
b = a85 , mod N =, 254
b2 = a170 , mod N =, 67
b4 = a340 , mod N =, 56
true, composite:fermat-yes
> MRsteps 341, 16
Zerlegung von N-1:, 340 = odd 2e, odd = 85, e = 2
a =, 16
false, no
> ifactor 341
11
31
(1.1.3.2)
(1.1.3.3)
(1.1.3.4)
N=561
> MRsteps 561, 2
Zerlegung von N-1:, 560 = odd 2e, odd = 35, e = 4
a =, 2
b = a35 , mod N =, 263
b2 = a70 , mod N =, 166
b4 = a140 , mod N =, 67
b8 = a280 , mod N =, 1
true, composite:MR-yes
(1.1.4.1)
> MRsteps 561, 3
> ifactor 561
true, composite:divisibility-yes
3
11
17
(1.1.4.2)
(1.1.4.3)
N=1117
> MRsteps 1117, 2
Zerlegung von N-1:, 1116 = odd 2e, odd = 279, e = 2
a =, 2
b = a279 , mod N =, 214
b2 = a558 , mod N =, 1116
false, no
(1.1.5.1)
> MRsteps 1117, 5
Zerlegung von N-1:, 1116 = odd 2e, odd = 279, e = 2
a =, 5
b = a279 , mod N =, 214
> isprime 1117
b2 = a558 , mod N =, 1116
false, no
(1.1.5.2)
true
(1.1.5.3)
(1.1.5.3)
Zeugenmengen (Div, Euklid, Fermat, Miller-Rabin)
Dwitness d proc N
#
#` `Teilbarkeitszeugen für N
#
divisors N minus 1, N ;
end proc:
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 proc:
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 proc:
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 dmod 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 proc:
MRwitness d proc N
#
# Miller-Rabin-Zeugen für N
#
remove x/has MRW N, x , false , seq 2 ..N K 1
end proc:
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=14
> N d 14
> Dwitness N
> Ewitness N
> Fwitness N
> MRwitness N
N := 14
(1.2.1.1)
2, 7
(1.2.1.2)
2, 4, 6, 7, 8, 10, 12
(1.2.1.3)
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
(1.2.1.4)
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
(1.2.1.5)
N := 15
(1.2.2.1)
3, 5
(1.2.2.2)
N=15
> N d 15
> Dwitness N
> Ewitness N
(1.2.2.3)
> Fwitness N
> MRwitness N
3, 5, 6, 9, 10, 12
(1.2.2.3)
2, 3, 5, 6, 7, 8, 9, 10, 12, 13
(1.2.2.4)
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
(1.2.2.5)
17
(1.2.3.1)
N=17
N d 17
Dwitness N
(1.2.3.2)
Ewitness N
(1.2.3.3)
Fwitness N
(1.2.3.4)
MRwitness N
(1.2.3.5)
N=25
N d 25
25
(1.2.4.1)
5
(1.2.4.2)
5, 10, 15, 20
(1.2.4.3)
Dwitness N
Ewitness N
Fwitness N
2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23
MRwitness N
2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23
(1.2.4.4)
(1.2.4.5)
N=105
N d 105
105
(1.2.5.1)
3, 5, 7, 15, 21, 35
(1.2.5.2)
Dwitness N
Ewitness N
3, 5, 6, 7, 9, 10, 12, 14, 15, 18, 20, 21, 24, 25, 27, 28, 30, 33, 35, 36, 39, 40, 42, 45, (1.2.5.3)
48, 49, 50, 51, 54, 55, 56, 57, 60, 63, 65, 66, 69, 70, 72, 75, 77, 78, 80, 81, 84,
85, 87, 90, 91, 93, 95, 96, 98, 99, 100, 102
Fwitness N
2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28,
(1.2.5.4)
(1.2.5.4)
30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 63, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 77, 78,
79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 91, 93, 94, 95, 96, 98, 99, 100, 101,
102, 103
MRwitness N
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, (1.2.5.5)
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103
Vergleich der Größe von Zeugenmengen (D,E,F,MR)
> comparew 14
> comparew 15
> comparew 16
> comparew 17
> comparew 25
> comparew 30
> comparew 105
> comparew 169
> comparew 561
> comparew 1105
> comparew 1729
2, 7, 12, 12
(1.2.6.1)
2, 6, 10, 12
(1.2.6.2)
3, 7, 14, 14
(1.2.6.3)
0, 0, 0, 0
(1.2.6.4)
1, 4, 20, 20
(1.2.6.5)
6, 21, 28, 28
(1.2.6.6)
6, 56, 88, 102
(1.2.6.7)
1, 12, 156, 156
(1.2.6.8)
6, 240, 240, 550
(1.2.6.9)
6, 336, 336, 1074
(1.2.6.10)
6, 432, 432, 1566
(1.2.6.11)
(1.2.6.11)
Veranschaulichung
wit :=proc N
dw N ,
ew N K dw N ,
fw N K ew N ,
mrw N K fw N ,
N K2 Kmrw N
# D-Zeugen weiss
# E-Zeugen, die keine D-Zeugen sind gelb
# F-Zeugen, die keine E-Zeugen sind rot
# MR-Zeugen, die keine F-Zeugen sind grün
# Zahlen, die keine MR-Zeugen sind blau
end proc:
Intervall N=550..560
> W1 d Transpose Matrix
W1 :=
seq wit N , N = 550 ..600
5 x 51 Matrix
Data Type: anything
Storage: rectangular
Order: Fortran_order
> ColumnGraph convert W1, listlist ,
format = stacked, scale = relative,
color = white, yellow, red, green, blue ,
gridlines
;
(1.2.7.1.1)
> select n/isprime n , seq n, n = 550 ..600
557, 563, 569, 571, 577, 587, 593, 599
(1.2.7.1.2)
Intervall N=1100..1150
> W2 d Transpose Matrix
W2 :=
seq wit N , N = 1100 ..1150
5 x 51 Matrix
Data Type: anything
Storage: rectangular
Order: Fortran_order
> ColumnGraph convert W2, listlist ,
format = stacked, scale = relative,
color = white, yellow, red, green, blue ,
gridlines
;
(1.2.7.2.1)
> select n/isprime n , seq n, n = 1100 ..1150
1103, 1109, 1117, 1123, 1129
(1.2.7.2.2)
Intervall N= 1750..1800
> W3 d Transpose Matrix
W3 :=
seq wit N , N = 1750 ..1800
5 x 51 Matrix
Data Type: anything
Storage: rectangular
Order: Fortran_order
> ColumnGraph convert W3, listlist ,
format = stacked, scale = relative,
color = white, yellow, red, green, blue ,
gridlines
;
(1.2.7.2.1.1)
> select n/isprime n , seq n, n = 1750 ..1800
1753, 1759, 1777, 1783, 1787, 1789
(1.2.7.2.1.2)
(1.2.7.2.1.2)
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 d 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:
> N d 230 C 7
> isprime N
> MRtest N, 1
> N d 230 K 5
> isprime N
> ifactor N
> MRtest N, 1
N := 1073741831
(1.3.1)
true
(1.3.2)
"probably prime"
(1.3.3)
N := 1073741819
(1.3.4)
false
(1.3.5)
361651
2969
"composite"
> N d 1543595161734337272040623416173
N := 1543595161734337272040623416173
> MRtest N, 1
> isprime N
"composite"
(1.3.6)
(1.3.7)
(1.3.8)
(1.3.9)
(1.3.10)
false
> ifactor N
1296259731202736692042139
(1.3.11)
> N d 1543595161734337272040623416341
N := 1543595161734337272040623416341
(1.3.12)
> MRtest N, 1
> isprime N
1190807
(1.3.10)
"probably prime"
(1.3.13)
true
(1.3.14)
> N d 21471 C 7
N :=
(1.3.15)
6533164924091480439086926721088748051510009147288432125761322309224\
1145392066467932718025309191959466139134777328814412279603162671383\
3953331616500727919877467489922145923548647888055286993513750595640\
0994237257065503943388340313457955349122977808237944739414705232220\
7967283527108152128376271035309099916953508202391970618502473012978\
2198989304102810726961187336086915750838690009949045882905087471011\
56140408532803655479443331038049466318855
> MRtest N, 1
"composite"
> ifactor N
Warning, computation interrupted
(1.3.16)
"Konstruktion" von MR-Primzahlen
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
N :=
(1.4.1)
65331649240914804390869267210887480515100091472884321257613223092241\
14539206646793271802530919195946613913477732881441227960316267138339\
53331616500727919877467489922145923548647888055286993513750595640099\
42372570655039433883403134579553491229778082379447394147052322207967\
28352710815212837627103530909991695350820239197061850247301297821989\
89304102810726961187336086915750838690009949045882905087471011561404\
08532803655479443331038049466318855
> findnextprime N, 2
(1.4.2)
65331649240914804390869267210887480515100091472884321257613223092241\
14539206646793271802530919195946613913477732881441227960316267138339\
53331616500727919877467489922145923548647888055286993513750595640099\
42372570655039433883403134579553491229778082379447394147052322207967\
28352710815212837627103530909991695350820239197061850247301297821989\
89304102810726961187336086915750838690009949045882905087471011561404\
08532803655479443331038049466320411, 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
20191, false , 20461, false , 20591, false , 20591, false , 20591, false , 20591, (1.4.3)
false , 23047, false , 23521, false , 23651, false , 24301, false , 24589,
false , 24641, false , 24727, false , 25829, false , 26455, false , 26599,
false , 28121, false , 28981, false , 30751, false , 33007, false , 34861,
false , 35371, false , 35659, false , 35785, false , 36661, false , 37081,
false , 38661, false
> IntervallTest 10000, 20000, 2
23521, false , 24727, false , 29341, false
> IntervallTest 10000, 20000, 3
>
(1.4.4)
(1.4.5)