第四章 数和多项式            

除了直接利用各种运算符所作的基本算术运算之外,MMP还提供了丰富的指令,以便我们做有关数和多项式的运算。本章将首先介绍这些指令,然后讨论与多项式方程求解以及Grobner基算法有关的函数功能。我们已经在第二章中对数和多项式做了初步的介绍,下面将首先对二者再作进一步的说明。

 

数:

目前MMP可以支持以下五种类型的数,即整数,分数,多精度浮点数,双精度浮点数和复数。其中,双精度浮点数用于进行双精度的浮点运算,它实际上就是对C/C++语言中的double类型的封装。我们所实现的复数类型是指实部和虚部可以是整数,分数,多精度浮点数,双精度浮点数中的任意一种类型,但不能再是复数类型的数。无论是哪种类型的数,就实现的功能而言,除了具有一些共同的基本操作和加减乘除等基本运算外,还包括各种数类之间的相互转化,以及一系列针对每一种具体类型的特定操作,例如整数的素因子分解,最大公因数,中国剩余算法,分数的化简,浮点数的精度设置,复数的共扼和模等这些操作中属于用户函数的部分都将在后面有详细说明,这里只举例说明各种类型的数在用户界面上的输入形式:

>10;      //整数

>10.2345; //多精度浮点数

>25/30;   //分数

>2.5D;    //双精度浮点数(注:以符号D结尾的整数或浮点数表示是双精度浮点数)

>2+3I;    //复数(注:I表示复数记号)

 

多项式:

对于用户而言,只要是符合多项式规则的表达式,在展开(expand)之后都会得到一个多项式,在我们的系统中,多项式的系数可以是上述五种类型的数。多项式除了具有基本的加减乘除运算外,还有一系列针对多项式的特定操作,例如求主变元,分解因式等,详细功能请参看后面的条目。特别地,对于我们系统中的有理表达式的展开会相应地得到一个有理多项式,当然,该有理多项式只具有一些基本运算以及通分、合并、化简等功能,而没有针对普通多项式的那些操作。

例:

>a:=expand((x+1)^2+3);

>x^2+2*x+4

>degree(a,x);

>2

 

§4.1          数的运算

以下函数是针对大整数类型的操作:

1.         igcd

调用:igcd(n1,n2)

参数:n1是一个整数

n2是一个整数

说明:根据Euclid方法求整数n1n2的最大公因子

示例:

   >igcd(12,6);

6

>igcd(12,7);

1

>igcd(59759821449735512944,40967491029104);

412342768

 

2.         igcd_Lehmer

调用:igcd_Lehmer (n1,n2)

参数:n1 是一个整数

n2是一个整数

说明:根据Lehmer方法求整数n1n2的最大公因子

示例:

>igcd_Lehmer(12,6);

 6

 >igcd_Lehmer(12,7);

1

>igcd_Lehmer(59759821449735512944,40967491029104);

 412342768

 

3.          ilcm

调用:ilcm(n1,n2)

参数:n1是一个整数

n2是一个整数

说明:求整数n1n2的最小公倍数

示例:

>ilcm(120,65);

 1560

 >ilcm(5,7);

 35

 

4.         ifactor 

调用:ifactor(n)

参数:n 是一个整数

说明:该函数对整数n进行素因子分解。

n的素数分解为:n = p1n1 p2n2 … pknk, 则返回以下形式的整数表:[p1,n1,p2,n2,…,pk,nk]

注:为保证较快的分解速度,目前的算法不一定能对任意数都进行彻底的分解,当n较大时,可能遗留一个大的因子没有分解。更详细的说明可参见数系统的编程说明书。

示例:

>ifactor(223092870);

   [2,1,3,1,5,1,7,1,11,1,13,1,17,1,19,1,23,1]

>ifactor(29566148020502835);

[3,1,5,1,7,1,65551,1,65543,1,65539,1]

 

5.         isprime

调用:isprime(n)

参数:n 是一个整数

说明:运用概率性检验算法判定n是否为一个素数。

返回1,表示bn是素数(指该数是概率意义上的素数)

返回0,表示bn不是素数(指该数肯定不是素数)。

示例:

>isprime(10)

 0

 >isprime(13);

1

>isprime(144927536233);

1

 

6.         primetable

调用:primetable()  

参数:无

说明:生成某个指定界以内的奇素数表(该素数表的上界在系统中指定,通常65536为上界)。

示例:

>primetable( ); //65536为上界时,该函数生成65536以内的奇素数表。

 

7.         primegen

调用:primegen(n)

参数:n 是一个整数

说明:采用随机搜索的方式,在大于n的某个指定范围(该范围由系统指定)内随机产生一个素数。

示例:

>primegen(1000000);

1000541

 

8.         nextprime

调用:nextprime(n)

参数:n 是一个整数

说明:返回大于n的最小的素数

示例:

>nextprime(100);

101

        >nextprime(1000000);

1000003

 

9.         prevprime

调用:prevprime(n)

参数:n 是一个整数

说明:返回小于n的最大的素数

示例:

>prevprime(100);

97

>prevprime(1000000);

999983

 

10.     isqrt

调用:isqrt(n)

参数:n是一个整数

说明:对整数n求其平方根的整数部分,返回一个整数。

示例:

>isqrt (16);

 4

 >isqrt(5);

 2

 

11.     ilog2

调用:ilog2(n)

参数:n 是一个整数

说明:对整数n求以2为底的对数的整数部分

示例:

 >ilog2 (16);

4

>ilog2(10);

3

      

12.     ilog10

调用:ilog10(n)

参数:n 是一个整数

说明:对整数n求以10为底的对数的整数部分

示例:

>ilog10 (100);

 2

>ilog10(2000);

 3

      

13.     isodd

调用:isodd(n)

参数:n 是一个整数

说明:判定n是否为奇数,是则返回1,否则返回0

示例:

>isodd(10);

0

>isodd(13);

1

 

14.     iseven

调用:iseven(n)

参数:n 是一个整数

说明:判定n是否为偶数,是则返回1,否则返回0

示例:

>iseven(10);

1

>iseven(13);

 0

 

15.     ifactorial

调用:ifactorial(n)

参数:n 是一个整数

说明:计算n的阶乘

示例:

>ifactorial(10 );

3628800

 

16.     iquo

调用:iquo(n1,n2)  

参数:n1 是一个整数

             n2 是一个整数

说明:整数除法,返回商。

示例:

>iquo(1000000,123);

8130

 

17.     irem

调用:irem(n1,n2)

参数:n1 是一个整数

 n2 是一个整数

说明:整数除法,返回余数。

示例:

>irem(1000000,123);

10

 

18.     random

调用:random(n)

参数:n 是一个整数

说明:返回一个10进制n位的随机整数

示例:

>random(10);

5048717272

 

19.     chrem

调用:chrem(mlist, xlist)

参数:mlist是一个整数表(一组模),即mlist = [m1m2mk],表中的整数两两互素。

            xlist是一个整数表,即xlist = [x1x2xk]

说明:根据中国剩余定理计算,返回一个整数x,满足方程组 x xi  ( mod mi )

i=12k ,且0 x m1×m2××mk

示例:

>chrem([3,5,7],[1,2,4]);

67

>chrem([3,5,8,11],[1,0,2,3]);

850

 

20.     imod_sqrt

调用:imod_sqrt(a,p)

参数: a 是一个整数

              p 是一个整数

说明:返回模p下的整数a的平方根之一,即返回整数x,满足:x 2 = a (mod p)

当方程无解时,返回提示信息:No solution for x^2 = a (mod p)

示例:

 >imod_sqrt(100,7);

       4

>imod_sqrt(12,13);

8

 

21.     imod_sum

调用:imod_sum(n1,n2,p)

参数:n1 是一个整数

             n2 是一个整数

             p 是一个整数

说明:模p下的整数加法, 返回(n1+n2mod p

示例:

>imod_sum(10,20,7);

2

>imod_sum(100,200,7);

6

>imod_sum(10,20,5);

0

 

22.     imod_diff

调用: imod_diff(n1,n2,p)

参数:n1 是一个整数

             n2 是一个整数

             p 是一个整数

说明:模p下的整数减法, 返回(n1-n2mod p

示例:

 >imod_diff(10,20,7);

4

>imod_diff(20,10,7);

3

>imod_diff(10,20,5);

0

 

23.     imod_prod

调用:imod_prod(n1,n2,p)

参数: n1 是一个整数

              n2 是一个整数

              p 是一个整数

说明:模p下的整数乘法, 返回(n1*n2mod p

示例:

>imod_prod(10,20,7);

4

>imod_prod(8,9,10);

2

 

24.     imod_quo

调用: imod_quo(n1,n2,p)

参数:n1 是一个整数

             n2 是一个整数

             p 是一个整数

说明:模p下的整数除法, 返回(n1*n2-1mod p

示例:

>imod_quo(100,5,7);

6

>imod_quo(97,4,7);

5

 

25.     imod_neg

调用: imod_neg(n,p)

参数:n 是一个整数

             p 是一个整数

说明:返回模p下的整数n的相反数

示例:

>imod_neg(10,7);

4

>imod_neg(10,9);

8

 

26.     imod_inv

调用: imod_inv(n,p)

参数: n 是一个整数

              p 是一个素数

说明:返回模p下的整数n的逆元素

示例:

>imod_inv(10,7);

5

>imod_inv(9,7);

4

 

27.     imod_exp 

调用: imod_exp(a,n,p)

参数:a 是一个整数

             n 是一个整数

           p 是一个整数

说明:模p下的整数乘幂, 返回 an mod p

示例:

>imod_exp(2,1000000000000,53);

46

 

28.     imod

调用:imod(n,p)

参数:   n是一个整数

           p 是一个整数

说明:取模运算(非负表示), 返回整数np所得的值nn,且0 <= nn < p

示例:

>imod(341414124124,29);

25

 

29.     imod0

调用:imod0(n,p)

参数:   n是一个整数

           p 是一个整数

说明:取模运算(对称表示),返回整数n p所得的值nn,且-p/2 < nn <= p/2

示例:

 >imod0(341414124124,29);

-4

 

以下函数可以适用于各种数的类型:

30.     abs

调用:abs(n)

参数:n 是一个数

说明:返回n的绝对值。当n是复数时,即返回n的模。

示例:

>abs(-10);

10

> abs(-52352345/254);

52352345/254

>abs(2+3I);

3

>abs(2.0+3.0I);

3.605551275463989293119221267470495946251296573845246

>abs(2.0D+3.0DI);

3.60555

       >abs(2/3+(3/5)*I);

13/15

 

31.     ceil  

调用:ceil(n)

参数:n 是一个数

说明:返回不小于n的最小的整数

示例:

>ceil(3.5);

4

>ceil(-3.5);

-3

>ceil(13241234/3241);

4086

      

32.     floor  

调用:floor(n)

参数:n 是一个数

说明:返回不大于n的最大的整数

示例:

>floor(3.5);

3

>floor(-3.5);

-4

>floor(13241234/3241);

4085

 

33.     nsqrt

调用:nsqrt(n)

参数:n 是一个数(包括整数,分数,浮点数,双精度浮点数)

说明:返回n的平方根,返回值的类型和输入值的类型保持一致。

示例:

>nsqrt(341234123.34123412);   //浮点数

18472.5234697708293370474597320

>nsqrt(19469237469234124);   //n是整数时,返回其平方根的整数部分,相当于函

//isqrt()

139532209

>nsqrt(343.34D);                       //双精度浮点数

18.5294

>nsqrt(19461412341/1234123412);  //分数

69752/17565

 

§4.2          多项式的运算                                                     

1.         expand

调用: expand (p)

参数: p是一个多项式     

说明: 得到多项式p的完全展开形式

示例:

>p:=expand((x+y)^7);

 x^7+7*y*x^6+21*y^2*x^5+35*y^3*x^4+35*y^4*x^3+21*y^5*x^2+7*y^6*x+y^7

 

2.         is_number

调用:is_number(p)

参数:p是一个多项式

说明:判断多项式p是否为常数多项式, 是则返回1, 否则返回0

示例:

>p1:= x+10;

>p2:= x;

>is_number(p1-p2);

1

 

3.         is_zero

调用:is_zero(p)

参数:p是一个多项式

说明:判断多项式p是否为0多项式,是则返回1 否则返回0

示例:

>p1:=x+1;

>p2:=x+1;

>is_zero(p1-p2);

1

 

4.         plength

调用:plength(p)

参数:p是一个多项式

说明:返回多项式p完全展开以后的项数

示例:

>p:=expand((x^2+2*x+1)*y^3+2*x*y^2+4*y+6);

y^3*x^2+2*y^3*x+2*y^2*x+y^3+4*y+6

>plength(p);

6

 

5.         plength_v

调用:plength_v(p,x)

参数:p是一个多项式

           x 是一个变元

说明:返回多项式p关于变元x的项数

示例:

>p:=expand((x^2+2*x+1)*y^3+2*x*y^2+4*y+6);

y^3*x^2+2*y^3*x+2*y^2*x+y^3+4*y+6

>plength_v(p,x);

3

>plength_v(p,y);

4

 

6.         main_var

调用:main_var(p,varlist)

参数:p是一个多项式

             varlist是一个变元表

说明:返回多项式p对变元表varlist的主变元 。这里假定变元表varlist中先出现的变元次序高。

示例:

>f:=(x+y)^7;  ( 以下多项式部分的例子中f均为此值)

>main_var(f,[x,y,z]);

x

 

7.         coeffs

调用:coeffs(p,varlist)

参数:p是一个多项式

             varlist是一个变元表

说明:返回多项式p对变元表varlist中所有变元的系数表

注:所返回的系数表不包含重复的系数

示例:

>p:= 3*v^2*y^2+2*v*y^3;

>coeffs(p,[v,y]);

[3,2]

>coeffs(p,[y,v]);

[2,3]

>coeffs(p,[y]);

[2*v,3*v^2]

>coeffs(p,[v]);

[3*y^2,2*y^3]

 

8.         coeffs_v

调用:coeffs_v(p,var)

参数:p是一个多项式

             var是一个变元

说明:返回多项式p对变元var的系数表,表中各系数多项式按var的次数从高到低排列。

示例:

>p := 3*v^2*y^2+2*v*y^3;

>coeffs_v(p,y);

[2*v,3*v^2]

>coeffs_v(p,v);

[3*y^2,2*y^3]

 

9.         bcoeffs

调用:bcoeffs(p)

参数:p是一个多项式

说明: 返回多项式p的所有基本系数(base coefficient)的系数表,注意这是一个数的链表。

注:所返回的系数表不包含重复的系数

示例:

>p := 3*v^2*y^2+2*v*y^3;

>bcoeffs(p);

[3,2]

>p:=3*x^2+5*y*x+2/3*z*x+2*y^2+2/3*z*y;

>bcoeffs(p);

[2,5,3,2/3]

 

10.     coeff

调用:coeff(p,var,deg)

参数:p是一个多项式

             var是一个变元

             deg是一个非负整数

说明:返回多项式p对变元vardeg次幂的系数

示例:

>coeff(f,x,3);

35*y^4

 

11.     degree

调用:degree(p,var)

参数:p是一个多项式

             var是一个变元

说明:返回多项式p对变元var的最高次数

示例:

>degree(f,x);

7

 

12.     min_deg

调用:min_deg(p,var)

参数:p是一个多项式

             var是一个变元

说明:返回多项式p对变元var的最低次数

示例:

>p:=x^3*y^2+x*y^3+y^4;

>min_deg(p,x);

0

>min_deg(p,y);

2

 

13.     divide   

调用:divide(p1,p2)

参数:p1是一个多项式

             p2是一个多项式     

说明:判断p2是否整除p1,是则返回1,否则返回0

示例:

>p1:=x*y^2;

>p2:=y^2;

>divide(p1,p2);

1

 

14.     quo

调用:quo(p1,p2)

参数:p1是一个多项式

             p2是一个多项式     

说明:返回多项式p1对多项式p2的除法的商(关于除式p2的默认主变元作除法)

示例:

>quo(x^3*y+x+1, x^2+x*y+1);

y*x-y^2

>quo(3*x^3*y^2+5*x+1,5*x^2*y+2*x+3);

3/5*y*x-6/25

 

15.     rem   

调用:rem(p1,p2)

参数:p1是一个多项式

             p2是一个多项式     

说明:返回多项式p1对多项式p2的除法的余式(关于除式p2的默认主变元作除法)

示例:

>rem(x^3*y+x+1, x^2+x*y+1);

y^3*x-y*x+x+y^2+1

 

16.     pquo   

调用:pquo(p1,p2)

参数:p1是一个多项式

             p2是一个多项式     

说明:返回多项式p1对多项式p2的关于变元var的伪除法的商

示例:

>pquo((x+y)^3, (y*x-z)^2, x);

y^2*x+3*y^3+2*z*y

 

17.     prem

调用:prem(p1,p2,var)

参数:p1是一个多项式

             p2是一个多项式            

             var是一个变元

说明:返回多项式p1对多项式p2的关于变元var的伪除法的余式

示例:

>prem((x+y)^3, (y*x-z)^2, x);

3*y^6*x+6*z*y^4*x+3*z^2*y^2*x+y^7-3*z^2*y^3-2*z^3*y

 

18.     sqrt

调用:sqrt(p)

参数:p是一个多项式或数(包括整数,分数,复数)

说明:对p开平方。p是复数时仅对实虚部的最大公约数开方。

注意要调用expand才能进行化简。

示例:

>expand(sqrt(8));

2*sqrt(2)

>expand(sqrt(-18));

3I*sqrt(2)

>expand(sqrt(-1/18));

1/6I*sqrt(2)

>expand(sqrt(8+2*I));

sqrt(4+I)*sqrt(2)

>expand(sqrt(x^2+4*x+4));

x+2

 

19.     curt

调用:curt (p)

参数:p 是一个多项式或数(包括整数,分数,复数)

说明:对p开三次方。p是复数时仅对实虚部的最大公约数开三次方。

注意要调用expand才能进行化简。

示例:

>expand(curt(8));

2

>expand(curt(-16));

-2*curt(2)

>expand(curt(-1/18));

-1/6I*curt(12)

>expand(curt(8+8I));

2*curt(1+I)

>expand(curt(x^3));

x

      

20.     qurt

调用:qurt (p)

参数:p 是一个多项式或数(包括整数,分数,复数)

说明:对p开四次方。p是复数时仅对实虚部的最大公约数开四次方。

注意要调用expand才能进行化简。

示例:

>expand(qurt(128));

2*qurt(8)

>expand(qurt(-16));

-2*qurt(-1)

>expand(qurt(-1/128));

1/4*qurt(-2)

>expand(curt(32+16I));

2*curt(2+I)

>expand(qurt((x+1)^4));

x+1

      

21.     lead_coeff,  init

调用:lead_coeff(p,varlist)init(p,varlist)

参数:p是一个多项式

            varlist是一个变元表

说明:返回多项式p对变元表varlist的首项系数(初式)。这里假定变元表varlist中先出现的变元次序高。

示例:

>p:=(x^2+2*x+1)*y^3+2*x*y^2+4*y+6;

>lead_coeff(p,[x,y]);

>init(p,[x,y]);

y^3

>lead_coeff(p,[y,x]);

>init(p,[y,x]); 

x^2+2*x+1

 

22.     base_lead_coeff

调用:base_lead_coeff(p,varlist)

参数:p是一个多项式

            varlist是一个变元表

说明:返回多项式p对变元表varlist的基本首项系数(leading base coefficient)。这里假定变元表varlist中先出现的变元次序高。

示例:

>p:=(x^2+2*x+1)*y^3+2*x*y^2+4*y+6;

>base_lead_coeff(p,[x,y]);

1

>p:=(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10;

>base_lead_coeff(p,[x,y]);

5

 

23.     lead_term_poly

调用:lead_term_poly(p,varlist)

参数:p是一个多项式

            varlist是一个变元表

说明:返回多项式p对变元表varlist的首项多项式。这里假定变元表varlist中先出现的变元次序高。

示例:

>p:=(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10;

>lead_term_poly(p,[x, y]);

5*x^5*y^3+x^5*y^2+x^5

 

24.     lead_term

调用:lead_term(p,varlist)

参数:p是一个多项式

            varlist是一个变元表

说明:返回多项式p对变元表varlist的展开后的首项。这里假定变元表varlist中先出现的变元次序高。

示例:

>p:=(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10;

>lead_term(p,[x, y]);

5*x^5*y^3

 

25.     reductum

调用:reductum(p,varlist)

参数:p是一个多项式

             varlist是一个变元表

说明:返回多项式p对变元表varlist的余项。这里假定变元表varlist中先出现的变元次序高。

示例:

> p:=(5*y^3+y^2+1)*x^5+(y^2+1)*x^4+(2*y+1)*x^3+5*x^2+10;

> reductum(p,[x, y]);

x^5*y^2+x^4*y^2+2*x^3*y+x^5+x^4+x^3+5*x^2+10

 

26.     content

调用:icontent(p)

             content(p,x)

参数:p是一个多项式

             x是一个变元

说明:p=content(p,x)×primitive(p,x)

            p=icontent(p)×iprimitive(p)

icontent(p)   返回多项式p中各项系数的整数最大公因子,结果是整数。

content(p,x) :返回多项式p中关于变元x的各项系数的最大公因子,结果是多项式。

       示例:

>p:=2*y*x^2+4*y^2*x+2*y;

>content(p,x);

2*y

>icontent(p);

2

 

27.     primitive

调用:iprimitive(p)

             primitive(p,x)

参数:p是一个多项式

             x是一个变元

说明:p=content(p,x)×primitive(p,x)

p=icontent(p)×iprimitive(p)

iprimitive(p):返回多项式p的素部(即多项式p除以icontent(p)所得到的多项式)

primitive(p,x):返回多项式p的关于变元x的素部(即多项式p除以content(p,x)所得到的多项式)

示例:

>p:=2*y*x^2+4*y^2*x+2*y;

>primitive(p,x);

x^2+2*y*x+1

>iprimitive(p);

y*x^2+2*y^2*x+y

 

28.     gcd

调用:gcd(p1,p2)

参数:p1是一个多项式

             p2是一个多项式

说明:返回多项式p1p2的最大公因式

示例:

>gcd((x+y)^7, (x+y)*(34*x-34*z)^8);

x+y

 

29.     pchrem 

调用:pchrem(list1,list2)

参数:list1是一个整数表(一组模),即list1 = [m1m2mk],表中的整数两两互素。

                list2是一个多项式表,即list2 = [p1p2pk]

说明:根据中国剩余定理计算,返回一个多项式p,满足方程组 p pi  ( mod mi )

i=12k ,且0 deg(p) m1×m2××mk

示例:

>pchrem([3,7,11],[ 2*x^2, 5*x^3, 7*x^6]);

84*x^6+33*x^3+77*x^2

 

30.     factor

调用:factor(p)

参数:p是一个多项式

说明:返回多项式p的因式分解

示例:

>factor((345*x^3-67*y)^3*(x+y*z-x*z)^7*(23*y-54*z));

[[-1],1,[345*x^3-67*y],3,[z*x-x-z*y],7,[23*y-54*z],1]

 

31.     squarefree

调用:squarefree(p)

参数:p是一个多项式

说明: 返回多项式p的无平方因式分解

示例:

>squarefree((345*x^3-67*y)^3*(x+y*z-x*z)^7*(23*y-54*z));

[1,1,345*x^3-67*y,3,-z*x+x+z*y,7,23*y-54*z,1]

 

32.     derivative

调用:derivative(p,var)

参数:p是一个多项式

说明:返回多项式p关于变元var的导数多项式

示例:

>p:=x^2*y+2*x*y+3*y^3;

>derivative(p,x);

2*x*y+2*y

>derivative(p,y);

9*y^2+x^2+2*x

 

33.     var_list

调用: var_list(p)

参数: p是一个多项式

说明: 返回多项式p的变元表

示例:

>p:= x^2*y^5*z^9+x^3+x^2*y^3+w^10;

>var_list(p);

[x, y, z, w]

 

34.     subs

调用:subs(p,var,n)

参数: p是一个多项式

             var是一个变元

             n是一个数

说明:返回将多项式p中的变元var替换(赋值)为数n所得到的结果

示例:

>subs((345*x^3-67*y)^3*(23*y-54*z), x, 3);

-6917549*y^4+16241202*z*y^3+2885237415*y^3-6774035670*z*y^2-401134127175*y^2+941793168150*z*y+18589872610125*y-43645787867250*z

 

35.     subsp

调用:subsp(p,var,q)

参数: p是一个多项式

             var是一个变元

             q是一个多项式

说明:返回将多项式p中的变元var替换为多项式q所得到的结果

示例:

>p:= x^2*y^3+x*y+5;

       >subsp(p, x, z);

z^2*y^3+z*y+5

>subsp(p, x, z+1);

z^2*y^3+2*z*y^3+y^3+z*y+y+5

 

36.     resultant

调用:resultant(p1,p2,var)

参数:p1是一个多项式

             p2是一个多项式

             var是一个变元

说明: 返回多项式p1p2对变元var的结式

示例:

>resultant((x+y)^4,  y+z, y);

x^4-4*z*x^3+6*z^2*x^2-4*z^3*x+z^4

 

37.     pmod

调用:pmod(poly,n)

参数:poly是一个多项式

             n是一个素数

说明:返回将多项式polyn所得的结果:poly mod n

示例:

>pmod((5*x^3-67*y)^3*(23*y-54*z),3);

y*x^9+y^4

 

38.     pmod_sum

调用:pmod_sum(p1,p2,n)

参数:p1是一个多项式

             p2是一个多项式

             n是一个素数

说明:返回模n下的多项式p1,p2的和: (p1+p2) mod n

示例:

>pmod_sum( (x+y)^7, (y*x-z)^3,13);

x^7+7*y*x^6+8*y^2*x^5+9*y^3*x^4+9*y^4*x^3+y^3*x^3+8*y^5*x^2+10*z*y^2*x^2+7*y^6*x+3*z^2*y*x+y^7+12*z^3

 

39.     pmod_diff

调用:pmod_diff(p1,p2,n)

参数:p1是一个多项式

             p2是一个多项式

             n是一个素数

说明:返回模n下的多项式p1,p2的差: ( p1-p2) mod n

示例:

>pmod_diff( (x+y)^7, (y*x-z)^3,13);

x^7+7*y*x^6+8*y^2*x^5+9*y^3*x^4+9*y^4*x^3+12*y^3*x^3+8*y^5*x^2+3*z*y^2*x^2+7*y^6*x+10*z^2*y*x+y^7+z^3

 

40.     pmod_prod

调用:pmod_prod(p1,p2,n)

参数:p1是一个多项式

             p2是一个多项式

           n是一个素数

说明:返回模n下的多项式p1,p2的积:( p1*p2) mod n

示例:

>pmod_prod( (x+y)^7, (y*x-z)^3,13);

y^3*x^10+7*y^4*x^9+10*z*y^2*x^9+8*y^5*x^8+5*z*y^3*x^8+3*z^2*y*x^8+9*y^6*x^7+2*z*y^4*x^7+8*z^2*y^2*x^7+12*z^3*x^7+9*y^7*x^6+12*z*y^5*x^6+11*z^2*y^3*x^6+6*z^3*y*x^6+8*y^8*x^5+12*z*y^6*x^5+z^2*y^4*x^5+5*z^3*y^2*x^5+7*y^9*x^4+2*z*y^7*x^4+z^2*y^5*x^4+4*z^3*y^3*x^4+y^10*x^3+5*z*y^8*x^3+11*z^2*y^6*x^3+4*z^3*y^4*x^3+10*z*y^9*x^2+8*z^2*y^7*x^2+5*z^3*y^5*x^2+3*z^2*y^8*x+6*z^3*y^6*x+12*z^3*y^7

 

41.     pmod_quo

调用: pmod_quo(p1,p2,n)

参数: p1是一个多项式

              p2是一个多项式

             n是一个素数

说明:返回模n下的多项式p1对多项式p2的除法的商(关于除式p2的默认主变元作除法):quo(p1,p2) mod n

示例:

>pmod_quo(11*x^2*y^3, x*y,3);

2*y^2*x

 

42.     pmod_prem

调用: pmod_prem(p1, p2, var, n)

参数: p1是一个多项式

              p2是一个多项式

              var是一个变元

              n是一个素数

说明:返回模n下的多项式p1对多项式p2的关于变元var的伪除法的余式: prem(p1,p2,var) mod n

示例:

>pmod_prem( (x+y)^7, (y*x-z)^3,x,13);

8*y^20*x^2+z*y^18*x^2+2*z^2*y^16*x^2+2*z^3*y^14*x^2+z^4*y^12*x^2+8*z^5*y^10*x^2+7*y^21*x+12*z^2*y^17*x+6*z^3*y^15*x+10*z^4*y^13*x+z^5*y^11*x+4*z^6*y^9*x+y^22+9*z^3*y^16+z^4*y^14+9*z^5*y^12+5*z^6*y^10+2*z^7*y^8

 

43.     pmod_gcd

调用:pmod_gcd (p1,p2,n)

参数:p1是一个多项式

             p2是一个多项式

             n是一个素数

说明:返回在模n的有限域上多项式p1, p2的最大公因式

示例:

>pmod_gcd( (3*x+y)^3, (3*x+y)*(3*y-z)^2,13);

x+9*y

 

44.     pmod_factor

调用:pmod_factor(poly,n)

参数:poly是一个多项式

             n是一个素数

说明:返回在模n的有限域上单变元多项式poly的因式分解

示例:

>pmod_factor( (x+7*y)^2,13);

[x^2+y*x+10*y^2]

 

45.     pmod_squarefree

调用:pmod_squarefree (poly,n)

参数:poly是一个多项式

             n是一个素数

说明:返回在模n的有限域上单变元多项式poly的无平方因式分解

示例:

>pmod_squarefree( (x+7*y)^2,13);

[x-6*y,2]

 

46.     factoras

调用:factoras(poly,as,varlist)

参数:poly是一个多项式

             as  是一个升列

             varlist是一个变元表

说明:返回多项式poly在升列as所定义的代数扩域上的关于变元表varlist的因式分解。这里假定变元表varlist中先出现的变元次序高。

示例:

>factoras(x^4-1,[a^2+1],[a,x]);

  [x+1,1,x-1,1,-x-a,1,-x+a,1]

>factoras(x^4+a*x^3+2*x^3+2*a*x^2+5*x^2+2*a*x+6*x+6,[a^2+1],[a,x]);

  [10*a*x^2+11*x^2+11*a*x-10*x+30*a+33,1,-a*x-a-1,1,x+a+1,1]

 

47.     pdisplay

调用:pdisplay (p,var)

参数:p是一个多项式

           var是一个变元

说明:将多项式p以指定变元var的递归形式显示,并且按各变元的降幂排列。

示例:

>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;

>pdisplay(p,x);

(5*y^3+y^2+1)x^5+(y^2+1)x^4+(2*y+1)x^3+(5)x^2+(10)

>pdisplay(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)

 

48.    syzygy多项式合冲)

调用:syzygy(ps, vl)

参数:ps是一个多项式表

       vl是一个变元表

说明:定义:假设R是一个环,MR上的一个模Module,令是一个多项式组,并且满足,则所有满足的多项式组组成了,我们把它叫做syzygy模,记作

该函数求一个多项式组ps在变元序vl下的syzygy,其中ps是任意的一组多项式。函数返回一个syzygy基所组成的矩阵。

示例:

>syzygy([x+1,2*x-y,y+5], [x,y]);

matrix(-y-5,0,x+1;0,-y-5,2*x-y;2*x+5,-x-1,-x-1;2*y+10,-y-5,-y-2)

>syzygy([x+1,y-2,z+3], [x,y,z]);

matrix(-y+2, -z-3, 0; x+1, 0, -z-3; 0, x+1, y-2)

 

§4.3          有理函数

 

以下是针对有理函数的操作:

 

49.     getnu

调用:getnu(rational)

参数:rational是一个有理多项式

说明:返回该有理多项式的分子

示例:

>r:=expand((x^2+1)/(y-2));

(x^2+1)/(y-2)

>getnu(r);

x^2+1

 

50.     getde

调用:getde(rational)

参数:rational是一个有理多项式

说明:返回该有理多项式的分母

示例:

>r:=expand((x^2+1)/(y-2));

(x^2+1)/(y-2)

>getde(r);

y-2

 

§4.4       多项式方程求解

方程求解是MMP所具有的非常重要的功能之一,而许多数学运算都要建立在方程求解的基础之上。本节将集中介绍MMP所提供的所有与方程求解有关的指令,这些指令将通过采用各种不同的算法,针对各种不同的方程或方程组进行求解,最终获得该方程(组)的精确解或数值解,或者取得与方程的解有关的信息。

 

51.     polysolver(单变元多项式方程的数值解)

调用:polysolver (poly)

参数:poly是一个单变元多项式

说明:求单变元多项式poly的全部复数根,返回值是一个复数的链表。

示例:

>polysolver(3*x^5-92*x^4+1016*x^3-5074*x^2+11413*x-9282);

[13, 7, 5.66667, 3, 2]

>polysolver(3*x^5-92*x^4+1016*x^3-5074*x^2+1413*x-9282);

[-1.10096, 15.9317+0.141453I, 15.9317-0.141453I, -0.0479017-1.36161I, -0.0479017+1.3

6161I]

 

52.     roots(多变元多项式方程组的准确解)

调用:roots(ps,vs,ds)

        参数:ps是一个多项式链表,表示一组方程。

vs是一个变元表,表示方程组中待求解的变元(降序排列)。

ds是一个多项式链表,表示一组已知不为零的多项式集合(缺省为空集)。

说明:在方程组ps的特征列的基础上求该方程组的所有准确解。

返回值是一个偶数长度的链表,其中每个元素仍是链表。

每两个链表表示一个解:第奇数个链表存放各个变元及其解,

随后的第偶数个链表存放自由变元。

示例:

>ps:=[x^2+(p-10)*x-9*p+9, y^3-x+1];

>vs:=[x,y,p];

>roots(ps,vs);

 

(中间输出结果如下)

        A New Component !

       

        A New Component !

       

       A New Component !

       

The ascendant charicteristic sets are :

[[y^2+2*y+4,x-9],[y-2,x-9],[y^3+p,x+p-1]]

       

All the 6 solution(s):

       

Solution 1:

y=(-2I*sqrt(3)-2)/(2),x=9,

where free variables are: p

       

Solution 2:

y=(2I*sqrt(3)-2)/(2),x=9,

where free variables are: p

       

Solution 3:

y=2,x=9,

where free variables are: p

       

Solution 4:

y=-curt(p),x=-p+1,

where free variables are: p

           

Solution 5:

y=1/4*curt(p)*sqrt(3)^2+1/2I*curt(p)*sqrt(3)-1/4*curt(p),x=-p+1,

where free variables are: p

           

Solution 6:

y=-1/2I*curt(p)*sqrt(3)+1/2*curt(p),x=-p+1,

where free variables are: p

           

(最终输出结果如下)

[ 

            [y,(-2I*sqrt(3)-2)/(2),x,9],  [p],  

[y,(2I*sqrt(3)-2)/(2),x,9],  [p],

[y,2,x,9],  [p], 

[y,-curt(p),x,-p+1],  [p], 

[y,1/4*curt(p)*sqrt(3)^2+1/2I*curt(p)*sqrt(3)-1/4*curt(p),x,-p+1],  [p],

[y,-1/2I*curt(p)*sqrt(3)+1/2*curt(p),x,-p+1],  [p] 

]

 

53.     gsolve (多变元多项式方程组的数值解)

调用:gsolve(ps,vs,gs)

        参数:ps是一个多项式链表,表示一组方程。

vs是一个变元表,表示方程组中待求解的变元(降序排列)。

gs是一个数的链表,代表变元的一组初始值。

说明:本函数利用BFGS方法,也称拟Newton方法,求解方程组ps在初始值gs附近

的一个数值解。

示例1

>f1:=expand(x^2+y^2-41);

>f2:=expand(x+y-9);

>ps:=[f1,f2];

>vs:=[x,y];

>gs:=[100,20];

>GSolve(ps,vs,gs);

(最终输出结果如下)

     [5,4]

 

示例2

>f1:=expand(x^2*y+y^2*z-116);

>f2:=expand(x^4+y^3+z^3-270);

>f3:=expand(x+y+z-12);

>ps:=[f1,f2,f3];

>vs:=[x,y,z];

>gs:=[100,20,20];

>GSolve(ps,vs,gs);

 

(最终输出结果如下)

     [3,4,5]

 

§4.5          Groebner

1.         gb

调用:gb(ps), gb(ps,1)

参数:ps是一个多项式表

说明:这一命令将用Buchberger的算法计算ps的字典序下的Groebner基。这里变量的次序由其出现先后确定:先出现的变量次序高。如果变量已经在以前出现,则使用以前的顺序。gb(ps)计算约化Groebner基。 gb(ps,1) 计算非约化Groebner基。

示例:3循环问题的Groebner基:

>gb([x3+x2+x1,x3*x2+x2*x1+x1*x3,x3*x2*x1-1]);

[x3+x2+x1,-x2^2-x1*x2-x1^2,-x1^3+1]

 

2.         gbs

调用:gbs(ps), gbs(ps,1)

参数:ps是一个多项式表

说明:这一命令将用Buchberger的算法计算ps的字典序下的Groebner基集合。在计算的过程中,将对多项式进行分解。这里变量的次序由其出现先后确定:先出现的变量次序高。如果变量已经在以前出现,则使用以前的顺序。gbs(ps)计算约化Groebner基集合。 gbs(ps,1) 计算非约化Groebner基集合。

示例13循环问题的Groebner基集合:

>gbs([x3+x2+x1,x3*x2+x2*x1+x1*x3,x3*x2*x1-1]);

        [[x3+x2+1,x2^2+x2+1,x1-1],[x3+x1+1,x2-1,x1^2+x1+1],[x3-1,x2+x1+1,x1^2+x1+1]]

 

示例23循环问题的Groebner基集合:

>gbs([x3+x2+x1,x3*x2+x2*x1+x1*x3,x3*x2*x1-1],1);

[[x3+x2+x1,x2^2+x1*x2+x1^2,x1-1],[x3+x2+x1,x2^2+x1*x2+x1^2,x1^2+x1+1]]