В GMP, будет, передавая тип многократно увеличенной точности и как возвращаемый аргумент и как работу аргумента операнда?

У меня есть проблема, в которой я должен быть готов исследовать больший диапазон чисел, чем неразмерное длинное длинное может представить (диапазон, представленный 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
задан sadakatsu 18 July 2010 в 02:18
поделиться

1 ответ

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

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

  mpz_mul (x, x, x);
2
ответ дан 2 September 2019 в 22:57
поделиться