gpt4 book ai didi

c++ - 用于多项式乘法的 Karatsuba 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:45 25 4
gpt4 key购买 nike

我正在尝试实现递归 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. “组合循环”中的索引仅限于递归调用参数长度而不是结果长度(几乎是参数长度的两倍)
  2. 当限制正确时,中间结果“重叠”,需要累加而不是赋值。

我从来没有“愤怒地”使用过“现代 C++”——如果这有效,但让您对代码不满意,请考虑在 Code Review 上发表您的疑虑。 .

关于c++ - 用于多项式乘法的 Karatsuba 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49288251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com