Der Algorithmus, den ich gerade benutze, läuft sehr schnell in extrem hohen Zahlen. Ein Schritt in dem Algorithmus, den ich bin, hebt x auf das Ergebnis der totient Funktion an, die auf y angewandt wird. Das Ergebnis ist, dass Sie sehr große Zahlen erreichen können.Gibt es einen Algorithmus zur Berechnung der multiplikativen Reihenfolge von x modulo y (für y <1000), die keinen BigInteger-Typ erfordert?
Eg. Bei der Berechnung der multiplicative order von 10 Modulo 53:
10^totient(53) == 10^52 == 1 * 10^52
den folgenden Algorithmus Tarife ein bisschen besser entweder in Bezug auf große Zahlen zu vermeiden, aber es immer noch nicht, wo 10^morder ist größer als die Kapazität des Datentyps :
mOrder = 1
while 10^mOrder % 53 != 1
if mOrder >= i
mOrder = 0;
break
else
mOrder = mOrder + 1
nicht Teil der ursprünglichen Frage, sondern eine saubere Art und Weise die Antworten von @schnaader und @Svante zu kombinieren. Die multiplikative Reihenfolge, nach der Sie suchen, muss totient (c) teilen, so dass Sie nicht jedes a^b testen müssen. Wenn Sie die Teiler von totient (c) aufzählen, können Sie die @ schnaader-Methode verwenden, um die Exponentiationen auszuführen, und @ Svantes Methode, um bereits berechnete Ergebnisse zu verwenden, um andere zu berechnen - dh 10^1, 10^2 (durch Quadrieren), 10^4 (durch Quadrieren), 10^13 = (10^4)^3 * (10^1), 10^26 (durch Quadrieren). (Wenn es keiner von denen ist, muss es 52 sein). –