圣人中的多元多项式除法
Multivariate polynomial division in sage
我尝试使用 sage 对两个变量中的多项式进行简单除法。
不幸的是,我得到了意想不到的结果,如下面的代码所示。
我尝试了几种不同的方法来实例化环及其变量,但是
结果保持不变。使用 % 运算符获取除法的其余部分会产生相同的结果。有什么想法吗?
R, (x, y) = PolynomialRing(RationalField(), 2, 'xy').objgens()
t = x^2*y^2 + x^2*y - y + 1
f1 = x*y^2 + x
f2 = x*y - y^3
(q, r) = t.quo_rem(f1)
print "quotient:", q, "reminder:", r
assert q == x and r == x^2*y-x^2-y+1
(q, r) = r.quo_rem(f2) # error, expected q = x, r = -x^2+x*y^3-y+1
print "quotient:", q, "reminder:", r
assert q == x and r == -x^2+x*y^3-y+1
输出:
quotient: x reminder: x^2*y - x^2 - y + 1
quotient: 0 reminder: x^2*y - x^2 - y + 1
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-8-861e8a9d1112> in <module>()
10 (q, r) = r.quo_rem(f2) # error, expected q = x, r = -x^2+x*y^3-y+1
11 print "quotient:", q, "reminder:", r
---> 12 assert q == x and r == -x**Integer(2)+x*y**Integer(3)-y+Integer(1)
AssertionError:
多元多项式的除法:项序
多元多项式的除法结果取决于选择的单项式阶数,explained in Wikipedia也是如此。目前,当且仅当 P 包含一个单项式,该单项式可以被 Q 的前导单项式整除时,就足以说明 P 除以 Q 的商是非零的关于所选顺序.
默认情况下,Sage中的多项式环使用度逆字典顺序(简称degrevlex),其中单项式首先按总度数排序,然后在每个度数内按字典顺序排序。您可以使用 R.term_order()
进行检查。这里是 the list of term orders.
在 degrevlex 顺序中,y^3 在 x*y 之前,因为它具有更高的总度数。由于 x^2*y-x^2-y+1 没有可被 y^3 整除的单项式,因此商数为零。
越野车quo_rem
您的预期结果与单项式的字典顺序 (lex) 一致。因此,似乎解决方法是在构造 R:
时指定字典术语顺序
R.<x,y> = PolynomialRing(QQ, 2, 'xy', order='lex')
不幸的是,quo_rem
忽略了 R 的词序,仍然使用 degrevlex。这似乎是一个错误,无论是在 Sage 与 Singular 通信的方式中,还是在 Singular 本身中 (the Quotient command is deprecated)。
解决方法
同时,有一个解决方法:使用 reduce
命令而不是 quo_rem
,因为它尊重 R 的术语顺序。例如:
R.<x,y> = PolynomialRing(QQ, 2, 'xy', order='lex')
a = x^2*y-x^2-y+1
f2 = x*y-y^3
r = a.reduce(Ideal([f2]))
q = (a-r)/f2
这 returns r = -x^2 + x*y^3 - y + 1 和 q = x.
我尝试使用 sage 对两个变量中的多项式进行简单除法。 不幸的是,我得到了意想不到的结果,如下面的代码所示。 我尝试了几种不同的方法来实例化环及其变量,但是 结果保持不变。使用 % 运算符获取除法的其余部分会产生相同的结果。有什么想法吗?
R, (x, y) = PolynomialRing(RationalField(), 2, 'xy').objgens()
t = x^2*y^2 + x^2*y - y + 1
f1 = x*y^2 + x
f2 = x*y - y^3
(q, r) = t.quo_rem(f1)
print "quotient:", q, "reminder:", r
assert q == x and r == x^2*y-x^2-y+1
(q, r) = r.quo_rem(f2) # error, expected q = x, r = -x^2+x*y^3-y+1
print "quotient:", q, "reminder:", r
assert q == x and r == -x^2+x*y^3-y+1
输出:
quotient: x reminder: x^2*y - x^2 - y + 1
quotient: 0 reminder: x^2*y - x^2 - y + 1
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-8-861e8a9d1112> in <module>()
10 (q, r) = r.quo_rem(f2) # error, expected q = x, r = -x^2+x*y^3-y+1
11 print "quotient:", q, "reminder:", r
---> 12 assert q == x and r == -x**Integer(2)+x*y**Integer(3)-y+Integer(1)
AssertionError:
多元多项式的除法:项序
多元多项式的除法结果取决于选择的单项式阶数,explained in Wikipedia也是如此。目前,当且仅当 P 包含一个单项式,该单项式可以被 Q 的前导单项式整除时,就足以说明 P 除以 Q 的商是非零的关于所选顺序.
默认情况下,Sage中的多项式环使用度逆字典顺序(简称degrevlex),其中单项式首先按总度数排序,然后在每个度数内按字典顺序排序。您可以使用 R.term_order()
进行检查。这里是 the list of term orders.
在 degrevlex 顺序中,y^3 在 x*y 之前,因为它具有更高的总度数。由于 x^2*y-x^2-y+1 没有可被 y^3 整除的单项式,因此商数为零。
越野车quo_rem
您的预期结果与单项式的字典顺序 (lex) 一致。因此,似乎解决方法是在构造 R:
时指定字典术语顺序R.<x,y> = PolynomialRing(QQ, 2, 'xy', order='lex')
不幸的是,quo_rem
忽略了 R 的词序,仍然使用 degrevlex。这似乎是一个错误,无论是在 Sage 与 Singular 通信的方式中,还是在 Singular 本身中 (the Quotient command is deprecated)。
解决方法
同时,有一个解决方法:使用 reduce
命令而不是 quo_rem
,因为它尊重 R 的术语顺序。例如:
R.<x,y> = PolynomialRing(QQ, 2, 'xy', order='lex')
a = x^2*y-x^2-y+1
f2 = x*y-y^3
r = a.reduce(Ideal([f2]))
q = (a-r)/f2
这 returns r = -x^2 + x*y^3 - y + 1 和 q = x.