Das große Problem an den meisten bereits geposteten Lösungen ist, dass sie Kenntnis des Eins-Elements des Rings der ganzen Zahlen voraussetzen. Davon kann aber keinesfalls ausgegangen werden! Ich schlage daher vor, das Eins-Element zunächst mit einem geeigneten Satzes zu finden - meiner Meinung nach bietet sich besonders der Kleine Satz von Fermat an.
Delphi-Quellcode:
var p, a, Eins: Cardinal;
repeat
p := Random(High(Cardinal));
until IsPrime(p);
repeat
a := Random(High(Cardinal));
until (a mod p) <> 0;
Eins := ModPower(a, p-1, p); //a^(p-1) ist kongruent zu 1 modulo p
Eine schöne Alternative zu den bisher vorgestellten Lösungen bietet der Satz von Wilson.
Delphi-Quellcode:
var p, res: Cardinal;
repeat
p := Random(High(Cardinal));
until IsPrime(p);
res := (Fakultaet(p - 1) mod p - p);
Result := Zahl * res;