Guten Abend zusammen,
da ich gerne einen Primitivwurzeltest in C# selbst implementieren würde und das auch schon soweit tut bis zu einer bestimmten Größe, die dummerweise vom Datentyp long begrenzt wird, muss ich mich jetzt hier mal hilfesuchend melden.
Es gibt zwar noch die Möglichkeit wie ich gesehen habe BigInteger zu verwenden , meine Frage nun, gibt es eine weitere Möglichkeit (byte array etc) die Ergebnisse beim Exponenzieren zu speichern?
Oder habe ich beim Exponenzieren eine Umformung übersehen bzw. kann ich das Modulo früher mit einbauen um die zu exponenzierenden Zahlen kleiner zu halten?
- public long lowestPrimRoot(long p)//p ist die gewählte Primzahl
- {
- long sol = 0;
- long potenz = p - 2;
- for (long i = 1; i <= potenz; i++)
- {
- if (primRootTest(p, i))
- {
- sol = i;
- break;
- }
- }
- return sol;
- }
- private Boolean isPrimRoot(long p,long toTest)// toTest die aktuell gewählte "mögliche" Primitivwurzel
- {
- long phi = p-2;
- for(int i = 1; i<p-2;i++)
- {
- long tmp = (long)Math.Round((float)phi / (float)i, 0, MidpointRounding.AwayFromZero); ;
- long tmp2 = FastExp(toTest, tmp); //<----- Probleme mit Datentyp beim exponenzieren
- long tmp3 = tmp2 % p;
- if (tmp3 == 1)
- return false;
- }
- return true;
- }
- public long FastExp(long a, long b)
- {
- if (a == 0)
- return 1;
- long result = 1;
- while (b != 0)
- {
- if ((b % 2) == 1)
- {
- result *= a;
- }
- b >>= 1;
- a *= a;
- }
- return result;
- }
Beste Grüße und vielen Dank
Edit:
Mit ist vergangene Woche doch promt am nächsten Tag aufgefallen das ich einen Denkfehler hatte, so wissen wir alle das gilt:
(p^g) mod d = (p1*p2*...*pg) mod d = ((p1 mod d)*(p2 mod d)*...*(pg mod d)
was bedeutet das wir beim Exponenzieren nicht mehr in allzu große Größen kommen.
Methode würde dann auf folgendes rauslaufen: