首页 > 解决方案 > 使用 GMP 的 while 循环问题

问题描述

我正在尝试使用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。

标签: c++cloopsgmp

解决方案


像这样的问题(“我添加了一个看似无关的变量/函数调用并且行为发生了神秘的变化”)几乎总是未定义行为的结果。在这种情况下,UB 在行中

mpz_inits(r1, r2);

应该是

mpz_inits(r1, r2, NULL);

(请参阅文档)。给定的列表mpz_inits必须以 NULL 结尾,以便函数知道何时停止;否则它将覆盖随机内存。

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


推荐阅读