Подтвердить что ты не робот

Альтернатива Java BigInteger

Есть ли альтернатива для использования BigInteger в java?

Когда вы выполняете операцию в BigInteger, это всегда приводит к созданию нового BigInteger. Существует ли альтернативная реализация, когда результат некоторой операции между двумя большими целыми значениями сохраняется в одном из них?

Например, в Java, когда вы выполняете умножение двух больших целых чисел: a * b создается новый BigInteger для размещения результата. Я хочу сохранить результат в a.

Я хочу это, чтобы увеличить производительность в некоторых случаях моего алгоритма

4b9b3361

Ответ 1

Существуют измененные "версии" BigInteger (например: https://github.com/bwakell/Huldra), или вы можете перевернуть свои собственные. Использование изменяемого объекта может уменьшить давление на GC. Вы действительно должны проверить свое приложение, чтобы убедиться, что это стоит усилий.

Ответ 2

Я сомневаюсь, что производительность вашего алгоритма улучшится, если вы сможете как-то это сделать, но основной принцип заключается в том, что BigInteger является неизменным. Вы не можете выполнить операцию над ним, не создавая новый экземпляр, и есть веские причины для этого поведения, а именно, если у вас несколько потоков, работающих на одном BigInteger, вы можете быть уверены, что эти потоки не переписывают это BigInteger напрямую *.

Если вы не желаете этого поведения, единственным вариантом является создание нового класса, но имейте в виду, что вы все равно будете иметь дело с неизменностью BigInteger на некотором уровне.

*: Знаете, до тех пор, пока вы не переназначаете переменную...

Ответ 3

То, о чем вы просите, вряд ли будет более впечатляющим, если только вы не захотите сделать это. Причина этого в том, что количество бит в результате почти любой математической операции (отличной от вышеупомянутой add) отличается от исходного числа. Вы почти всегда должны выделять новый номер результатов и копировать его по оригиналу, так что все, что вы делаете, делает его медленнее.

Если, однако, все, что вам нужно сделать, это add/sub, то это выполнимо и на самом деле может быть немного быстрее, поскольку не будет выделение нового массива для добавления.

Почти все другие функции будут лучше делегированы классу BigInteger.

class MutableBigInteger {
    BigInteger n;

    public MutableBigInteger add (MutableBigInteger n) {
        this.n = this.n.add(n.n);
        return this;
    }
}