AG
von zur Gathen - Algorithmische Mathematik
Maple Tip 1
Im Baby-Riesen-Schritt-Algorithmus legt man eine Tabelle an, in der zu
xgj der diskrete Logarithmus j gespeichert ist.
Später möchte man in dieser Tabelle ein Gruppenelement gi2^m
in dieser Tabelle finden. Dazu muß man die Tabelle durchsuchen.
Eine Möglichkeit, das schnell zu tun, ist, die Tabelle zu sortieren
und später mit binärer Suche die Einträge zu finden.
Maple gibt uns aber eine noch effizientere Methode, die zudem auf sehr
maschinennahe Weise implementiert ist. Das folgende Beispiel nutzt eine
besondere Eigenschaft von Maple dazu aus, nämlich die Option remember
für Prozeduren. Eine Prozedur mit dieser Option sieht, wenn
sie aufgerufen wird, zuerst nach, ob sie schon einmal mit den gleichen
Argumenten aufgerufen wurde. Falls ja, wird der beim letzten Mal
berechnete Wert ausgegeben. Ansonsten wird die Prozedur ganz gewöhnlich
abgearbeitet, allerdings werden danach Argument und Ergebnis notiert (fürs
nächste Mal ...).
beispiel:=
proc(a)
local t;
t:=proc(g) option remember; FAIL; end; # Definition
g:=a;
for j to 99999 do
g:=g * g0;
t(g):=j; # Eintrag
od;
g1:=g0^100000;
g:=1;
for i do
j:=t(g); # Abruf
if not j=FAIL then break; fi;
g:=g * g1;
od;
end;
Hier wird die lokale Variable t verwendet, um die Tabelle zu verwalten.
In der Zeile Definition wird t als eine Prozedur definiert,
die immer FAIL antwortet. In der Zeile Eintrag
wird der Funktion künstlich ein Eintrag in ihre remember
Tabelle geschrieben. Wird t danach mit dem Wert g
aufgerufen, so antwortet sie nicht mit FAIL, sondern mit dem Eintrag
aus der remember Tabelle, also mit j. Und genau
so wird t dann in der Zeile Abruf verwendet. Wurde
der dortige Wert von g vorher eingetragen, so liefert t
den Wert j, der zuvor eingetragen wurde. Ansonsten liefert
t den Wert FAIL, was in unserem Fall bedeutet, daß
g nicht in der Tabelle steht.
Außer der Maschinennähe gibt es noch einen weiteren Grund,
warum das schneller ist als die obige Methode. Maple verwendet nämlich
zusätzlich Hashverfahren.
Author: Michael Nöcker
/ Michael Nüsken,
last change: 1 December 1998