使用分治算法提高多项式计算效率:

#include <IOSTREAM>

using namespace std;

//只有两项直接计算
void product(float p[],float q[],float c[]){
    c[0] = p[0]*q[0];
    c[2] = p[1]*q[1];
    c[1] = (p[0] + p[1])*(q[0] + q[1]) - c[0] - c[2];
}

//两个具有n项系数的多项式相加
void plus(float p[],float q[],float c[],int n){
    int i;
    for (i=0;i<n;i++)
    {
        c[i] = p[i] + q[i];
    }
}

//两个具有n项系数的多项式相减
void mins(float p[],float q[],int n){
    int i;
    for (i=0;i<n;i++)
    {
        p[i] = p[i] - q[i];
    }
}

//p和q是多项式系数数组,系数为n项,注意n必须为2的某次幂
void poly_product(float p[],float q[],float r0[],int n){
    int k,i;
    float *r1,*r2,*r3,*r4;  //r3是一个辅助数组
    r1 = new float[2*n - 1];
    r2 = new float[2*n - 1];
    r3 = new float[2*n - 1];
    r4 = new float[2*n - 1];
   
    for (i=0;i<2*n - 1;i++)
    {
        r0[i] = r1[i] = r2[i] = r3[i] = 0;   //递归算法使用指针传递参数时需要把初始值改为0
    }
   
    if (n==2)
    {
        product(p,q,r0);
    }else
    {
        k = n/2;
        poly_product(p,q,r0,k);  //计算r0
        poly_product(p+k,q+k,r1+2*k,k);  //计算r1
       
        plus(p,p+k,r4,k);      //计算p0 + p1
        //    plus(p,p+k,r2+k,k);   //计算p0 + p1
        plus(q,q+k,r3,k);      //计算q0 + q1
        //poly_product(r2+k,r3,r2+k,k);   //递归计算r2  ,这一步出现BUG了
        poly_product(r3,r4,r2+k,k);
        mins(r2+k,r0,2*k - 1);
        mins(r2+k,r1+2*k,2*k - 1);
        plus(r2+k,r0+k,r0+k,2*k - 1);
        plus(r1+2*k,r0+2*k,r0+2*k,2*k - 1);
       
       
    }
   
    delete r1;
    delete r2;
    delete r3;
    delete r4;
}

原文地址:https://www.cnblogs.com/guojidong/p/2833026.html