多项式系统编程说明书.docx
- 文档编号:28589717
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:33
- 大小:24.48KB
多项式系统编程说明书.docx
《多项式系统编程说明书.docx》由会员分享,可在线阅读,更多相关《多项式系统编程说明书.docx(33页珍藏版)》请在冰豆网上搜索。
多项式系统编程说明书
多项式系统编程说明书
版权所有
“数学机械化与自动推理平台”软件组
2003年5月
1、针对一般系数多项式的操作
1.1、多项式的构造
1.2、获取多项式信息的基本操作
1.3、其它基本操作
1.4、基本算术运算
1.5、其它运算
1.6、释放内存的操作
2、针对整系数多项式的操作
3、常用的类型定义,常数定义和宏函数
4、编程时的一些注意事项
4.1、关于破坏性的函数
4.2、关于变元序
4.3、关于多项式的遍历方法
***************************************************
有关文件:
有关多项式的程序代码主要位于以下文件中:
pol.h,pol.cpp,pol_arith.cpp,pol_gao.cpp,pol_gcd.cpp,pol_fac.cpp。
有关类名:
TRIPoly(多项式类),TDITerm(项类)。
数据结构:
多项式类的数据结构如下:
TVariable*var;变元指针,表示多项式默认的主变元。
TNumberc;TNumber型变量,对于非常数多项式,c=0;对于常数多项式,c表
示常数项。
TDITerm*ups;项的指针,多项式的各项按默认主变元var的次数从高到低排列,ups
指向第一项,即次数最高的一项,各项的系数再按此规则递归表示。
TPolyRC*RefCount;引用计数指针,指向引用计数存储区中的某个存储块,该存储块中
存放着该多项式的引用数。
注:
TPolyRC是一个用于多项式引用计数器管理的类。
项类的数据结构如下:
unsignedshortdeg;整型变量,用来表示该项的次数。
TRIPoly*p;多项式指针,用来表示该项的系数,它又是一个多项式。
TDITerm*nx;项的指针,用来指向项的链接表中的下一个项。
1、针对一般系数多项式的操作
1.1、多项式的构造:
TRIPoly();
TRIPoly*pzero();
构造零多项式
TRIPoly(intn);
用一个普通整数(int类型)n构造常数多项式
TRIPoly(TNumbern);
TRIPoly(TNumber*n);
用一个数(TNumber类型)n构造常数多项式
#defineget_n(n)(newTRIPoly(TNumber(n)))
#defineget_nb(n)(TRIPoly(TNumber(n)))
用一个数(可以是任意类型)n构造常数多项式
TRIPoly(TVariable*v,unsignedshort*d);
TRIPoly(TVariable*v,unsignedshortd);
TRIPoly*get_mv(VAR*v,POLYDEGd);//外部函数
用变元v的d次幂(v^d)构造一个多项式
TRIPoly(TVariable*v);
TRIPoly*get_m(VAR*v);//外部函数
用变元v构造一个多项式
TRIPoly(TVariable*v,TDITerm*dp1);
TRIPoly*get_xt(VAR*v,TDITerm*dp1);//外部函数
用一个变元和一个TDITerm的链接表构造一个多项式
friendTRIPoly*get_v(VAR*v,POLYDEGd,TRIPoly*p);
用一个变元v,一个次数d和一个系数多项式p构造一个多项式:
p*v^d
TRIPoly(constTRIPoly&tr);
复制构造函数
不构造新的内存,只把引用计数增加1。
1.2、获取多项式信息的基本操作:
次数和次数表:
unsignedshortdeg();
friendintldeg(TRIPoly*p);
返回多项式关于默认主变元的最高次数
n=p->deg();等价于n=ldeg(p);
unsignedshortmindeg();
unsignedshortIPord();
返回多项式关于默认主变元的最低次数
unsignedshortDegree(TVariable*v);
friendintpdeg(TRIPoly*p,VAR*v);
返回多项式关于指定的变元v的最高次数
n=pdeg(p,v);等价于n=p->Degree(v);
unsignedshortMinDegree(TVariable*v);
friendintmdeg(TRIPoly*p,VAR*v);
返回多项式关于指定的变元v的最低次数
n=mdeg(p,v);等价于n=p->MinDegree(v);
示例:
p:
=x^3*y^2+x*y^3+y^4;
p->MinDegree(x)=0
p->MinDegree(y)=2
p->MinDegree(a)=0
unsignedshortmaxdeg();
返回多项式关于所有变元的最高次数,即多项式的所有变元中次数最高的变元的次数。
示例:
p:
=x^2*y^5*z^9+x^3+x^2*y^3+w^10;
p->max_deg()=10
项数:
unsignedlongPolyLen();
返回多项式关于默认主变元的项数
示例:
(假定默认主变元为x)
p:
=(x^2+2*x+1)*y^3+2*x*y^2+4*y+6;
p->PolyLen()=3
unsignedlongPolyLen(TVariable*v);
返回多项式关于指定变元v的项数
示例:
p:
=(x^2+2*x+1)*y^3+2*x*y^2+4*y+6;
p->PolyLen(x)=3
p->PolyLen(y)=4
unsignedlongpolylen();
friendintplength(TRIPoly*p);
返回多项式完全展开以后的项数
示例:
p:
=(x^2+2*x+1)*y^3+2*x*y^2+4*y+6;
p->polylen()=6
friendintdlength(TDITerm*dp1);
返回指定的TDITerm的链接表中的完全展开以后的项数
主变元,变元,变元表:
TVariable*MainVar();
返回该多项式的默认的主变元
TVariable*mainvar(TList*ord);
返回该多项式关于指定变元序ord的主变元。
变元表ord中先出现的变元次序低,即若ord=[x1,x2,x3],则x1 若该多项式中不包含变元表中的变元,则函数返回NULL。 TVariable*mainvar_w(TList*ord); 返回该多项式关于指定变元序ord的主变元。 变元表ord中先出现的变元次序高,即若ord=[x1,x2,x3],则x1>x2>x3。 若该多项式中不包含变元表中的变元,则函数返回NULL。 TVariable*minv(); 返回该多项式关于默认变元序的最小变元 TVariable*MinDegVar(); 返回多项式中最高次数最小的变元,如果这样的变元不止一个,则返回在该多项式的 变元表中最先出现的变元。 示例: p: =x^2+y^2+z^3+w^4; p->MinDegVar()=x TList*getVL(); TList*allvar(); 返回多项式的变元表 示例: p: =x^2*y^5*z^9+x^3+x^2*y^3+w^10; p->getVL()=[x,y,z,w] 系数和系数表: TRIPoly*Coefficient(TVariable*v,unsignedshortd); 返回多项式中v^d的系数 示例: s: =3*v^2*y^2+2*v*y^3; s->Coefficient(v,2)=3*y^2 TList*CoeffsM(TList*ord); 返回多项式关于指定变元表ord中所有变元的系数表 注: 所返回的系数表不包含重复的系数 示例: s: =3*v^2*y^2+2*v*y^3; s->CoeffsM([v,y])=[3,2] s->CoeffsM([y,v])=[2,3] s->CoeffsM([v])=[3*y^2,2*y^3] s->CoeffsM([y])=[2*v,3*v^2] TList*Coeffs(TVariable*v); 返回多项式关于指定变元v的系数表,表中各系数多项式按v的次数从高到低排列。 示例: s: =3*v^2*y^2+2*v*y^3; s->Coeffs(v)=[3*y^2,2*y^3]//相当于s->CoeffsM([v]) s->Coeffs(y)=[2*v,3*v^2]//相当于s->CoeffsM([y]) TList*bcoeffs(); 返回多项式的所有基本系数(basecoefficient)的系数表,注意这是一个TNumber的链表。 注: 所返回的系数表不包含重复的系数 示例: s: =3*v^2*y^2+2*v*y^3; s->bcoeffs()=[3,2]//相当于s->CoeffsM([v,y]) p: =3*x^2+5*y*x+2/3*z*x+2*y^2+2/3*z*y; p->bcoeffs()=[3,5,2,2/3]//相当于s->CoeffsM([x,y,z]) TNumbermincoef(); 求多项式的绝对值最小的基本系数(basecoefficient),并返回这个系数的绝对值。 它是一个数(anelementofthebasedomain) 示例: p: =-486*x^3-252*y*x^2+1350*x^2+192*y*x-5000*x+3; p->mincoef()=3 TNumbermaxcoef(); 求多项式的绝对值最大的基本系数(basecoefficient),并返回这个系数的绝对值。 它是一个数(anelementofthebasedomain) 示例: p: =-486*x^3-252*y*x^2+1350*x^2+192*y*x-5000*x+3; p->maxcoef()=5000 首项系数,首项,余项: TRIPolyIPldcf(); friendTRIPoly*init(TRIPoly*p); friendTRIPoly*cp_init(TRIPoly*p);(首项系数复制之后再返回) 返回该多项式关于默认的主变元的首项系数(又称“初式”,即关于主变元的最高次幂的系数)。 示例: (假定默认主变元为x) p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; p->IPldcf()=5*y^3+y^2+1 TRIPolyIPLdCf(TList*ord); 返回该多项式关于指定变元序ord的首项系数(初式)。 变元表ord中先出现的变元次序低。 TRIPoly*IPLdCf_w(TList*ord); 返回该多项式关于指定变元序ord的首项系数(初式)。 变元表ord中先出现的变元次序高。 示例: p: =128*x^7+448*y*x^6+672*y^2*x^5+560*y^3*x^4+280*y^4*x^3+84*y^5*x^2+14*y^6*x+y^7; p->IPLdCf_w([x,y])=128 p->IPLdCf_w([y,x])=1 TNumberIPlbcf(); 返回多项式关于默认变元序的基本首项系数(leadingbasecoefficient), 即取首项系数的首项系数,直到首项系数是常数多项式为止,返回该常数。 因此该函数的返回值一定是一个数(anelementofthebasedomain)。 示例: (假定默认变元序为[x,y]) >p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; p->IPlbcf()=5 TRIPolyIPLbCf(TList*ord); 返回多项式关于指定变元序ord的基本首项系数(leadingbasecoefficient) 示例: >p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; p->IPLbCf([x,y])=5 p->IPLbCf([x])=5*y^3+y^2+1 p->IPLbCf([y])=5*x^5 TNumberIPLbCf_w(TList*ord); 返回多项式关于指定变元序ord的基本首项系数(leadingbasecoefficient), 该函数的返回值一定是一个数 示例: >p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; p->IPLbCf_w([x,y])=5 p->IPLbCf_w([x])=0 p->IPLbCf_w([y])=0 TRIPolyIPlbt(); 返回多项式关于默认变元序的展开后的首项,其结果一定是个单项式。 示例: (假定默认变元序为[x,y]) p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; (p按y展开的形式为: (5*x^5)*y^3+(x^5+x^4)*y^2+(2*x^3)*y+(x^5+x^4+x^3+5*x^2+10)) p->IPlbt()=5*x^5*y^3 TRIPolyIPltv(TVariable*v); 返回多项式关于指定变元v的首项多项式 示例: p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; (p按y展开的形式为: (5*x^5)*y^3+(x^5+x^4)*y^2+(2*x^3)*y+(x^5+x^4+x^3+5*x^2+10)) p->IPltv(x)=5*x^5*y^3+x^5*y^2+x^5 p->IPltv(y)=5*x^5*y^3 TRIPolyIPldt(TList*ord); 返回多项式关于指定变元序ord的展开后的首项,其结果一定是个单项式。 示例: p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; (p按y展开的形式为: (5*x^5)*y^3+(x^5+x^4)*y^2+(2*x^3)*y+(x^5+x^4+x^3+5*x^2+10)) p->IPldt([x,y])=5*x^5*y^3 TRIPoly*IPldt_w(TList*ord); 返回多项式关于指定变元序ord的首项多项式 示例: p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; (p按y展开的形式为: (5*x^5)*y^3+(x^5+x^4)*y^2+(2*x^3)*y+(x^5+x^4+x^3+5*x^2+10)) p->IPldt_w([x,y])=5*x^5*y^3+x^5*y^2+x^5 p->IPldt_w([y,x])=5*x^5*y^3 TRIPolyIPred(); 返回多项式关于默认变元序的余项(即该多项式减去其关于默认变元序的展开后的首项) 即p->IPred()=p-p->IPlbt()。 示例: (假定默认变元序为[x,y]) p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; p->IPred()=x^5*y^2+x^4*y^2+2*x^3*y+x^5+x^4+x^3+5*x^2+10 TRIPolyIPred(TList*ord); 返回多项式关于指定变元序ord的余项(即该多项式减去其关于指定变元序ord的展开后的首项) 即p->IPred(ord)=p-p->IPldt(ord)。 示例: p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; p->IPred([x,y])=x^5*y^2+x^4*y^2+2*x^3*y+x^5+x^4+x^3+5*x^2+10 特殊多项式判断: intIsNumber(); intIsBigInt(); intIPconst(); intnumberp(TRIPoly*p);//外部函数 intnTRIPoly(TRIPoly*p);//外部函数 #definenpoly(p)(p->var==0) 判断该多项式是否常数多项式 intIsZero(); intpis0(); intpzerop(TRIPoly*p);//外部函数 判断该多项式是否零多项式 intpis1(); intunitp(TRIPoly*p);//外部函数 判断该多项式是否多项式1 intnunitp(TRIPoly*p);//外部函数 判断该多项式是否多项式-1 intIPunt(); 判断该多项式是否单变元多项式,是返回1,否返回0。 intmono_pol(TRIPoly*p);//外部函数 判断多项式p是否单项式,是返回1,否返回0。 boolisIntPoly(); 判断该多项式是否整系数多项式(所有的系数都是整数),是返回true,否返回false。 1.3、其它基本操作: 复制: TRIPoly*Clone(); 多项式的复制 构造新的内存 调用方法: TRIPoly*p,*p1; p1=p->Clone(); ...... deletep1; friendTRIPoly*cp_TRIPoly(TRIPoly*p1); #definecp_poly(p)cp_TRIPoly(p) 多项式的复制 构造新的内存 调用方法: TRIPoly*p,*p1; p1=cp_TRIPoly(p);//等价于p1=p->Clone(); ...... deletep1; TAtom*Copy(); 多项式的复制 不构造新的内存,只把引用计数增加1 调用方法: TRIPoly*p,*p1; p1=(TRIPoly*)p->Copy();//等价于p1=newTRIPoly(*p); ...... deletep1; 赋值运算符: TRIPolyoperator=(constTRIPoly&p); 多项式的赋值操作 不构造新的内存,只修改引用计数 调用方法: TRIPolyp,p1; p=p1; 负运算符: TRIPolyoperator-(); friendTRIPoly*neg_TRIPoly(TRIPoly*p);//desctructiveforp 多项式的相反多项式,即该多项式与-1乘积之后所得多项式。 示例: p: =x^2+2*x+1; -p=-x^2-2*x-1 符号和绝对值函数: shortIpsign(); 多项式的符号,即该多项式关于默认变元序的基本首项系数(IPlbcf())的符号。 多项式为正时,返回1;多项式为负时,返回-1;多项式为零时,返回0。 示例: p: =(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; p->Ipsign()=1 p: =(-5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10; p->Ipsign()=-1 TRIPolyIpabs(); 多项式的绝对值,即多项式为负时,返回其相反多项式,否则返回其本身。 多项式的替换: TRIPoly*IPvri(TVariable*v,TNumbern); 将多项式中的变元v替换(赋值)为数n 示例: p1: =x^2+2*x+1; p1->IPvri(x,1)=4 p2: =x^2*y^3+x*y+5; p2->IPvri(x,2)=4*y^3+2*y+5 TRIPoly*IPvtp(TVariable*v,TRIPolyp); 将多项式中的变元v替换为多项式p 示例: p1: =x^2*y^3+x*y+5; p1->IPvtp(x,z)=z^2*y^3+z*y+5 p2: =x^2*y^3+x*y+5; p2->IPvtp(x,z+1)=z^2*y^3+2*z*y^3+y^3+z*y+y+5 多项式的显示(可在调试程序时使用): virtualvoiddisplay(outtype&out=wout)const; 将多项式以展开形式显示 p: =5*x^5*y^3+x^5*y^2+x^4*y^2+2*x^3*y+x^5+x^4+x^3+5*x^2+10; p->display()= 5*x^5*y^3+x^5*y^2+x^4*y^2+2*x^3*y+x^5+x^4+x^3+5*x^2+10 voidpdisplay(TVariable*v); 将多项式以指定变元v的递归形式显示,并且按各变元的降幂排列。 示例: p: =5*x^5*y^3+x^5*y^2+x^4*y^2+2*x^3*y+x^5+x^4+x^3+5*x^2+10; p->pdisplay(x)= (5*y^3+y^2+1)x^5+(y^2+1)x^4+(2*y+1)x^3+(5)x^2+(10) p->pdisplay(y)= (5*x^5)y^3+(x^5+x^4)y^2+(2*x^3)y+(x^5+x^4+x^3+5*x^2+10) 多项式的比较: booloperator==(TRIPoly&bn); friendinteq_TRIPoly(TRIPoly*p1,TRIPoly*p2); #defineeq_poly(p,q)eq_TRIPoly((p),(q)) 比较两个多项式是否相等。 friendintpls(TRIPoly*p1,TRIPoly*p2); 比较两个多项式的大小,p1 1.4、基本算术运算: 加法: friendTRIPoly*pplus(TRIPoly*p1,TRIPoly*p2);//destructiveforp1andp2 TRIPolyoperator+(TRIPolyp);//callpplus friendTRIPoly*poly_plus(TRIPoly
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多项式 系统 编程 说明书