使用分治算法提高多项式计算效率:
#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;
}