Algorithm 多项式乘法的朴素分治法

Algorithm 多项式乘法的朴素分治法,algorithm,recursion,language-agnostic,divide-and-conquer,Algorithm,Recursion,Language Agnostic,Divide And Conquer,给定两个多项式A(x)=a0+a1x+a2x2+…+a-1xn-1和B(x),用系数b0,b1类似地定义。。。bn-1,我们求A(x)*B(x) 作为学习Karatsuba算法的序言,我正在研究一个简单的分治算法,我理解其基本原理,即: 定义A(x)=M0(x)+M1(x)xn/2,其中M1(x)=an-1xn/2-1+an-2xn/2-2+…+an/2(即上半系数)和M0(x)=an/2-1xn/2-1+an/2-2xn/2-2+…+a0(即下半系数)和B(x)=N0(x)+N1(x)xn/2

给定两个多项式A(x)=a0+a1x+a2x2+…+a-1xn-1和B(x),用系数b0,b1类似地定义。。。bn-1,我们求A(x)*B(x)

作为学习Karatsuba算法的序言,我正在研究一个简单的分治算法,我理解其基本原理,即:

定义A(x)=M0(x)+M1(x)xn/2,其中M1(x)=an-1xn/2-1+an-2xn/2-2+…+an/2(即上半系数)和M0(x)=an/2-1xn/2-1+an/2-2xn/2-2+…+a0(即下半系数)和B(x)=N0(x)+N1(x)xn/2,其中N0(x)和N1(x)分别以类似于M0(x)和M1(x)的方式定义。然后我们可以将A(x)*B(x)重写为(M1N1)xn+(M1N0+M0N1)xn/2+M0N0

但是,我在理解提供的伪代码中的“征服”步骤时遇到了一些困难:

Function PolyMult(A, B, n, a, b)
    R = array[0 ... 2n - 1];
    if n = 1:
        R[0] = A[a] * B[b]; return R;
    R[0 ... n - 2] = PolyMult(A, B, n/2, a, b);
    R[n ... 2n - 2] = PolyMult(A, B, n/2, a + n/2, b + n/2);
    MN = PolyMult(A, B, n/2, a, b + n/2);
    NM = PolyMult(A, B, n/2, a + n/2, b);
    R[n/2 ... n + n /2 - 2] += MN + NM;
    return R;
End Function
具体来说,我不确定为什么结果数组的前n-1和最后n-1项可以直接初始化,而中间的n-1项需要通过加法赋值来计算。有人能详细介绍一下算法的这一方面吗

总的来说,我认为我缺少了一些关于递归或分治(似乎两者都有)的重要直觉。在尝试实现递归分治解决方案时,什么是重要的通用范例?

提示:多项式M0、M1、N0、N1的(最大)阶数是多少

n/2-1
每个产品M0*N0 M1*N1 M0*N1 M1*N0的(最大)度数是多少

n - 2
现在是M1*N1*x^n的阶

2*n - 2
yes
M1*N1*x^n从0度到n-2度的系数的值是多少

0
那么它们是否与M0*N0的系数重叠

no
现在是最后一部分(M0*N1+M1*N0)*x^(n/2),评估和程度是什么

n/2 and n/2 + n - 2 respectively
这些是否与M0*N0和M1*N1*x^n部分重叠

2*n - 2
yes
因此,最后一部分必须使用+=