В GMP сработает ли передача типа с множественной точностью как возвращаемого аргумента, так и аргумента операнда? - PullRequest
1 голос
/ 18 июля 2010

У меня есть проблема, в которой мне нужно быть готовым исследовать больший диапазон чисел, чем может представлять длинная длинная длинная (диапазон представлен 3 ^ (n * n)).Это сообщество посоветовало мне использовать GMP для чисел с множественной точностью.Поскольку мне нужно перебирать диапазон по одному числу за раз, мне нужен способ легко увеличивать мой счетчик.

Мой импульс - использовать «mpz_add_ui (my_counter, my_counter, 1UL);», но ябеспокоюсь, что передача моего счетчика в качестве аргумента возврата и в качестве добавления может привести к искажению результата.Если функция изменяет оператор возврата во время вычисления ответа, она может изменить число таким образом, что ответ окажется неправильным.Маловероятно, что увеличение будет вызывать какие-либо проблемы, но как насчет добавления двух больших mpz_t?Или умножение, или даже возведение в степень?Документация не может ни успокоить, ни подтвердить мои опасения.Я пытался просмотреть исходный код, но сочетание макросов, редких комментариев и переходов из одного файла в другой привело меня к выводу, что я еще недостаточно хорош, чтобы следовать ему.

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

void mpz_increment(mpz_t) {  
    mpz_t temp;  
    mpz_init(temp);  
    mpz_add_ui(temp, a, 1UL);  
    mpz_set(a, temp);  
    mpz_clear(temp);  
}

Итак, мой вопросэто.Безопасно ли передавать тип с множественной точностью в арифметическую функцию GMP как в качестве аргумента возврата, так и в качестве одного из операндов, или это приведет к искаженным результатам?

1 Ответ

2 голосов
/ 18 июля 2010

Да, вы можете передать тот же экземпляр, что и входной и выходной параметр.Это явно указано в разделе « Условные обозначения » документации:

GMP позволяет использовать одну и ту же переменную для ввода и вывода в одном вызове.Например, основная функция для целочисленного умножения, mpz_mul, может быть использована для возведения в квадрат x и помещения результата обратно в x с помощью

 mpz_mul (x, x, x);
...