2011-01-03 4 views
15

Ich spiele mit Zahlen in Java und möchte sehen, wie groß eine Zahl ist, die ich machen kann. Es ist mein Verständnis, dass BigInteger eine unendliche Größe halten kann, solange mein Computer genug Speicher hat, um so eine Nummer zu halten, richtig?BigInteger.pow (BigInteger)?

Mein Problem ist, dass BigInteger.pow nur einen int akzeptiert, nicht einen anderen BigInteger, was bedeutet, dass ich nur eine Zahl bis zu 2.147.483.647 als Exponent verwenden kann. Ist es möglich, die BigInteger-Klasse als solche zu verwenden?

BigInteger.pow(BigInteger) 

Dank.

+0

'BigInteger' kann keine Zahlen unendlicher Größe darstellen, es kann nur Zahlen" nahe bei "beliebiger Größe darstellen. Die maximal darstellbare Zahl hängt von Ihrer Implementierung (interne Datenstrukturen) und dem verfügbaren Heapspeicher ab. –

+0

warum brauchen Sie es? Wie Saeed sagt unten sogar der kleinste Wert wo Int nicht genug ist ist zu groß ... – Fakrudeen

+0

Es macht nur Sinn, wenn Sie modulo ein 'BigInteger' berechnen, für diesen Fall existiert es: http://download.oracle.com/javase /6/docs/api/java/math/BigInteger.html#modPow(java.math.BigInteger,%20java.math.BigInteger) – starblue

Antwort

1

java pflegen lassen Sie tun BigInteger.Pow (BigInteger), aber man kann es nur in einer Schleife auf die max integer und sehen, wo ein ArithmeticException geworfen wird oder ein anderer Fehler aufgrund von Speicher ausgeführt wird.

2

2^2.147.483.647 hat mindestens 500000000 Ziffer, tatsächlich ist Rechenpow NPC-Problem, [Pow ist NPC in der Länge der Eingabe, 2 Eingabe (m, n), die sie in O (logm + logn) codiert werden können und kann bis zu nlog (m) dauern (schließlich dauert die Antwort n log (m) space), das ist keine polynomische Beziehung zwischen Eingabe und Berechnungsgröße], ​​es gibt einige einfache Probleme, die nicht einfach sind, zum Beispiel sqrt(2) ist eine Art von ihnen kann man nicht die wahre Genauigkeit (alle Genauigkeiten) angeben, dh BigDecimal sagt, dass es alle Genauigkeiten berechnen kann, aber es kann (tatsächlich) nicht, weil niemand dies bis jetzt gelöst hat.

+0

@ Fakrudeen, es ist NPC im Weltraum. –

+0

Rechenleistung ist kein NPC. Es ist sehr viel Polynom. Zum Beispiel Algo. Sieh Keiths Antwort. Die Berechnung von n^m ist am meisten (mlogn)^2 * logm, was deutlich kleiner ist als (max (n, m))^4. Auch deine Definition von NPC ist nicht korrekt. NPC bedeutet, dass Sie die Antwort in polynomieller Zeit verifizieren können, aber die Lösung ist NP schwer (Polynom im nicht deterministischen TM-Modell). – Fakrudeen

+0

NPC im Raum würde atleast NPC in der Zeit bedeuten, weil das Verwenden von soviel Raum selbst NPC Zeit in Anspruch nimmt! – Fakrudeen

17

Sie können Ihre eigenen schreiben, mit repeated squaring:

BigInteger pow(BigInteger base, BigInteger exponent) { 
    BigInteger result = BigInteger.ONE; 
    while (exponent.signum() > 0) { 
    if (exponent.testBit(0)) result = result.multiply(base); 
    base = base.multiply(base); 
    exponent = exponent.shiftRight(1); 
    } 
    return result; 
} 

möglicherweise nicht für negative Basen oder Exponenten arbeiten.

+1

+1 um zu zeigen, dass es möglich ist (obwohl es wahrscheinlich keine gute Idee ist) –

+0

@Sean Patrick Floyd, @Keith Randall, Es ist möglich, Code so einfach zu schreiben wie das, aber es ist nicht möglich, es zu verwenden, was ist die Verwendung von großen Integer Coef in diesem Fall ????? Haben Sie einen Bereich von großen Ganzzahl verwenden können, die nicht in Int ist ????? Dieser Code ist nur sl ow, weil biginteger sehr viel langsamer ist als int. –

+1

Ja, es wird ziemlich langsam und wahrscheinlich nicht sehr nützlich sein. Aber es beantwortet die Frage des OP, wie man testet, wie groß ein BigInteger sein kann. Und derselbe Algorithmus ist nützlich, wenn modulare Arithmetik verwendet wird - siehe BigInteger.modPow, die einen BigInteger-Exponenten benötigt. –

6

Die zugrunde liegende Implementierung von BigInteger ist auf (2^31-1) * 32-Bit-Werte beschränkt. Das sind fast 2^36 Bits. Sie benötigen 8 GB Speicher, um es zu speichern und viele mal dies, um jede Operation auf es wie toString() durchzuführen.

BTW: Sie werden nie in der Lage sein, eine solche Nummer zu lesen. Wenn Sie versuchen, es auszudrucken, würde es eine Lebenszeit dauern, es zu lesen.

+0

plus eins für "BTW" Teil ... nur eine Frage mehr, was ist, wenn ich nur so eine "Big" BigInteger in einer BigInteger-Typ-Variable speichern? Ich tat es, teilte es mit einem anderen BigInteger und versuchte den Rest zu bekommen. Dann habe ich versucht, Rest auszudrucken, aber Konsole braucht zu viel Zeit, um den Rest zu zeigen. – Mukit09

+0

@ Mukit09 Wenn alles, was Sie brauchen, ist der Rest und das ist relativ klein, höchstwahrscheinlich ist es effizienter, nur den Rest anstelle des großen Wertes zu berechnen. z.B. 'pow' kann sehr teuer sein, aber' modPow' kann dramatisch schneller sein. Hinweis: Konsolen, insbesondere die DOS-Konsole, sind sehr langsam. Versuchen Sie stattdessen, die Nummer in eine Datei zu schreiben. –

+0

danke für deine antwort. Mein Problem ist gelöst, aber ich möchte es jetzt wissen. Als ich versuchte, einen solchen BIG BigInteger in einer Variablen zu speichern, ist das natürlich auch ein Problem, da mein RAM dieser Variable keine Leerzeichen geben kann. Würden Sie mir bitte sagen, wenn ich falsch liege? – Mukit09

8

können Sie dies nur tun, in Java durch modulare Arithmetik, das heißt, Sie können, wo a, b, c sind BigInteger Zahlen a a^b mod c tun.

BigInteger modPow(BigInteger exponent, BigInteger m) 

Read the BigInteger.modPow documentation here.

-4

Verwenden Sie einfach .intValue() Wenn Ihr BigInteger BigValue2 benannt ist, dann wäre es BigValue2.intValue()

So sein:

Dies geschieht mit Beantworten Sie Ihre Frage, es ist

BigValue1.pow(BigValue2.intValue()) 
+0

Erhöht nicht die Beschränkung, nach der das OP fragt. – EJP

0

kann ich schlage vor, Sie Verwendung von BigInteger modPow (BigInteger Exponent, BigInteger m)

Angenommen, Sie haben BigInteger X und BigInteger Y und Sie möchten berechnen BigInteger Z machen = X^Y.

Erhalten Sie eine große Prime P >>>> X^Y und tun Z = X.modPow (Y, P);