我有一个奇怪的问题。
我正在尝试实施教科书的倍增。我知道函数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”)而卡住了;在这次运行中不会出现。
感谢您的帮助;)
答案 0 :(得分:0)
现在修复了问题中的错误。
以下是解决方案:
我测试了使用fprintf(stderr,“test \ n”);而不是printf(“test \ n”);并测试了代码。它在我的控制台中神奇地显示了“测试”。 它可能与文件的错误包含顺序有关。
因为我有打印的这个问题,所以我没有检查我的其他功能。 我发现,for-loop不是问题,我在每个命令后测试了几次打印。我能够检测到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);
}
我将&gt; =替换为&gt;现在一切正常。