Karatsuba错误的结果

时间:2013-08-29 16:47:48

标签: c algorithm

我一直在尝试用c语言实现karatsuba算法,但不幸的是它给了我一个错误的结果。

这是我的c函数:

Real* multiplication(const Real* a, const Real* b){
    Real* ret;

    ............

    z0=multiplication(low1, low2);
    assert(z0!=NULL);

    z2=multiplication(high1, high2);
    assert(z2!=NULL);

    z1=subtract(subtract( multiplication(add(low1, high1), add(low2, high2)), z2), z0);
    assert(z1!=NULL);

    assert((tmpA->taille == tmpB->taille) && (tmpA->taille%2==0));

    ret=add(add( powerTen(z2, tmpA->size), powerTen(z1, tmpA->size/2)), z0);
    assert(ret!=NULL);

    .......

    return ret;
 }

我创建了结构:

    struct Real{
        int* nb;
        int size;
        int neg; //1=negative 0=positiv
    }

所以,简而言之,我已经使用了wikipedia中的伪代码实现,并且函数开始查看两个数字的大小(如果有< 2),如果不是它通过均衡来纠正它,如果大小是偶数则在前面加零。除此之外,它基本上是伪码算法。

low1和high1对应于a的低部分和高部分 low2和high2对应于

的低部分和高部分

提前感谢您的所有回复

1 个答案:

答案 0 :(得分:0)

以下是您如何调试的概述。

完成每一步后,写下您对计算机的预期答案 然后让计算机向您显示实际得到的答案。

寻找你所期望的与实际不同的步骤。

Real* multiplication(const Real* a, const Real* b){
    Real* ret;
    [...]
    z0=multiplication(low1, low2);
    assert(z0!=NULL);
    printf("Step #1: I expected 5, but I actually got %d\n", z0);

    z2=multiplication(high1, high2);
    printf("Step #2: I expected 7, but I actually got %d\n", z2);
    assert(z2!=NULL);

    z1=subtract(subtract( multiplication(add(low1, high1), add(low2, high2)), z2), z0);
    printf("Step #3: I expected 3, but I actually got %d\n", z1);
    assert(z1!=NULL);

    assert((tmpA->taille == tmpB->taille) && (tmpA->taille%2==0));

    ret=add(add( powerTen(z2, tmpA->size), powerTen(z1, tmpA->size/2)), z0);
    printf("Step #4: I expected 30, but I actually got %d\n", ret);
    assert(ret!=NULL);
    [...]    
    return ret;
 }

注意:你必须调整printf语句,因为我不确定期望什么值, 也不知道如何打印变量z0z1z2,因为你没有在问题中提供足够的细节。