Как эффективно добавить 3 больших числа, используя GMP - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу сделать x = a + b + c для ~ 2048-битных целых чисел со знаком.В настоящее время мой код выглядит как

mpz_add(x, a, b);
mpz_add(x, x, c);

Есть ли одна функция для этого?Это происходит много раз в моем приложении.Я профилировал свой код, и шаг 3-стороннего добавления занимает значительную часть времени выполнения.Если есть альтернативный способ сделать это за один проход, это может помочь.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Двойной вызов функций не повлечет за собой заметных накладных расходов.Однако перераспределение x, если необходимо, может быть очень медленным.Чтобы избежать этого, вы можете измерить размеры a, b и c и убедиться, что x выделил максимальный размер трех чисел плюс 2 (1 бит для сложения в худшем случае).Вы можете использовать

mpz_init2(x, maxsize+2);

или, если x уже был инициализирован,

if (mpz_sizeinbase(x, 2) < maxsize+2)
  mpz_realloc2(x, maxsize+2);
0 голосов
/ 05 января 2019

Я широко использовал MPFR и просмотрел почти все части документации.Я почти уверен, что ничего подобного не существует в MPFR, и поэтому я почти уверен, что ничего подобного не существует в GMP.

Одним из решений может быть переключение на MPFR и использование MPFR Павла ХолобородькоC ++ , который добавляет операторы для функций MPFR.Я не могу себе представить, что это поможет производительности (хотя, вероятно, это не сильно повлияет), она находится под лицензией GPL, и вам придется установить другую библиотеку, но она будет объединять операции.

Я не знаю каких-либо быстрых алгоритмов, которые при добавлении трех чисел не просто добавляют два из них, а затем добавляют последний номер за кулисами.Я не думаю, что объединение этих двух операций в одну операцию с использованием какой-либо библиотеки на любом языке повысит производительность.Точность произвольной работы очень низкая даже при использовании GNU MP.У меня есть сравнение скоростей здесь на Code Review, если это поможет.

...