多项式

这一节我们展示在Sage中如何创建和使用多项式。

一元多项式

有三种方法创建多项式环。

  1. sage: R = PolynomialRing(QQ, 't')
  2. sage: R
  3. Univariate Polynomial Ring in t over Rational Field

这建立一个多项式环并告诉Sage在输出到屏幕时, 使用字符’t’作为不定量的名字。但是这种方法没有定义符号t在Sage中如何使用,你不能用它输入一个属于R的多项式(如$t^2+1$)。

另一种方法是

  1. sage: S = QQ['t']
  2. sage: S == R
  3. True

这里的t有同样的问题。

第三种非常方便的方法是

  1. sage: R.<t> = PolynomialRing(QQ)

  1. sage: R.<t> = QQ['t']

或者,甚至是

  1. sage: R.<t> = QQ[]

这样可以将变量t定义为多项式环的变量,所以你可以很容易构造R中的元素,像下面一样。(注意,第三种方式与Magma中的构造方法类似,而在Magma中可以用这种方法定义的对象有很多。)

  1. sage: poly = (t+1) * (t+2); poly
  2. t^2 + 3*t + 2
  3. sage: poly in R
  4. True

不管你用哪种方法定义一个多项式环,你都可以将不定量恢复为0阶生成元($0^{th}$ generator)。

  1. sage: R = PolynomialRing(QQ, 't')
  2. sage: t = R.0
  3. sage: t in R
  4. True

复系数多项式的构造是类似的。复数可以视为由实数通过符号i生成的。所以可以如下构造:

  1. sage: CC
  2. Complex Field with 53 bits of precision
  3. sage: CC.0 # CC的0阶生成元
  4. 1.00000000000000*I

在创建多项式环时,可以得到环及其生成元,或者只是生成元:

  1. sage: R, t = QQ['t'].objgen()
  2. sage: t = QQ['t'].gen()
  3. sage: R, t = objgen(QQ['t'])
  4. sage: t = gen(QQ['t'])

最后,可以在$Q[t]$上进行一些运算。

  1. sage: R, t = QQ['t'].objgen()
  2. sage: f = 2*t^7 + 3*t^2 - 15/19
  3. sage: f^2
  4. 4*t^14 + 12*t^9 - 60/19*t^7 + 9*t^4 - 90/19*t^2 + 225/361
  5. sage: cyclo = R.cyclotomic_polynomial(7); cyclo
  6. t^6 + t^5 + t^4 + t^3 + t^2 + t + 1
  7. sage: g = 7 * cyclo * t^5 * (t^5 + 10*t + 2)
  8. sage: g
  9. 7*t^16 + 7*t^15 + 7*t^14 + 7*t^13 + 77*t^12 + 91*t^11 + 91*t^10 + 84*t^9
  10. + 84*t^8 + 84*t^7 + 84*t^6 + 14*t^5
  11. sage: F = factor(g); F
  12. (7) * t^5 * (t^5 + 10*t + 2) * (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1)
  13. sage: F.unit()
  14. 7
  15. sage: list(F)
  16. [(t, 5), (t^5 + 10*t + 2, 1), (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1, 1)]

注意到因式被正确地分解并记录了常数项。

如果你要用某些函数,比如R.cyclotomic_polynomial做更多的研究,除了引用Sage,还应该尝试找出具体是什么组件计算了分圆多项式,并引用它们。这里,如果你输入R.cyclotomic_polynomial??来查看源代码的话,你会很快看到一行f = pari.polcyclo(n),这说明PARI被用于求分圆多项式。应该在你的工作中引用PARI。

两个多项式相除将产生一个分式域中的元素(由Sage自动创建)。

  1. sage: x = QQ['x'].0
  2. sage: f = x^3 + 1; g = x^2 - 17
  3. sage: h = f/g; h
  4. (x^3 + 1)/(x^2 - 17)
  5. sage: h.parent()
  6. Fraction Field of Univariate Polynomial Ring in x over Rational Field

使用Laurent级数,可以在分式域QQ[x]上计算级数的展开:

  1. sage: R.<x> = LaurentSeriesRing(QQ); R
  2. Laurent Series Ring in x over Rational Field
  3. sage: 1/(1-x) + O(x^10)
  4. 1 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8 + x^9 + O(x^10)

如果我们命名的变量不同,得到不同的一元多项式环。

  1. sage: R.<x> = PolynomialRing(QQ)
  2. sage: S.<y> = PolynomialRing(QQ)
  3. sage: x == y
  4. False
  5. sage: R == S
  6. False
  7. sage: R(y)
  8. x
  9. sage: R(y^2 - 17)
  10. x^2 - 17

