Deine Exponentation scheint mir nicht richtig zu sein. Hier mal die beiden möglichen Varianten. Beachte auch das diese Verfahren nur mit M,B < 2^16 korrekt arbeiten können. Wird stattdessen Int64 benutzt so liegt die Schranke bei 2^31. Größere Zahlen erzeugen in den Multiplikationen Überläufe.
Exponent E mus größer 1 sein, es sind also keine speziellen Abfragen drin für E <= 0 !
Delphi-Quellcode:
function ExpModLR(B,E,M: Integer): Integer;
// Bottomup Exponentation, wie im PDF beschrieben
var
T: Integer;
begin
Result := 1;
T := B;
while E > 1
do
begin
T := (T * T)
mod M;
E := E
shr 1;
if Odd(E)
then Result := (Result * T)
mod M;
end;
end;
function ExpModRL(B,E,M: Integer): Integer;
// Topdown Exponentation, wie die meisten math. Bibliotheken sie nutzen
// Beachte Basis B bleibt konstant, dadurch sind spezielle Optimierungen möglich.
// Es wird eine Multiplikation weniger durchgeführt als obige Exponentation
// Die Abfragen Log2(E) und IsBitSet(E) sind in math. Bibliotheken sehr effizient
// durchzuführen. Dadurch wird Exponent E ebenfalls konstant.
function Lg2(V: Cardinal): Integer;
// Result := Trunc(Log2(V))
asm
BSR EAX,EAX
end;
{begin
Result := 0;
while V > 1 do
begin
Inc(Result);
V := V shr 1;
end;
end;}
function IsBitSet(V: Cardinal;
Index: Integer): Boolean;
asm
BT EAX,EDX
SETC AL
end;
{ begin
Result := Odd(V shr Index);
end;}
var
I: Integer;
begin
Result := B;
for I := Lg2(E) -1
downto 0
do
begin
Result := (Result * Result)
mod M;
if IsBitSet(E, I)
then
Result := (Result * B)
mod M;
end;
end;
Gruß Hagen