Klingt irgendwie etwas komplizierter als es ist.
Aufgrund gültiger Restklassenarithmetik sind folgende Ausdrücke identisch. Dabei nehme ich zur besseren Veranschaulichung als Exponent 4 anstatt 77:
(89^4) mod 221
= 62742241 mod 221
= 120
( ((89 * 89) mod 221) * ((89 * 89) mod 221) ) mod 221
= ( (7921 mod 221) * (7921 mod 221) ) mod 221
= (186 * 186) mod 221
= 34596 mod 221
= 120
( ((89^2) mod 221) * 89 * 89 ) mod 221
= ( (7921 mod 221) * 89 * 89 ) mod 221
= (186 * 89 * 89) mod 221
= 1473306 mod 221
= 120
Genug der Beispiele. Es sollte deutlich werden, dass zu jedem Zeitpunkt der Multiplikationen (also zwischendurch) ein Zwischenergebnis modulo 221 genommen werden kann, um die Zwischenergebnisse klein zu halten.
Auf die Eingangsfrage bezogen bedeutet das, dass man die 89 nicht erst 77 mal mit sich selbst multiplizieren und erst dann modulo 221 nehmen muss, sondern man kann jederzeit schon die Zwischenergebnisse modulo 221 nehmen. Dadurch hält man die Zahl klein und für den Computer "handlich".
Das kann man auf die Spitze treiben, indem man das nach
jedem Multiplikationsschritt macht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function MonsterMod(aBas, aExp, aMod : integer) : integer; var i : integer; E : integer; begin E:=aBas; for i := 2 to aExp do E:=(E*aBas) mod aMod; Result:=E; end;
MySolution := MonsterMod(89,77,221); |
//Nachtrag:
Wie witzig ... erst schreibt keiner, dann Alle.
Man sollte, während man ein Posting verfasst, nicht zwischendurch ans Telefon gehen.
