Wie hebst du einen Java BigInteger ohne die modulare Arithmetik an die Macht eines BigIntegers heran?

8

Ich mache ein großes Integer-Computing, und ich muss einen BigInteger an die Macht eines anderen BigIntegers bringen. Die .pow () -Methode tut was ich will, nimmt aber einen int-Wert als Argument. Die .modPow-Methode verwendet einen BigInteger als Argument, aber ich möchte keine Antwort, die mit dem Wert übereinstimmt, den ich zu berechnen versuche.

Mein BigInteger-Exponent ist zu groß, um als int dargestellt zu werden. Kann jemand vorschlagen, diese Einschränkung zu umgehen?

    
angstrom91 15.05.2010, 07:14
quelle

2 Antworten

14

Sie sollten nicht versuchen, die Stärke einer extrem großen Zahl mit einer anderen extrem großen Zahl zu berechnen. Die resultierende Zahl würde große Mengen an Speicher verbrauchen. Wenn Sie a.pow(b) berechnen, wird es ungefähr log(a)*b Ziffern haben. Wenn b zu groß ist, um in eine ganze Zahl zu passen, dann wird das Ergebnis selbst für ziemlich kleine Werte von a mehrere Milliarden Ziffern haben.

Versuchen Sie, zu überdenken, was Sie erreichen möchten und wie Sie es erreichen können, ohne diese Operation auszuführen.

    
Mark Byers 15.05.2010, 07:17
quelle
6

Die praktische Lösung besteht darin, den Exponenten von einem BigInteger in einen int zu konvertieren.

Wenn Sie dies nicht tun können, weil der Exponent zu groß ist, ist Ihr Algorithmus nicht implementierbar. Die resultierende Zahl wäre fast sicher zu groß, um sie als BigInteger darzustellen. (Ein BigInteger verwendet ein Array von Bytes, um die Zahl darzustellen, und die maximale Größe eines Java-Arrays ist 2**31 - 1 elements, unabhängig davon, wie groß der Heap ist.) Und selbst wenn Sie eine "BiggerInteger" -Klasse implementiert haben, die die Zahl darstellen würde , würden Sie bald die Grenzen der physischen Speichergröße Ihrer Maschine überschreiten. (Und die Zeit für die Berechnung von N.pow(M) wäre ... NP-tricky ... O((MlogN)^M) Ich denke).

Wenn die Zahl, die Sie einnehmen, 0 , 1 oder -1 ist, passt das Ergebnis natürlich problemlos in BigInteger . Aber in diesen Fällen gibt es bessere Möglichkeiten, die Leistung zu berechnen: -).

    
Stephen C 15.05.2010 07:31
quelle

Tags und Links