多项式与连分式函数的计算

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "ComplexNumber.h"
#include "Multinomial.h"

//复系数多项式求值
void ncply(double ar[], double ai[], int n, double x, double y, double *u, double *v)
{
 int i;
 double p,q,s,t;
 s=ar[n-1];
 t=ai[n-1];
 for (i=n-2; i>=0; i--)
 {
  ocmul(s,t,x,y,&p,&q);
  s=p+ar[i];
  t=q+ai[i];
 }
 *u=s;
 *v=t;
 return;
}


//一维多项式多组求值
void nplys(double a[], int n, double x[], int m, double p[])
{
 int i,j,mm,nn,ll,t,s,kk,k;
 double *b,y,z;
 b=(double *)malloc(2*n*sizeof(double));
 y=a[n-1];
 for (i=0; i<=n-1; i++) b[i]=a[i]/y;
 k=log(n-0.5)/log(2.0)+1;
 nn=1;
 for (i=0; i<=k-1; i++) nn=2*nn;
 for (i=n; i<nn-1; i++) b[i]=0.0;
 b[nn-1]=1.0;
 t=nn;
 s=1;
 for (i=1; i<=k-1; i++)
 {
  t=t/2;
  mm=-t;
  for (j=1; j<=s; j++)
  {
   mm=mm+t+t;
   b[mm-1]=b[mm-1]-1.0;
   for (kk=2; kk<=t; kk++)
    b[mm-kk]=b[mm-kk]-b[mm-1]*b[mm+t-kk];
  }
  s=s+s;
 }
 for (kk=1; kk<=m; kk++)
 {
  for (i=0; i<=(nn-2)/2; i++)
   a[i]=x[kk-1]+b[2*i];
  mm=1;
  z=x[kk-1];
  for (i=1; i<=k-1; i++)
  {
   mm=mm+mm;
   ll=mm+mm;
   z=z*z;
   for (j=0; j<=nn-1; j=j+ll)
    a[j/2]=a[j/2]+a[(j+mm)/2]*(z+b[j+mm-1]);
  }
  z=z*z/x[kk-1];
  if (nn!=n) a[0]=a[0]-z;
  p[kk-1]=a[0]*y;
 }
 return;
}


//复系数多项式相乘
void ncmul(double pr[], double pi[], int m, double qr[], double qi[], int n, double sr[], double si[], int k)
{
 int i,j;
 double a,b,c,d,u,v;
 for (i=0; i<=k-1; i++)
 {
  sr[i]=0.0;
  si[i]=0.0;
 }
 for (i=0; i<=m-1; i++)
  for (j=0; j<=n-1; j++)
  {
   a=pr[i];
   b=pi[i];
   c=qr[j];
   d=qi[j];
   ocmul(a,b,c,d,&u,&v);
   sr[i+j]=sr[i+j]+u;
   si[i+j]=si[i+j]+v;
  }
 return;
}


//多项式相乘
void npmul(double p[], int m, double q[], int n, double s[], int k)
{
 int i,j;
 for (i=0; i<=k-1; i++) s[i]=0.0;
 for (i=0; i<=m-1; i++)
  for (j=0; j<=n-1; j++)
   s[i+j]=s[i+j]+p[i]*q[j];
 return;
}


//多项式相除
void npdiv(double p[], int m, double q[], int n, double s[], int k, double r[], int l)
{
 int i,j,mm,ll;
 for (i=0; i<=k-1; i++) s[i]=0.0;
 if (q[n-1]+1.0==1.0) return;
 ll=m-1;
 for (i=k; i>=1; i--)
 {
  s[i-1]=p[ll]/q[n-1];
  mm=ll;
  for (j=1; j<=n-1; j++)
  {
   p[mm-1]=p[mm-1]-s[i-1]*q[n-j-1];
   mm=mm-1;
  }
  ll=ll-1;
 }
 for (i=0; i<=l-1; i++) r[i]=p[i];
 return;
}


