1.8 复系数多项式相除 cpdv.c
来自「许士良常用算法程序集C语言,包括c++一些常用算法代码」· C语言 代码 · 共 86 行
C
86 行
/*****************************************************
1.8 复系数多项式相除,计算P被Q除得的商多项式S(z)和余多项式R(z)
*****************************************************/
#include "math.h"
void cpdv(pr,pi,m,qr,qi,n,sr,si,k,rr,ri,l)
int m,n,k,l;
double pr[],pi[],qr[],qi[],sr[],si[],rr[],ri[];
{
int i,j,mm,ll;
double a,b,c,d,u,v;
void cmul(double,double,double,double,double *,double *);
void cdiv(double,double,double,double,double *,double *);
for (i=0; i<=k-1; i++)
{
sr[i]=0.0; si[i]=0.0;
}
d=qr[n-1]*qr[n-1]+qi[n-1]*qi[n-1];
if (d+1.0==1.0) return;
ll=m-1;
for (i=k; i>=1; i--)
{
a=pr[ll];
b=pi[ll];
c=qr[n-1];
d=qi[n-1];
cdiv(a,b,c,d,&u,&v);
sr[i-1]=u;
si[i-1]=v;
mm=ll;
for (j=1; j<=n-1; j++)
{
a=sr[i-1];
b=si[i-1];
c=qr[n-j-1];
d=qi[n-j-1];
cmul(a,b,c,d,&u,&v);
pr[mm-1]=pr[mm-1]-u;
pi[mm-1]=pi[mm-1]-v;
mm=mm-1;
}
ll=ll-1;
}
for(i=0; i<=l-1; i++)
{
rr[i]=pr[i];
ri[i]=pi[i];
}
return;
}
static void cmul(a,b,c,d,e,f)
double a,b,c,d,*e,*f;
{
double p,q,s;
p=a*c;
q=b*d;
s=(a+b)*(c+d);
*e=p-q;
*f=s-p-q;
return;
}
static void cdiv(a,b,c,d,e,f)
double a,b,c,d,*e,*f;
{
double p,q,s,w;
p=a*c;
q=-b*d; ]
s=(a+b)*(c-d);
w=c*c+d*d;
if (w+1.0==1.0)
{
*e=1.0e+35*a/fabs(a);
*f=1.0e+35*b/fabs(b);
}
else
{
*e=(p-q)/w;
*f=(s-p-q)/w;
}
return;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?