Hoi Andreas nocheinmal,
Siehe Beilage!
Von der Beilage
{\[Infinity], \[Infinity]} sollte es erst geben, wenn
First[n\[CircleTimes]{x, y}] == First[(n - 1)\[CircleTimes]{x, y}gilt.
Das wurde in der Beilage so implementier:
1\[CircleTimes]{x_,y_}:={x,y}
n_ \[CircleTimes]{x_,y_} := Module[{start={x,y},u,v},
{u,v} = Mod[((n-1)\[CircleTimes]{x,y})\[CirclePlus]{x,y},m];
If[u==First[start],\[GothicCapitalO],{u,v}]]
Diese u == First[start] ist falsch, weil start = {1, 2} und nicht etwa das
Ergebnis des voherigen Schrittes. Okay, statt \[CirclePlus] und
\[CircleTimes] wurden im Interesse der Kontrollierbarkeit der Definitionen
S[] und P[] gewählt und dann ist S[] wie in der Beilage:
In[1]:= a=5;b=21;m=23;\[GothicCapitalO]={\[Infinity],\[Infinity]};
In[86]:= Clear[S]
(* a, b, m injected from global definitions *)
S[{x1_,y1_},{x2_,y2_}]:=
If[((x1==\[Infinity] \[And]y1==\[Infinity])\[Or](Mod[y1^2,m]==Mod[x1^3+a
x1+b,m]))\[And]
((x2==\[Infinity]\[And]y2==\[Infinity])\[Or](Mod[y2^2,m]==Mod[x2^3+a
x2+b,m])),
Which[
{x1,y1}=={\[Infinity],\[Infinity]},{x2,y2},
{x2,y2}=={\[Infinity],\[Infinity]},{x1,y1},
Mod[x1,m]==Mod[x2 ,m]\[And]Mod[y1+y2,m]==0,{\[Infinity],\[Infinity]},
Mod[x1,m]!=Mod[x2,m],Module[{
\[Lambda]=Mod[(y2-y1),m]PowerMod[x2-x1,-1,m], \[Nu], x3},
\[Nu]=Mod[y1-\[Lambda] x1,m];
x3=Mod[\[Lambda]^2-x1-x2,m];
{x3,Mod[-(\[Lambda] x3+\[Nu]),m]}
],
Mod[x1,m]==Mod[x2,m] \[And]
Mod[y1,m]==Mod[y2,m]!=0,Module[{\[Lambda]=Mod[3x1^2+a,m]PowerMod[2
y1,-1,m],\[Nu], x3},
\[Nu]=Mod[y1-\[Lambda] x1,m];
x3=Mod[\[Lambda]^2-x1-x2,m];
{x3,Mod[-(\[Lambda] x3+\[Nu]),m]}
],
True, "Which case not defined"
],"If case not defined"
]
und für die rekursive Definition von \CircleTimes -> P[] - so, wie sie
verbal ausgedrückt wurde - schreibt man direkt
In[123]:= Clear[P]
(* m, skriptO injected from global definitions *)
P[n_Integer /; n == 1, {x_, y_}] := {x, y}
P[n_Integer /; n > 1, {x_, y_}] := P[n, {x, y}] =
If[{u, v} = Mod[S[P[n - 1, {x, y}], {x, y}], m];
u == P[n - 1, {x, y}][[1]], \[GothicCapitalO], {u, v}]
darin braucht es keinen intrinsischen Module[] et voilà
In[127]:= Table[P[k, {1, 2}], {k, 1, 14}]
Out[127]= {{1, 2}, {2, 19}, {10, 6}, {21, 7}, {14, 12}, {9, 6}, {19,
12}, {7, 10}, {4, 17}, {20, 18}, {18, 20}, {13, 11}, {11,
2}, {\[Infinity], \[Infinity]}}
Die Periode ist nun natürlich kürzer
In[131]:= Table[P[k,{1,2}],{k,1,14}] == Table[P[k,{1,2}],{k,15,28}]
Out[131]= True
deshalb sollte man das Abbruchkriterium für P[] ersteinmal korrekt verbal
formulieren.
Schönen Sonntag && Gruss
Udo.