环由变量决定。注意,用x再建一个环,并不能得到一个新的不同的环。

  1. sage: R = PolynomialRing(QQ, "x")
  2. sage: T = PolynomialRing(QQ, "x")
  3. sage: R == T
  4. True
  5. sage: R is T
  6. True
  7. sage: R.0 == T.0
  8. True

Sage还支持任何基本环上的幂级数和Laurent级数环。下面的例子中, 我们新建$F{7}[[T]]$的一个元素, 并使用除法新建:$F{7}((T))$的一个元素。

  1. sage: R.<T> = PowerSeriesRing(GF(7)); R
  2. Power Series Ring in T over Finite Field of size 7
  3. sage: f = T + 3*T^2 + T^3 + O(T^4)
  4. sage: f^3
  5. T^3 + 2*T^4 + 2*T^5 + O(T^6)
  6. sage: 1/f
  7. T^-1 + 4 + T + O(T^2)
  8. sage: parent(1/f)
  9. Laurent Series Ring in T over Finite Field of size 7

可以用双中括号的简单形式新建幂级数环:

  1. sage: GF(7)[['T']]
  2. Power Series Ring in T over Finite Field of size 7

多元多项式

要使用多元多项式,先要声明多项式环和变量。

  1. sage: R = PolynomialRing(GF(5),3,"z") # 这里的3为变量的数量
  2. sage: R
  3. Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5

跟定义一元多项式一样,有多种方法:

  1. sage: GF(5)['z0, z1, z2']
  2. Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5
  3. sage: R.<z0,z1,z2> = GF(5)[]; R
  4. Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5

如果你希望变量的名字是单个字母,可以用下面的简短形式:

  1. sage: PolynomialRing(GF(5), 3, 'xyz')
  2. Multivariate Polynomial Ring in x, y, z over Finite Field of size 5

下面我们做一些运算。

  1. sage: z = GF(5)['z0, z1, z2'].gens()
  2. sage: z
  3. (z0, z1, z2)
  4. sage: (z[0]+z[1]+z[2])^2
  5. z0^2 + 2*z0*z1 + z1^2 + 2*z0*z2 + 2*z1*z2 + z2^2

也可以用更多的数学记号来构造多项式环。

  1. sage: R = GF(5)['x,y,z']
  2. sage: x,y,z = R.gens()
  3. sage: QQ['x']
  4. Univariate Polynomial Ring in x over Rational Field
  5. sage: QQ['x,y'].gens()
  6. (x, y)
  7. sage: QQ['x'].objgens()
  8. (Univariate Polynomial Ring in x over Rational Field, (x,))

Sage中,多元多项式是基于Python的字典(dictionaries)以及多项式的”分配形式”(distributive representation)实现的。Sage用了很多Singular库 Si,如计算最大公因式和理想Gröbner基。

  1. sage: R, (x, y) = PolynomialRing(RationalField(), 2, 'xy').objgens()
  2. sage: f = (x^3 + 2*y^2*x)^2
  3. sage: g = x^2*y^2
  4. sage: f.gcd(g)
  5. x^2

下面我们新建一个由$f$和$g$生成的理想$(f,g)$, 简单把(f,g)R乘在一起就行(也可以用ideal([f,g])ideal(f,g))。

  1. sage: I = (f, g)*R; I
  2. Ideal (x^6 + 4*x^4*y^2 + 4*x^2*y^4, x^2*y^2) of Multivariate Polynomial
  3. Ring in x, y over Rational Field
  4. sage: B = I.groebner_basis(); B
  5. [x^6, x^2*y^2]
  6. sage: x^2 in I
  7. False

顺便一提,上面的Gröbner基不是一个列表,而是一个固定序列。这意味着它有范围(universe),有根源(parent),并且不能修改(不能修改是好事,因为如果改动基的话,与Gröbner基相关的程序都可能出问题)。

  1. sage: B.parent()
  2. Category of sequences in Multivariate Polynomial Ring in x, y over Rational
  3. Field
  4. sage: B.universe()
  5. Multivariate Polynomial Ring in x, y over Rational Field
  6. sage: B[1]= x
  7. Traceback (most recent call last):
  8. ...
  9. ValueError: object is immutable; please change a copy instead.

一些(并不多)交换代数的函数在Sage中也是可用的,并基于Singular实现。比如,我们可以计算$I$的基本分解和相关素理想(associated primes):

  1. sage: I.primary_decomposition()
  2. [Ideal (x^2) of Multivariate Polynomial Ring in x, y over Rational Field,
  3. Ideal (y^2, x^6) of Multivariate Polynomial Ring in x, y over Rational Field]
  4. sage: I.associated_primes()
  5. [Ideal (x) of Multivariate Polynomial Ring in x, y over Rational Field,
  6. Ideal (y, x) of Multivariate Polynomial Ring in x, y over Rational Field]