DMUG-Archiv 2009

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: rekursive Definition

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.


Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html