Java Veränderlich BigInteger-Klasse
Ich mache Berechnungen mit BigIntegers verwendet eine Schleife, die fordert, multiply() etwa 100 Milliarden mal, und das neue Objekt Schöpfung aus dem BigInteger macht es sehr langsam. Ich hatte gehofft, jemand hatte geschrieben oder gefunden MutableBigInteger Klasse. Ich fand die MutableBigInteger in java.math-Paket, aber es ist privat und wenn ich kopieren Sie den code in eine neue Klasse, viele Fehler kommen, die meisten, die ich weiß nicht, wie zu beheben.
Welche Implementierungen gibt es eine Java-Klasse wie MutableBigInteger ermöglicht die änderung des Wertes im Ort?
- Wie haben Sie bestimmen die Schaffung eines BigInteger ist, was macht Sie langsam?
- Es ist schnell, primitive, und ich weiß, Objekterstellung hat erhebliche, overhead, so dass ich denke, es ist die Schöpfung, Ursache für die meisten der Verzögerung.
- Ein Teil der Antwort findet sich hier: stackoverflow.com/questions/890968/...
- meine Lösung für die Schaffung einer Klasse in java.Mathe leider nicht. throws java.lang.SecurityException: Verboten package-Namen: java.Mathematik
- Danke für den Versuch. Ich Schreibe meine eigenen veränderlich beliebiger Größe integer-Klasse. Ich werde teilen, wenn ich fertig bin
- Fügen Sie die Klasse, um Ihre
public
- version auf Ihr boot class path oderjre/lib/endorsed
- Verzeichnis zu vermeiden, diese Fehler/Warnung. - Meine jre/lib hat nicht endorsed-Verzeichnis. Macht ein BigInteger-Klasse ist auch viel schwieriger, als ich dachte. Ich bin immer noch am kämpfen mit BigInteger Leistung für die Kryptographie. Vorher war es für Fraktale.
- 100 Milliarden mal?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist Ihr irgendeinen bestimmten Grund, warum Sie nicht verwenden Sie reflektion, um Zugriff auf die Klasse?
War ich in der Lage zu tun, ohne Probleme, hier ist der code:
Bearbeiten:
Ich entschied mich zu spielen, um mit ein bisschen mehr, es scheint, dass java.math.MutableBigInteger verhält sich nicht genau so, wie man es erwarten würde.
Arbeitet es sich anders, wenn Sie sich vermehren und wird es werfen eine schöne Ausnahme, wenn es um erhöhen Sie die Größe des internen Arrays bei der Zuordnung zu sich selbst. Etwas, was ich denke, ist Fair zu erwarten. Statt dessen habe ich zu tauschen, um die Objekte so, dass Sie immer die Speicherung des Ergebnisses in eine andere MutableBigInteger. Nach ein paar tausend Berechnungen der Aufwand aus der Reflexion vernachlässigbar. MutableBigInteger hat am Ende, ziehen Sie weiter und bietet immer bessere Leistung als die Anzahl der Operationen erhöht. Wenn Sie verwenden die 'mul' - Funktion mit einem integer-primitive als der Wert, der multipliziert mit der MutableBigInteger läuft fast 10-mal schneller als mit BigInteger. Ich denke, es ist wirklich darauf an, was Wert, den Sie brauchen, um zu multiplizieren mit. Entweder Weg, wenn Sie lief dieser Berechnung "100 Milliarden mal" mit Reflexion mit MutableBigInteger, es würde schneller laufen als BigInteger, weil es wäre "weniger" memory allocation und cache würde die reflektierende Operationen, entfernen von overhead, von Reflexion.
JScience hat eine Klasse aufrufen LargeInteger, das ist auch unveränderlich, aber die, die Sie behaupten, hat deutlich bessere perfomance im Vergleich zu BigInteger.
http://jscience.org/
APFloat's Apint sein könnte lohnt sich auch. http://www.apfloat.org/apfloat_java/
Ich kopiert MutableBigInteger, dann auskommentiert werden einige Methoden' stellen, die ich dind nicht brauchen, hinzufügen von einen schönen
wenn Sie aufgerufen wird.
hier ist, wie es aussieht.
In Revisionen können Sie sehen, was sich von der ursprünglichen java.math.MutableBigInteger.
Habe ich auch noch einige Komfort-Methoden,
Hier ist, wie ich es benutzt habe:
add(X) & substract(X)
ist viel schneller alsaddAndBackup(X) & restoreBackup()
etwa 1000 mal schneller.