【问题标题】:Remainder sequences剩余序列
【发布时间】:2016-03-27 12:09:26
【问题描述】:

我想计算 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')

【问题讨论】:

    标签: math sympy polynomial-math polynomials


    【解决方案1】:

    以上两个序列仅相差常数因子

    对于一个变量的多项式,它们确实如此。对于多元多项式,它们不会。

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

    子结果的计算(因为它在 sympy 中实现)将 x,y 中的多项式视为 x 中的单变量多项式,其系数恰好来自 y 中的多项式环。肯定会产生一个子结果序列,其相对于 x 的度数一直减小直到达到 0:序列的最后一个多项式将没有 x。关于 y 的度数可能(并且确实)上升,因为该算法没有问题将这些项乘以 y 中的任何多项式以使 x 退出。

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

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 2014-11-10
      • 2019-06-09
      • 2011-04-03
      • 1970-01-01
      • 2014-09-17
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多