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

c语言中使用gmp实现教科书乘法的奇怪错误,c,for-loop,gmp,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_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);
}
现在来看看bug:

当我在最后使用参数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(“测试”);并测试了代码。它神奇地出现在我的控制台中的“测试”。 这可能与和文件的错误包含顺序有关

由于打印有这个问题,我没有检查其他功能。 因为我发现for循环不是问题所在,所以我在每个命令之后测试了几个打印。我能够检测到void mpz_mul_base(mpz_tc,mpz_ta,mp_size_ti)函数中的错误,其中我没有检查c_part=0的情况。使用此参数,mpz_mul_库的以下代码(c_部分,c_部分,i);函数运行到一个无休止的循环中:

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

我将>=替换为>,现在一切正常。

您的
学校添加的
函数是否接受重叠参数?你的乘法函数不…你能帮我个忙吗,重叠参数是什么意思?对不起,措词太草率了。我的意思是像
mpz\u school\u add(c,c,c\u part)
这样的调用,其中前两个参数相同。是的,我检查了这个案例。mpz学校add中的c=c+c_部件应能正常工作。你为什么说,我的乘法不能做到这一点?很抱歉,是的,前两个参数可能是相同的,但是
c==b
是个问题。欢迎来到。当你回答自己的问题时,你仍然应该写一个完整的答案,因为评论是暂时的。这将大大提高你的帖子质量——如果你能做到,那就太好了。非常感谢。
if(mpz_size(c) >= n)
    for(i = mpz_size(c); i >= n; i--)
    {
    mpz_setlimbn(c, clear, i);
    }