我在C中实现了karatsuba的乘法算法,在调试时我发现了这个错误我无法解释: 在每一步中,我将数字分成两半,我通过为数据类型指定适当的指针来实现。当我输出我的值时,我得到了这个:
a->l: 8 a->u: 4 a->v: 0x51fc270 a: 4072
b->l: 8 b->u: 4 b->v: 0x51fc278 b: 6718
变成(for 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总是偶数。
在这里1你发现了一个较薄的项目版本,它会重现错误。