多项式¶
在本节中,我们将说明如何在Sage中创建和使用多项式。
一元多项式¶
有三种方法可以创建多项式环。
sage: R = PolynomialRing(QQ, 't')
sage: R
Univariate Polynomial Ring in t over Rational Field
这将创建一个多项式环,并告诉Sage在打印到屏幕时使用(字符串)“t”作为不确定项。但是,这并没有定义符号 t
在Sage中使用,因此不能使用它来输入多项式(例如 \(t^2+1\) )属于 R
.
另一种方法是
sage: S = QQ['t']
sage: S == R
True
这与 t
.
第三个非常方便的方法是
sage: R.<t> = PolynomialRing(QQ)
或
sage: R.<t> = QQ['t']
甚至
sage: R.<t> = QQ[]
这有一个额外的副作用,它定义了变量 t
得到多项式环的不确定性,这样就可以方便地构造元素 R
,如下所示。(请注意,第三种方法与Magma中的构造器符号非常相似,就像Magma中的构造器符号一样,它可以用于广泛的对象。)
sage: poly = (t+1) * (t+2); poly
t^2 + 3*t + 2
sage: poly in R
True
无论用什么方法来定义多项式环,都可以将不确定的 \(0^{{th}}\) 发电机:
sage: R = PolynomialRing(QQ, 't')
sage: t = R.0
sage: t in R
True
注意,复数也有类似的构造:复数可以看作是由符号在实数上生成的 i
;因此,我们有以下内容:
sage: CC
Complex Field with 53 bits of precision
sage: CC.0 # 0th generator of CC
1.00000000000000*I
对于多项式环,可以在环创建过程中同时获得环及其生成器,或仅获取生成器,如下所示:
sage: R, t = QQ['t'].objgen()
sage: t = QQ['t'].gen()
sage: R, t = objgen(QQ['t'])
sage: t = gen(QQ['t'])
最后我们在 \(\QQ[t]\) .
sage: R, t = QQ['t'].objgen()
sage: f = 2*t^7 + 3*t^2 - 15/19
sage: f^2
4*t^14 + 12*t^9 - 60/19*t^7 + 9*t^4 - 90/19*t^2 + 225/361
sage: cyclo = R.cyclotomic_polynomial(7); cyclo
t^6 + t^5 + t^4 + t^3 + t^2 + t + 1
sage: g = 7 * cyclo * t^5 * (t^5 + 10*t + 2)
sage: g
7*t^16 + 7*t^15 + 7*t^14 + 7*t^13 + 77*t^12 + 91*t^11 + 91*t^10 + 84*t^9
+ 84*t^8 + 84*t^7 + 84*t^6 + 14*t^5
sage: F = factor(g); F
(7) * t^5 * (t^5 + 10*t + 2) * (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1)
sage: F.unit()
7
sage: list(F)
[(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之外,你还应该尝试找出Sage的哪个部分被用来计算分圆多项式,并引用它。在这种情况下,如果您键入 R.cyclotomic_polynomial??
要查看源代码,您将很快看到一行 f = pari.polcyclo(n)
这意味着PARI被用来计算分圆多项式。在你的工作中也引用帕里。
将两个多项式分开构成分数域的一个元素(Sage自动创建)。
sage: x = QQ['x'].0
sage: f = x^3 + 1; g = x^2 - 17
sage: h = f/g; h
(x^3 + 1)/(x^2 - 17)
sage: h.parent()
Fraction Field of Univariate Polynomial Ring in x over Rational Field
利用Laurent级数,可以计算 QQ[x]
:
sage: R.<x> = LaurentSeriesRing(QQ); R
Laurent Series Ring in x over Rational Field
sage: 1/(1-x) + O(x^10)
1 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8 + x^9 + O(x^10)
如果我们给变量取不同的名字,我们得到一个不同的单变量多项式环。
sage: R.<x> = PolynomialRing(QQ)
sage: S.<y> = PolynomialRing(QQ)
sage: x == y
False
sage: R == S
False
sage: R(y)
x
sage: R(y^2 - 17)
x^2 - 17
环由变量决定。注意,使另一个带有变量的环调用 x
不会返回其他环。
sage: R = PolynomialRing(QQ, "x")
sage: T = PolynomialRing(QQ, "x")
sage: R == T
True
sage: R is T
True
sage: R.0 == T.0
True
Sage还支持幂级数和Laurent级数环超过任何基环。在下面的示例中,我们创建 \(\GF{{7}}[[T]]\) 然后除以创建一个元素 \(\GF{{7}}((T))\) .
sage: R.<T> = PowerSeriesRing(GF(7)); R
Power Series Ring in T over Finite Field of size 7
sage: f = T + 3*T^2 + T^3 + O(T^4)
sage: f^3
T^3 + 2*T^4 + 2*T^5 + O(T^6)
sage: 1/f
T^-1 + 4 + T + O(T^2)
sage: parent(1/f)
Laurent Series Ring in T over Finite Field of size 7
也可以使用双括号速记创建幂级数环:
sage: GF(7)[['T']]
Power Series Ring in T over Finite Field of size 7
多元多项式¶
为了处理多变量的多项式,我们首先声明多项式环和变量。
sage: R = PolynomialRing(GF(5),3,"z") # here, 3 = number of variables
sage: R
Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5
正如定义一元多项式环一样,还有其他方法:
sage: GF(5)['z0, z1, z2']
Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5
sage: R.<z0,z1,z2> = GF(5)[]; R
Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5
此外,如果希望变量名为单字母,则可以使用以下速记:
sage: PolynomialRing(GF(5), 3, 'xyz')
Multivariate Polynomial Ring in x, y, z over Finite Field of size 5
接下来让我们做一些算术。
sage: z = GF(5)['z0, z1, z2'].gens()
sage: z
(z0, z1, z2)
sage: (z[0]+z[1]+z[2])^2
z0^2 + 2*z0*z1 + z1^2 + 2*z0*z2 + 2*z1*z2 + z2^2
你也可以用更多的数学符号来构造多项式环。
sage: R = GF(5)['x,y,z']
sage: x,y,z = R.gens()
sage: QQ['x']
Univariate Polynomial Ring in x over Rational Field
sage: QQ['x,y'].gens()
(x, y)
sage: QQ['x'].objgens()
(Univariate Polynomial Ring in x over Rational Field, (x,))
多元多项式在Sage中使用Python字典和多项式的“分布表示”实现。Sage使用了一些单数 [Si], e、 用于计算gcd和Gröbner理想基。
sage: R, (x, y) = PolynomialRing(RationalField(), 2, 'xy').objgens()
sage: f = (x^3 + 2*y^2*x)^2
sage: g = x^2*y^2
sage: f.gcd(g)
x^2
接下来我们创造理想 \((f,g)\) 生成的 \(f\) 和 \(g\) ,只需乘以 (f,g)
通过 R
(我们也可以写 ideal([f,g])
或 ideal(f,g)
)
sage: I = (f, g)*R; I
Ideal (x^6 + 4*x^4*y^2 + 4*x^2*y^4, x^2*y^2) of Multivariate Polynomial
Ring in x, y over Rational Field
sage: B = I.groebner_basis(); B
[x^6, x^2*y^2]
sage: x^2 in I
False
顺便说一句,上面的Gröbner基不是一个列表,而是一个不可变的序列。这意味着它有一个宇宙,父类,并且不能被改变(这是很好的,因为改变基会破坏其他使用Gröbner基的例程)。
sage: B.universe()
Multivariate Polynomial Ring in x, y over Rational Field
sage: B[1] = x
Traceback (most recent call last):
...
ValueError: object is immutable; please change a copy instead.
一些交换代数(读:没有我们想要的那么多)在Sage中是可用的,通过单数实现的。例如,我们可以计算 \(I\) :
sage: I.primary_decomposition()
[Ideal (x^2) of Multivariate Polynomial Ring in x, y over Rational Field,
Ideal (y^2, x^6) of Multivariate Polynomial Ring in x, y over Rational Field]
sage: I.associated_primes()
[Ideal (x) of Multivariate Polynomial Ring in x, y over Rational Field,
Ideal (y, x) of Multivariate Polynomial Ring in x, y over Rational Field]