除了直接利用各种运算符所作的基本算术运算之外,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
以下函数是针对大整数类型的操作:
1. igcd
调用:igcd(n1,n2)
参数:n1是一个整数
n2是一个整数
说明:根据Euclid方法求整数n1和n2的最大公因子
示例:
>igcd(12,6);
6
>igcd(12,7);
1
>igcd(59759821449735512944,40967491029104);
412342768
2. igcd_Lehmer
调用:igcd_Lehmer (n1,n2)
参数:n1 是一个整数
n2是一个整数
说明:根据Lehmer方法求整数n1和n2的最大公因子
示例:
>igcd_Lehmer(12,6);
6
>igcd_Lehmer(12,7);
1
>igcd_Lehmer(59759821449735512944,40967491029104);
412342768
3. ilcm
调用:ilcm(n1,n2)
参数:n1是一个整数
n2是一个整数
说明:求整数n1和n2的最小公倍数
示例:
>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 = [m1,m2,…,mk],表中的整数两两互素。
xlist是一个整数表,即xlist = [x1,x2,…,xk]。
说明:根据中国剩余定理计算,返回一个整数x,满足方程组 x ≡ xi ( mod mi ),
i=1,2,…,k ,且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+n2)mod 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-n2)mod 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*n2)mod 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-1)mod 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 是一个整数
说明:取模运算(非负表示), 返回整数n模p所得的值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
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对变元var的deg次幂的系数
示例:
>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是一个多项式
说明:返回多项式p1和p2的最大公因式
示例:
>gcd((x+y)^7, (x+y)*(34*x-34*z)^8);
x+y
29. pchrem
调用:pchrem(list1,list2)
参数:list1是一个整数表(一组模),即list1 = [m1,m2,…,mk],表中的整数两两互素。
list2是一个多项式表,即list2 = [p1,p2,…,pk]。
说明:根据中国剩余定理计算,返回一个多项式p,满足方程组 p ≡ pi ( mod mi ),
i=1,2,…,k ,且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是一个变元
说明: 返回多项式p1,p2对变元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是一个素数
说明:返回将多项式poly模n所得的结果: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是一个环,M是R上的一个模(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)
以下是针对有理函数的操作:
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
方程求解是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]
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基集合。
示例1:3循环问题的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]]
示例2:3循环问题的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]]