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

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

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

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


person nomad    schedule 26.04.2012    source источник
comment
Кажется, здесь есть хороший опыт stackoverflow .com / questions / 277309 /   -  person thoredge    schedule 26.04.2012
comment
Спасибо. Однако я видел этот вопрос и пробовал библиотеки JScience и AFloat (которые, как я уже сказал, кажутся медленнее, чем BigInteger). Это может быть потому, что мои числа находятся в сумеречной зоне по размеру (~ 1500 цифр). В любом случае, я знаю, что операции могут быть намного быстрее (поскольку код C ++ достиг этого). Помимо языковых различий, изменчивость (по сравнению с неизменяемыми имплицитами Java) также может иметь значение.   -  person nomad    schedule 26.04.2012


Ответы (2)


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

person Rex Kerr    schedule 26.04.2012
comment
Спасибо, Рекс. Я приму этот ответ, потому что он кажется правильным. Однако кажется, что b / c я создаю такое большое количество больших целых чисел, накладные расходы JNI и выделение JVM / собственных объектов на самом деле убивают меня здесь; в результате производительность хуже, чем у Java BigInteger. - person nomad; 28.04.2012
comment
@nomad - вам нужно повторно использовать целые числа. GMP может это сделать, а Scala может предоставить вам операции обновления и возврата с левым аргументом, которые могут несколько помочь в решении проблемы повторного использования. См. Программу pidigits Scala, которая использует GMP в игре Computer Languages ​​Benchmark Game, чтобы узнать, как это сделать. (Я не утверждаю, что это самый элегантный вариант, но он, по крайней мере, в некоторой степени работоспособен.) - person Rex Kerr; 01.05.2012

Я немного опоздал ... ну, я знаю только библиотеку apfloat, доступную как на C ++, так и на Java. Библиотека Apfloat:

person Mao    schedule 09.03.2013