c - 使用 gmp 实现教科书乘法的 c 中的奇怪错误

标签 c for-loop gmp

我有一个奇怪的问题。

我正在尝试实现教科书乘法。我知道函数 mpz_mul 可以为我做到这一点,但我的任务是自己实现它作为家庭作业。

这是我的代码:

void mpz_school_mul(mpz_t c, mpz_t a, mpz_t b)
{
    size_t i;
    mp_limb_t b_i;
    mpz_t c_part;

    mpz_init(c_part);

    /* Backup a for the special case a := a * b. */
    mpz_t a_backup;

    mpz_init(a_backup);
    mpz_set(a_backup, a);
    /* Clear the result */
    mpz_set_ui(c,0);

    gmp_printf("i = %zx, size(b) = %zx, a = %Zx, b = %Zx\n", i, mpz_size(b), a, b);

    for(i = 0; i < mpz_size(b); i++)
    {
        printf("test\n");
        b_i = mpz_getlimbn(b,i);
        /* c = a*b_i*B^i + ... + a*b_0*B^0 */

            /* Calculate a*b_i for every round. */
            mpz_mul_limb(c_part,a_backup,b_i); 

            /* Shift it to the right position (*B^i). */
            mpz_mul_base(c_part,c_part,i);

            /* Sum all a*b_i*B^i */
            mpz_school_add(c, c, c_part);   
    }

    mpz_clear(a_backup);
    mpz_clear(c_part);
}

这段代码对我来说效果很好,我可以用几个参数来测试它。结果是正确的,所以我认为我不需要在计算部分做太多改变。 ;)

例如:此参数按预期工作。

mpz_set_str(a, "ffffffff00000000abcdabcd", 16);
mpz_set_str(b, "cceaffcc00000000abcdabcd", 16);
mpz_school_mul(c,a,b);

现在来看看错误:

当我使用参数 b 和零肢(我使用的是 32 位 VM)运行程序时,最后程序崩溃了:

mpz_set_str(a, "ffffffff00000000abcdabcd", 16);
mpz_set_str(b, "cceaffcc00000000", 16);
mpz_school_mul(c,a,b);

参数 b_0 = 0 的输出是:

i = 0, size(b) = 2, a = ffffffff00000000abcdabcd, b = cceaffcc00000000

我认为 for 循环卡住了,因为 printf("test\n");在此运行中未出现。

感谢您的帮助;)

最佳答案

问题中的错误现已修复。

解决方案如下:

我测试使用 fprintf(stderr, "test\n");而不是 printf("test\n");并测试了代码。它神奇地在我的控制台中显示了“测试”。 这可能与 和 文件的包含顺序错误有关。

由于我在打印时遇到了这个问题,所以我没有检查我的其他功能。 因为我发现 for 循环不是问题,所以我在每个命令后测试了几次打印。我能够检测到 void mpz_mul_base(mpz_t c, mpz_t a, mp_size_t i) 函数中的错误,其中我没有检查 c_part = 0 的情况。使用此参数,mpz_mul_base(c_part,c_part,i) 的以下代码);函数陷入无限循环:

if(mpz_size(c) >= n)
    for(i = mpz_size(c); i >= n; i--)
    {
    mpz_setlimbn(c, clear, i);
    }

我用 > 替换了 >=,现在一切正常。

关于c - 使用 gmp 实现教科书乘法的 c 中的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20837507/

相关文章:

c - 在 C 中,如何打印出一个字符数组然后清空它?

Javascript 从关联数组中查找最小数字(冒泡排序方法)

java - 对于每个循环不返回值?

c++ - 有没有人安装了有效的 GMP + MINGW?

windows - $PATH 或/usr5bin 中没有可用的 M4

c - 参加事件时 sleep

c - if 字符串比较语句未正确执行

iphone - 定期从 iPhone stderr 读取

java - 数组的累积和

python - 尝试使用 gmpy 在 Python 中计算大数。 Python 一直崩溃?