Periodenbestimmung der Funktion k -> a^k mod N mittels FouriertransformationAnwendung auf die Faktorisierung ganzer Zahlen (Shors Algorithmus)with(numtheory):omegalist := proc (m)
#
# Numerische Berechung der komplexen m-ten Einheitswurzeln
#
local omega;
option remember;
omega := exp(2*Pi*I/m);
[seq(evalf(omega^k),k=0..m-1)];
end:omegalist(16);period := proc(N,m,a,p)
#
# N : die zu faktorisierende Zahl f\374r den Shor-Algorithmus
# m : Potenz von 2 f\374r Fourier-Transformation (es sollte N^2 < m < 2 N^2 sein)
# a : Element von Z_N, dessen Ordnung mod N
# (= Periodenl\344nge der Funktion k -> a^k mod N)
# bestimmt werden soll
# p : Periode in der Fourier-Transformierten
#
# liefert die Wahrscheinlichkeit, dass Periode p gemessen wird
#
local ol;
ol := omegalist(m);
norm(map(evalf,collect(add(ol[p*k mod m + 1]*X^(a^k mod N),k=0..m-1),X)),2)^2/m^2;
end:testperiod := proc (N,m,a)
#
# Summe der Wahrscheinlichkeiten
#
add(period(N,m,a,p),p=0..m-1)
end:testperiod(17,32,5);display_period := proc(N,m,a)
#
# Spektrogramm der Periodenmessung f\374r k -> a^k mod N
#
[seq([p,period(N,m,a,p)],p=0..m-1)];
plot(%);
end:Faktorisierung von N=35Daten: a=2, m=256display_period(35,256,2);Beispiele f\374r Messwerte: y = 107, 159, 192, 213convert(107/256,confrac,'cvgts');cvgts;convert(159/256,confrac,'cvgts');cvgts;convert(192/256,confrac,'cvgts');cvgts;convert(213/256,confrac,'cvgts');cvgts;order(2,35);A := 2^(6) mod 35;gcd(A+1,35);gcd(A-1,35);Faktorisierung von N=35Daten: a=11, m=256display_period(35,256,11);M\366gliche Messwerte: y= 85, 171convert(85/256,confrac,'cvgts');cvgts;convert(171/256,confrac,'cvgts');cvgts;order(11,35);Dieser Wert ist f\374r die Faktorisierung nicht brauchbar!Faktorisierung von N=55
Daten : a=3, m=512display_period(55,512,3);Beispiele f\374r Messwerte: y = 179, 410, 333, 359convert(179/512,confrac,'cvgts');cvgts;convert(410/512,confrac,'cvgts');cvgts;convert(333/512,confrac,'cvgts');cvgts;convert(358/512,confrac,'cvgts');cvgts;order(3,55);A := 3^10 mod 55;gcd(A+1,55);gcd(A-1,55);