Wdrażam szybszą implementację BigInt
i nie jestem pewien, jak daleko należy się posunąć, aby zapewnić współdziałanie z podstawową platformą.Z jakimi problemami muszę się spodziewać podczas używania Reflection do interfejsu z java.math.BigInteger?
Dziś BigInt
tylko owija BigInteger
a wartość bigInteger
prostu zwraca owinięte wartość:
class BigInt(val bigInteger: BigInteger) ...
bo nie jestem owijanie typu Java, chciałbym coś zrobić jak
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])
}
...
}
Czy może to powodować problemy, czy jest lepszy sposób na zrobienie tego?
Nie wiem, jak duża jest liczba, ale skopiowanie małej tablicy int może być szybsze niż użycie odbicia ... – paradigmatic
Tak, oczywiście. Nie ma znaczenia dla małych tablic, ale rozmiar liczb jest ograniczony tylko przez pamięć RAM. Po prostu nie chcę jeść pamięci podczas przenoszenia danych z niezmiennej struktury danych do innej. – soc
Liczba atomów w całym wszechświecie jest zwykle szacowana na 10^80. Tylko 9 * 32 bitów, możesz przypisać unikalny indeks do każdego z nich. Mocno wierzę, że jeśli potrzebujesz naturalnej liczby większej, to prawdopodobnie błąd lub błąd projektu ... – paradigmatic