余数序列
Remainder sequences
我想计算 GCD 使用的两个多项式的余数序列。如果我理解关于 Pseudo-remainder sequence 的维基百科文章,计算它的一种方法是使用 Euclid 算法:
gcd(a, b) := if b = 0 then a else gcd(b, rem(a, b))
意思是我会收集 rem()
零件。但是,如果系数是整数,则中间分数增长得非常快,因此有所谓的 "Pseudo-remainder sequences" 试图将系数保持在小整数中。
我的问题是,如果我理解正确(是吗?),上面的两个序列只是常数因子不同,但是当我尝试 运行 以下示例时,我得到不同的结果,为什么?第一个余数序列相差 -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')
the two above sequences differ only by constant factor
对于一个变量的多项式,它们是。对于多元多项式,他们没有。
多元多项式的除法是:结果取决于选择的单项式顺序(默认情况下,sympy 使用字典顺序)。当你让它用 2*x**2 - 12*x + 1
除以 x*y + 8*x - 1/2*y + 1/2
时,它观察到分母的前导单项式是 x*y
,而分子中没有可被 [=12= 整除的单项式].所以商为零,一切都是余数。
子结果的计算(因为它在 sympy 中实现)将 x,y 中的多项式视为 x 中的单变量多项式,其系数恰好来自 y 中的多项式环。肯定会产生一个子结果序列,其关于 x 的次数一直递减直到达到 0:该序列的最后一个多项式将不包含 x。关于 y 的度数可能(并且确实)上升,因为该算法可以毫无问题地将这些项乘以 y 中的任何多项式以使 x 退出。
结果是两种计算都正常工作,它们只是做了不同的事情。
我想计算 GCD 使用的两个多项式的余数序列。如果我理解关于 Pseudo-remainder sequence 的维基百科文章,计算它的一种方法是使用 Euclid 算法:
gcd(a, b) := if b = 0 then a else gcd(b, rem(a, b))
意思是我会收集 rem()
零件。但是,如果系数是整数,则中间分数增长得非常快,因此有所谓的 "Pseudo-remainder sequences" 试图将系数保持在小整数中。
我的问题是,如果我理解正确(是吗?),上面的两个序列只是常数因子不同,但是当我尝试 运行 以下示例时,我得到不同的结果,为什么?第一个余数序列相差 -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')
the two above sequences differ only by constant factor
对于一个变量的多项式,它们是。对于多元多项式,他们没有。
多元多项式的除法是2*x**2 - 12*x + 1
除以 x*y + 8*x - 1/2*y + 1/2
时,它观察到分母的前导单项式是 x*y
,而分子中没有可被 [=12= 整除的单项式].所以商为零,一切都是余数。
子结果的计算(因为它在 sympy 中实现)将 x,y 中的多项式视为 x 中的单变量多项式,其系数恰好来自 y 中的多项式环。肯定会产生一个子结果序列,其关于 x 的次数一直递减直到达到 0:该序列的最后一个多项式将不包含 x。关于 y 的度数可能(并且确实)上升,因为该算法可以毫无问题地将这些项乘以 y 中的任何多项式以使 x 退出。
结果是两种计算都正常工作,它们只是做了不同的事情。