У меня есть проблема, в которой я должен быть готов исследовать больший диапазон чисел, чем неразмерное длинное длинное может представить (диапазон, представленный 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 и как возвращаемый аргумент и как один из операндов, или выполнение так приведет к поврежденным результатам?
Да, вы можете передать один и тот же экземпляр в качестве входного и выходного параметра. Это явно указано в разделе документации « Соглашения о переменных »:
GMP позволяет использовать ту же переменную для как ввод, так и вывод за один вызов. За например, основная функция для целого числа умножение, mpz_mul, можно использовать возвести в квадрат x и вернуть результат в x с
mpz_mul (x, x, x);