多项式¶
多项式幂¶
如何在Sage中计算模多项式幂?
计算 \(x^{{2006}} \pmod {{x^3 + 7}}\) 在里面 \(GF(97)[x]\) ,我们创建商环 \(GF(97)[x]/(x^3+7)\) ,然后计算 \(x^{{2006}}\) 在里面。作为一个Sage的标记,我们必须区分 \(x\) 在里面 \(GF(97)[x]\) 以及相应的元素(我们用 \(a\) )在商环中 \(GF(97)[x]/(x^3+7)\) .
sage: R = PolynomialRing(GF(97),'x')
sage: x = R.gen()
sage: S = R.quotient(x^3 + 7, 'a')
sage: a = S.gen()
sage: S
Univariate Quotient Polynomial Ring in a over
Finite Field of size 97 with modulus x^3 + 7
sage: a^2006
4*a^2
另一种方法是:
sage: R = PolynomialRing(GF(97),'x')
sage: x = R.gen()
sage: S = R.quotient(x^3 + 7, 'a')
sage: a = S.gen()
sage: a^20062006
80*a
sage: print(gap.eval("R:= PolynomialRing( GF(97))"))
GF(97)[x_1]
sage: print(gap.eval("i:= IndeterminatesOfPolynomialRing(R)"))
[ x_1 ]
sage: gap.eval("x:= i[1];; f:= x;;")
''
sage: print(gap.eval("PowerMod( R, x, 20062006, x^3+7 );"))
Z(97)^41*x_1
sage: print(gap.eval("PowerMod( R, x, 20062006, x^3+7 );"))
Z(97)^41*x_1
sage: print(gap.eval("PowerMod( R, x, 2006200620062006, x^3+7 );"))
Z(97)^4*x_1^2
sage: a^2006200620062006
43*a^2
sage: print(gap.eval("PowerMod( R, x, 2006200620062006, x^3+7 );"))
Z(97)^4*x_1^2
sage: print(gap.eval("Int(Z(97)^4)"))
43
因式分解¶
你可以用Sage计算多项式。
使用Sage对一元多项式进行因子分解是应用该方法的问题 factor
实际上,这个方法实际上调用了Pari,所以计算速度相当快。
sage: x = PolynomialRing(RationalField(), 'x').gen()
sage: f = (x^3 - 1)^2-(x^2-1)^2
sage: f.factor()
(x - 1)^2 * x^2 * (x^2 + 2*x + 2)
利用奇异界面,Sage还对多元多项式进行因子分解。
sage: x, y = PolynomialRing(RationalField(), 2, ['x','y']).gens()
sage: f = (9*y^6 - 9*x^2*y^5 - 18*x^3*y^4 - 9*x^5*y^4 + 9*x^6*y^2 + 9*x^7*y^3
....: + 18*x^8*y^2 - 9*x^11)
sage: f.factor()
(9) * (-x^5 + y^2) * (x^6 - 2*x^3*y^2 - x^2*y^3 + y^4)
多项式GCD¶
本例说明了单变量多项式GCD:
sage: x = PolynomialRing(RationalField(), 'x').gen()
sage: f = 3*x^3 + x
sage: g = 9*x*(x+1)
sage: f.gcd(g)
x
本例说明了多元多项式GCD:
sage: R.<x,y,z> = PolynomialRing(RationalField(), order='lex')
sage: f = 3*x^2*(x+y)
sage: g = 9*x*(y^2 - x^2)
sage: f.gcd(g)
x^2 + x*y
另一种方法是:
sage: R2 = singular.ring(0, '(x,y,z)', 'lp')
sage: a = singular.new('3x2*(x+y)')
sage: b = singular.new('9x*(y2-x2)')
sage: g = a.gcd(b)
sage: g
x^2+x*y
这个例子说明了通过GAP接口的一元多项式GCD。
sage: R = gap.PolynomialRing(gap.GF(2)); R
PolynomialRing( GF(2), ["x_1"] )
sage: i = R.IndeterminatesOfPolynomialRing(); i
[ x_1 ]
sage: x_1 = i[1]
sage: f = (x_1^3 - x_1 + 1)*(x_1 + x_1^2); f
x_1^5+x_1^4+x_1^3+x_1
sage: g = (x_1^3 - x_1 + 1)*(x_1 + 1); g
x_1^4+x_1^3+x_1^2+Z(2)^0
sage: f.Gcd(g)
x_1^4+x_1^3+x_1^2+Z(2)^0
当然,我们可以在中做同样的计算,它使用NTL库(它可以非常快速地在有限域上进行巨大的多项式gcd)。
sage: x = PolynomialRing(GF(2), 'x').gen()
sage: f = (x^3 - x + 1)*(x + x^2); f
x^5 + x^4 + x^3 + x
sage: g = (x^3 - x + 1)*(x + 1)
sage: f.gcd(g)
x^4 + x^3 + x^2 + 1
多项式根¶
Sage可以计算单变多项式的根。
sage: x = PolynomialRing(RationalField(), 'x').gen()
sage: f = x^3 - 1
sage: f.roots()
[(1, 1)]
sage: f = (x^3 - 1)^2
sage: f.roots()
[(1, 2)]
sage: x = PolynomialRing(CyclotomicField(3), 'x').gen()
sage: f = x^3 - 1
sage: f.roots()
[(1, 1), (zeta3, 1), (-zeta3 - 1, 1)]
第一对是根,第二对是它的多重性。
在某些情况下,GAP确实可以找到一元多项式的根,但是GAP通常不会这样做。(根必须生成一个有限域或分圆域的子域) RadiRoot
,它必须安装在GAP的安装中,这有助于对有理系数多项式执行此操作 (radiroot
它本身需要安装其他软件包;请查看其网页了解更多详细信息)。这个 Factors
命令实际上有一个选项,允许您增加groundfield,以便因子分解实际上返回根。更多详细信息,请参见GAP参考手册第64.10节“多项式因式分解”中给出的示例。
多元函数的求值¶
您可以像往常一样在Sage中计算多项式,方法是代入点:
sage: x = PolynomialRing(RationalField(), 3, 'x').gens()
sage: f = x[0] + x[1] - 2*x[1]*x[2]
sage: f
-2*x1*x2 + x0 + x1
sage: f(1,2,0)
3
sage: f(1,2,5)
-17
这也适用于rational函数:
sage: h = f /(x[1] + x[2])
sage: h
(-2*x1*x2 + x0 + x1)/(x1 + x2)
sage: h(1,2,3)
-9/5
Sage还执行符号操作:
sage: var('x,y,z')
(x, y, z)
sage: f = (x + 3*y + x^2*y)^3; f
(x^2*y + x + 3*y)^3
sage: f(x=1,y=2,z=3)
729
sage: f.expand()
x^6*y^3 + 3*x^5*y^2 + 9*x^4*y^3 + 3*x^4*y + 18*x^3*y^2 +
27*x^2*y^3 +
x^3 + 9*x^2*y + 27*x*y^2 + 27*y^3
sage: f(x = 5/z)
(3*y + 25*y/z^2 + 5/z)^3
sage: g = f.subs(x = 5/z); g
(3*y + 25*y/z^2 + 5/z)^3
sage: h = g.rational_simplify(); h
(27*y^3*z^6 + 135*y^2*z^5 + 225*(3*y^3 + y)*z^4 + 125*(18*y^2 + 1)*z^3 +
15625*y^3 + 9375*y^2*z + 1875*(3*y^3 + y)*z^2)/z^6
多元多项式根¶
Sage(使用奇异性的接口)可以在某些情况下(他们假设解是零维变量)使用Gröbner基来求解多元多项式方程组。下面是一个简单的例子:
sage: R = PolynomialRing(QQ, 2, 'ab', order='lp')
sage: a,b = R.gens()
sage: I = (a^2-b^2-3, a-2*b)*R
sage: B = I.groebner_basis(); B
[a - 2*b, b^2 - 1]
所以 \(b=\pm 1\) 和 \(a=2b\) .
格氏碱基¶
这种计算使用后台的奇异性来计算Gröbner基。
sage: R = PolynomialRing(QQ, 4, 'abcd', order='lp')
sage: a,b,c,d = R.gens()
sage: I = (a+b+c+d, a*b+a*d+b*c+c*d, a*b*c+a*b*d+a*c*d+b*c*d, a*b*c*d-1)*R; I
Ideal (a + b + c + d, a*b + a*d + b*c + c*d, a*b*c + a*b*d + a*c*d + b*c*d,
a*b*c*d - 1) of Multivariate Polynomial Ring in a, b, c, d over Rational Field
sage: B = I.groebner_basis(); B
[a + b + c + d,
b^2 + 2*b*d + d^2,
b*c - b*d + c^2*d^4 + c*d - 2*d^2,
b*d^4 - b + d^5 - d,
c^3*d^2 + c^2*d^3 - c - d,
c^2*d^6 - c^2*d^2 - d^4 + 1]
你可以使用多个环,而不必像单数那样来回切换。例如,
sage: a,b,c = QQ['a,b,c'].gens()
sage: X,Y = GF(7)['X,Y'].gens()
sage: I = ideal(a, b^2, b^3+c^3)
sage: J = ideal(X^10 + Y^10)
sage: I.minimal_associated_primes ()
[Ideal (c, b, a) of Multivariate Polynomial Ring in a, b, c over Rational Field]
sage: J.minimal_associated_primes () # slightly random output
[Ideal (Y^4 + 3*X*Y^3 + 4*X^2*Y^2 + 4*X^3*Y + X^4) of Multivariate Polynomial
Ring in X, Y over Finite Field of size 7,
Ideal (Y^4 + 4*X*Y^3 + 4*X^2*Y^2 + 3*X^3*Y + X^4) of Multivariate Polynomial
Ring in X, Y over Finite Field of size 7,
Ideal (Y^2 + X^2) of Multivariate Polynomial Ring in X, Y over Finite Field
of size 7]
所有真正的工作都是由单数完成的。
Sage还包括 gfan
它为计算Gröbner基提供了其他快速算法。更多细节请参阅参考手册中关于“格勃纳风扇”的部分。