Выпуск с некоторое время l oop с использованием GMP - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь закодировать расширенный евклидов алгоритм, используя библиотеку GMP , потому что я использую большие числа. Мой алгоритм - базовый c, только что адаптированный для номеров GMP.

Но у меня проблема с моим временем l oop. Код ниже является воспроизводимым примером моего алгоритма. Я изменил содержимое l oop только для тестирования.

void euclid(mpz_t a, mpz_t b){


mpz_t r1, r2, u1, u2, v1, v2;

mpz_init_set_ui(u1, 1);
mpz_init_set_ui(v1, 0);
mpz_init_set_ui(u2, 0);
mpz_init_set_ui(v2, 1);

mpz_inits(r1, r2);

mpz_set(r1, a);
mpz_set(r2, b);

while(mpz_cmp_ui(r2, 0))
{
    gmp_printf("r2 : %Zd\n", r2);
    mpz_sub_ui(r2, r2, 1);

    mpz_t q;
    mpz_init(q);
}}

Кажется, что l oop не выполняется .

Ищем источник проблемы, я попытался упростить l oop и получаю проблему (l oop больше не выполняется) всякий раз, когда добавляю строку "mpz_init (q);". Я назвал свою функцию euclid равной mpz_t 33, а b равной mpz_t 5.

1 Ответ

2 голосов
/ 15 февраля 2020

Подобные проблемы («я добавил, казалось бы, нерелевантный вызов переменной / функции и поведение странным образом изменилось») почти всегда являются результатом неопределенного поведения. В этом случае UB находится в строке

mpz_inits(r1, r2);

, которая должна была быть

mpz_inits(r1, r2, NULL);

(см. документы ). Список, заданный для mpz_inits, должен заканчиваться NULL, чтобы функция знала, когда остановиться; в противном случае он будет перезаписывать случайную память.

Valgrind является бесценным инструментом для выявления проблем такого рода.

...