我在 C 中实现 karatsuba 的乘法算法,在调试时我发现这个错误我无法解释:在每一步中,我将数字分成两半,我通过为我的数据类型分配适当的指针来做到这一点。当我输出我的值时,我得到了这个:
a->l: 8 a->u: 4 a->v: 0x51fc270 a: 4072
b->l: 8 b->u: 4 b->v: 0x51fc278 b: 6718
变成(对于a)
a->l: 2 a->u: 2 a->v: 0x51fc272 a: 00
b->l: 2 b->u: 2 b->v: 0x51fc270 b: 00
和(对于 b)
a->l: 2 a->u: 2 a->v: 0x51fc27a a: 00
b->l: 2 b->u: 2 b->v: 0x51fc278 b: 00
这两个输出之间没有写访问,前两个结构总是产生相同的输出。
有人可以解释这种行为吗?因为我真的迷路了。。
保存数据的结构如下所示
struct mp_type
{
int l, u; //length of v and places used (length of number stored)
char* v; //array which stores the value (the number)
};
typedef struct mp_type mp_int;
最后一个值是存储在数组 v 中的数字。
// high has lower address as low order digits are stored at the end of the array
mp_int low1, low2, high1, high2;
high1.l = high1.u = a->u / 2;
low1.l = low1.u = a->u - high1.u;
low1.v = a->v + low1.u;
high1.v = a->v;
high2.l = high2.u = b->u / 2;
low2.l = low2.u = b->u - high2.u;
low2.v = (b->v + low2.u);
high2.v = b->v;
我就是这样划分数字的。a->u 和 b->u 总是偶数。
在这里,您可以找到一个更精简的项目版本,它可以重现错误。