多项式长除法


10

实现多项式长除法,该算法将两个多项式相除并获得商和余数:

(12x ^ 3-5x ^ 2 + 3x-1)/(x ^ 2-5)= 12x-5 R 63x-26

在程序中,您将多项式表示为数组,常数项位于尾部。例如,x ^ 5-3x ^ 4 + 2x ^ 2-x +1将变为[1,-3,0,2,-1,1]。

您将要编写的长除法函数将返回两个值:商和余数。您不需要处理数值不精确和算术错误。不要使用数学库来完成工作,但是,您可以使函数能够处理符号值。最短的代码获胜。

例: div([12, -5, 3, -1], [1, 0, -5]) == ([12, -5], [63, -26])


Answers:


3

J,94

f=:>@(0&{)
d=:0{[%~0{[:f]
D=:4 :'x((1}.([:f])-((#@]{.[)f)*d);([:>1{]),d)^:(>:((#f y)-(#x)))y'

例如。

(1 0 _5) D (12 _5 3 _1;'')
63 _26 | 12  _5

给定a:(12 -5 3 -1)和b:(1 0 -5)的一些摘要的说明

长度:

#a
4

通过将零附加到b来使a和b的顺序相同:

(#a) {. b
1 0 -5 0

除以a,b的较高次幂(第一个元素):

(0{a) % (0{b)
12

用b乘以b并从a中减去:

a - 12*b
12 0 _60

重复n次b = f(a,b):

a f^:n b

两件事情。1)您是否通过按非正常顺序获得红利/除数来赢得角色?2)股息中尾随的“;”是否必要?看起来您应该在实际程序中执行某些操作。
JB

@JB:1)不,实际上,“通常”订单的时间可能更短;这就是我开始考虑的方式。2)它是数组的一部分,所以我它应该是输入的一部分。
Eelvex

我似乎无法理解输入还有一个额外的空数组。
JB

3

Python 2中,260个 258 257 255字节

exec'''def d(p,q):
 R=range;D=len(p);F=len(q)-1;d=q[0];q=[q[i]/-d@R(1,F+1)];r=[0@R(D)];a=[[0@R(F)]@R(D)]
@R(D):
  p[i]/=d;r[i]=sum(a[i])+p[i]
  for j in R(F):
   if i<D-F:a[i+j+1][F-j-1]=r[i]*q[j]
 return r[:D-F],[d*i@r[D-F:]]'''.replace('@',' for i in ')

执行:

def d(p,q):
 R=range;D=len(p);F=len(q)-1;d=q[0];q=[q[i]/-d for i in R(1,F+1)];r=[0 for i in R(D)];a=[[0 for i in R(F)] for i in R(D)]
 for i in R(D):
  p[i]/=d;r[i]=sum(a[i])+p[i]
  for j in R(F):
   if i<D-F:a[i+j+1][F-j-1]=r[i]*q[j]
 return r[:D-F],[d*i for i in r[D-F:]]

像这样使用:

>>>d([12., -5., 3., -1.],[1.,0.,-5.])
([12.0, -5.0], [63.0, -26.0])

1
哇,我第一次看到exec / replace实际上是用来保存字符的。
xnor 2014年

@xnor我已经做了另一遍,但是不止一次替换。
贾斯汀

2

哈斯克尔(126)

作为一个开始:

l s _ 0=s
l(x:s)(y:t)n=x/y:l(zipWith(-)s$map(*(x/y))t++repeat 0)(y:t)(n-1)
d s t=splitAt n$l s t n where n=length s-length t+1

样品使用:

*Main> d [12, -5, 3, -1] [1, 0, -5]
([12.0,-5.0],[63.0,-26.0])

1

带lambdas的JavaScript,108

f=(a,b)=>{for(n=b.length;a.length>=n;a.shift())for(b.push(k=a[q=0]/b[0]);q<n;++q)a[q]-=k*b[q];b.splice(0,n)}

它用提示替换第一个参数,然后用结果替换第二个参数。

在Firefox中的用法示例:

f(x=[12,-5,3,-1], y=[1,0,-5]), console.log(x, y)
// Array [ 63, -26 ] Array [ 12, -5 ]

抱歉,该错误。已经修复。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.