用于多项式乘法的Karatsuba算法

时间:2018-03-14 21:56:09

标签: c++ algorithm multiplication karatsuba

我正在尝试实现递归Karatsuba算法,用于两个多项式(相同程度)的乘法。我的代码仍然不适用于度数大于1的多项式。任何人都可以向我解释我在函数中做错了什么吗?它应该适用于偶数和奇数个系数。

多项式存储在long的数组中。每个元素代表一个系数,因此1 2 3 4表示1 + 2x + 3x^2 + 4x^3,参数size是系数的数量。

long* karatsuba(const long *A, const long *B, int size) {
    long *lowA, *highA, *lowB, *highB, *midA, *midB;

    if (size == 1)
        return naive(A, B, size, size);

    int half = size / 2;

    lowA = new long[half];
    lowB = new long[half];
    midA = new long[half];
    midB = new long[half];
    highA = new long[half];
    highB = new long[half];

    // init low coefficients
    for(int i=0; i<half; i++){
        lowA[i] = A[i];
        lowB[i] = B[i];
    }

    // init high // init low coefficients
    for(int i=half; i<size; i++){
        highA[i-half] = A[i];
        highB[i-half] = B[i];
    }

    // init mid // init low coefficients
    for(int i=0; i<half; i++){
        midA[i] = lowA[i] + highA[i];
        midB[i] = lowB[i] + highB[i];
    }

    long *z0 = karatsuba(lowA, lowB, half);
    long *z1 = karatsuba(midA, midB, half);
    long *z2 = karatsuba(highA, highB, half);

    // compute the result
    long *result = new long[2*size-1];
    for(int i=0; i<half; i++){
        result[i + 2*half] = z2[i];
        result[i + half] = z1[i] - z0[i] - z2[i];
        result[i] = z0[i];
    }
    return result;
}

我的主要问题是此功能无法计算出正确的结果。

1 个答案:

答案 0 :(得分:0)

我注意到有关正确性的一个半问题:

  1. &#34;组合循环中的索引&#34;仅限于递归调用参数长度而不是结果长度(几乎是参数长度的两倍)
  2. 当限制正确时,中间结果&#34;重叠&#34;,需要累积而不是分配。
  3. 我从未使用过&#34;现代C ++&#34; &#34;愤怒&#34; - 如果这样做有效,但让您对代码不满意,请考虑将您的问题发布在Code Review上。