Библиотеки произвольной точности JVM

Я работаю над проектом (в Scala), где мне нужно манипулировать некоторыми очень большими числами; слишком большой, чтобы быть представленными интегральными типами. Java предоставляет классы BigInteger и BigDecimal (и Scala обеспечивает хорошую тонкую оболочку вокруг них). Тем не менее, я заметил, что эти библиотеки существенно медленнее, чем другие библиотеки произвольной точности, которые я использовал в прошлом (т.е. http://www.ginac.de/CLN/), и разница в скорости кажется больше чем то, что можно отнести только к языку.

Я сделал некоторое профилирование своей программы, и 44% времени выполнения тратится на метод умножения BigInteger. Я бы немного ускорил свою программу, поэтому я ищу более быстрый и эффективный вариант, чем класс BigInteger (и его оболочка Scala). Я посмотрел на LargeInteger (от JScience) и Aint (от Afloat). Однако оба кажутся более медленными, чем стандартный класс BigInteger.

Кто-нибудь знает о математической библиотеке произвольной точности Java (или доступной в JVM) с акцентом на умножение и добавление с высокой производительностью?

Ответ 1

К сожалению, я думаю, вам не повезло с родной библиотекой Java. Я его не нашел. Я рекомендую обернуть GMP, который имеет отличную произвольную точность, используя JNI. Есть накладные расходы JNI, но если вы находитесь в 1500-значном диапазоне, это должно быть небольшим по сравнению с разницей в алгоритмической сложности. Вы можете найти различные обертывания GMP для Java (я считаю, что наиболее популярным является здесь).

Ответ 2

Я немного опаздываю... ну, я знаю только библиотеку apfloat, доступную как на С++, так и на Java. Apfloat-Library: