使用 GMP 的 while 循环问题

Issue with a while loop using GMP

我正在尝试使用 GMP 库 对扩展欧几里得算法进行编码,因为我使用的是大数。我的算法是基础算法,只是适应了 GMP 数字。

但是我的 while 循环有问题。下面的代码是我的算法的一个可重现的例子。我更改了循环的内容只是为了测试。

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);
}}

循环好像没有执行.

寻找问题的根源,我试图简化循环,但每当我添加行 "mpz_init(q);" 时,我都会遇到问题(循环不再执行)。我调用我的函数 euclid,a 等于 mpz_t 33,b 等于 mpz_t 5.

像这样的问题 ("I added a seemingly irrelevant variable/function call and the behaviour changed mysteriously") 几乎总是未定义行为的结果。在这种情况下,UB 在

行中
mpz_inits(r1, r2);

应该是

mpz_inits(r1, r2, NULL);

(参见 docs)。给 mpz_inits 的列表必须以 NULL 结尾,以便函数知道何时停止;否则会覆盖随机内存。

Valgrind 是发现此类问题的宝贵工具。