Ich implementiere eine schnellere BigInt
Implementierung und ich bin mir nicht sicher, wie weit ich gehen sollte, um Interop mit der zugrunde liegenden Plattform bereitzustellen.Welche Probleme muss ich erwarten, wenn Sie Reflection als Schnittstelle zu java.math.BigInteger verwenden?
Heute BigInt
wickelt nur einen BigInteger
und der Wert bigInteger
gibt nur den verpackten Wert:
class BigInt(val bigInteger: BigInteger) ...
Weil ich nicht bin ein Java-Typ wickeln, würde ich so etwas wie
final class BigInt private(final val signum: Int,
final private[math] val arr: Array[Int])
def bigInteger: java.math.BigInteger = {
// Avoid copying of potentially large arrays.
val ctor = classOf[java.math.BigInteger]
.getDeclaredConstructor(classOf[Array[Int]], classOf[Int])
ctor setAccessible true
ctor.newInstance(arr, signum.asInstanceOf[Object])
}
...
}
zu tun haben
Kann dies zu Problemen führen oder gibt es einen besseren Weg?
Ich weiß nicht, wie groß die Zahl ist, aber das Kopieren einer kleinen Reihe von Ints könnte schneller sein als mit Reflexion ... – paradigmatic
Ja, sicher. Für kleine Arrays spielt das keine Rolle, aber die Größe der Zahlen ist nur durch den RAM begrenzt. Ich möchte einfach keine Speicher essen, wenn ich Daten von einer unveränderlichen Datenstruktur in eine andere verlagern möchte. – soc
Die Anzahl der Atome im gesamten Universum wird üblicherweise auf 10^80 geschätzt. Mit nur 9 * 32 Bits können Sie jedem einen eindeutigen Index zuweisen. Ich glaube fest, dass wenn Sie eine natürliche Zahl größer als das brauchen, es ist wahrscheinlich ein Fehler oder ein Designfehler ... – paradigmatic