//复系数多项式相除
void ncdiv(double pr[], double pi[], int m, double qr[], double qi[], int n, double sr[], double si[], int k, \
     double rr[], double ri[], int l)
{
 int i,j,mm,ll;
 double a,b,c,d,u,v;
 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];
  ocdiv(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];
   ocmul(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;
}


//一维多项式求值
double nplyv(double a[], int n, double x)
{
 int i;
 double u;
 u=a[n-1];
 for (i=n-2; i>=0; i--)
  u=u*x+a[i];
 return(u);
}


//函数连分式的计算
double nfpqv(double x[], double b[], int n, double t)
{
 int k;
 double u;
 u=b[n-1];
 for (k=n-2; k>=0; k--)
 {
  if (fabs(u)+1.0==1.0)
   u=1.0e+35*(t-x[k])/fabs(t-x[k]);
  else
   u=b[k]+(t-x[k])/u;
 }
 return(u);
}


//二维多项式求值
double nbply(double a[], int m, int n, double x, double y)
{
 int i,j;
 double u,s,xx;
 u=0.0;
 xx=1.0;
 for (i=0; i<=m-1; i++)
 {
  s=a[i*n+n-1]*xx;
  for (j=n-2; j>=0; j--)
   s=s*y+a[i*n+j]*xx;
  u=u+s;
  xx=xx*x;
 }
 return(u);

}

                                 ----根据《C语言常用算法程序集》整理

 

投票>

转载于:https://my.oschina.net/RapidBird/blog/3424

# ContinuedFraction #### 项目介绍 连分数计算器 支持连分数和小数输入,高精度小数转连分数,无精度损失,用于获取小数在一定范围内最接近的分数 例如π的高精度转连分数 str=> 3.14159265358979 num=> 3.14159265358979000000000000000000000 ctf=> [3;7,15,1,292,1,1,1,2,1,3,1,12,2,4,1,1,3,2,2,1,18,1,2,2,1,7,2,2] 1=> 3.00000000000000000000000000000000000 3 3/1 2=> 3.14285714285714285714285714285714286 7 22/7 3=> 3.14150943396226415094339622641509434 15 333/106 4=> 3.14159292035398230088495575221238938 1 355/113 5=> 3.14159265301190260407226149477372968 292 103993/33102 6=> 3.14159265392142104470871594159265392 1 104348/33215 7=> 3.14159265346743670552045478534915632 1 208341/66317 8=> 3.14159265361893662339750030141060162 1 312689/99532 9=> 3.14159265358107777120441930658185778 2 833719/265381 10=> 3.14159265359140397848254241421927966 1 1146408/364913 11=> 3.14159265358938917154368732170690821 3 4272943/1360120 12=> 3.14159265358981538324194377730744861 1 5419351/1725033 13=> 3.14159265358978910556761228975786423 12 69305155/22060516 14=> 3.14159265358979009430798477470203822 2 144029661/45846065 15=> 3.14159265358978998813773682909318658 4 645423799/205444776 16=> 3.14159265358979000750767514045607416 1 789453460/251290841 17=> 3.14159265358978999879486079142367388 1 1434877259/456735617 18=> 3.14159265358979000014512509093352444 3 5094085237/1621497692 19=> 3.14159265358978999997843356720301190 2 11623047733/3699731001 20=> 3.14159265358979000000839600248412328 2 28340180703/9020959694 21=> 3.14159265358978999999968162106153623 1 39963228436/12720690695 22=> 3.14159265358979000000001193310441815 18 747678292551/237993392204 23=> 3.14159265358978999999999517378526962 1 787641520987/250714082899 24=> 3.14159265358979000000000056801156993 2 2322961334525/739421558002 25=> 3.14159265358978999999999978607241192 2 5433564190037/1729557198903 26=> 3.14159265358979000000000002025128805 1 7756525524562/2468978756905 27=> 3.14159265358978999999999999894805542 7 59729242861971/19012408497238 28=> 3.14159265358979000000000000024695141 2 127215011248504/40493795751381 29=> 3.14159265358979000000000000000000000 2 314159265358979/100000000000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值