剩余序列

时间:2016-03-27 12:09:26

标签: math sympy polynomial-math polynomials

我想计算GCD使用的两个多项式的余数序列。如果我理解维基百科关于Pseudo-remainder sequence的文章,计算它的一种方法是使用欧几里得算法:

gcd(a, b) := if b = 0 then a else gcd(b, rem(a, b))

意思是我将收集rem()个部分。然而,如果系数是整数,则中间分数非常快地增长,因此存在所谓的"伪余数序列"试图将系数保持在小整数中。

我的问题是,如果我理解正确(我做过吗?),上面两个序列的区别仅在于常数因素,但是当我尝试运行以下示例时,我会得到不同的结果,为什么?第一个余数序列因-2而异,好的,但为什么第二个序列如此不同?我认为subresultants()正常工作,但为什么g % (f % g)不起作用?

f = Poly(x**2*y + x**2 - 5*x*y + 2*x + 1, x, y)
g = Poly(2*x**2 - 12*x + 1, x)
print
print subresultants(f, g)[2]
print subresultants(f, g)[3]
print
print f % g
print g % (f % g)

导致

Poly(-2*x*y - 16*x + y - 1, x, y, domain='ZZ')
Poly(-9*y**2 - 54*y + 225, x, y, domain='ZZ')

Poly(x*y + 8*x - 1/2*y + 1/2, x, y, domain='QQ')
Poly(2*x**2 - 12*x + 1, x, y, domain='QQ')

1 个答案:

答案 0 :(得分:2)

  

上述两个序列仅由常数因子

不同

对于一个变量的多项式,它们可以。对于多元多项式,它们不适用。

多元多项式的除法是somewhat tricky business:结果取决于单项式的选择顺序(默认情况下,sympy使用词典顺序)。当你要求它将2*x**2 - 12*x + 1除以x*y + 8*x - 1/2*y + 1/2时,它会观察到分母的前导单项是x*y,并且分子中没有可被{{1}整除的单项式}。所以商为零,一切都是余数。

子顾问的计算(因为它在sympy中实现)将x,y中的多项式视为x中的单变量多项式,其系数碰巧来自y中的多项式环。肯定会产生一系列次级顾问,其关于x的程度一直在下降,直到达到0:序列的最后一个多项式不会有x。关于y的程度可能(并且确实)上升,因为算法没有问题将项乘以y中的任何多项式以使x退出。

结果是两个计算都正常工作,他们只做不同的事情。