多項式の長除算


10

2つの多項式を除算し、商と剰余を取得するアルゴリズムである多項式長除算を実装します。

(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]になります。

作成する長除算関数は、商と剰余の2つの値を返します。数値の不正確さと算術エラーを処理する必要はありません。数学ライブラリを使用してジョブを実行しないでください。ただし、関数でシンボリック値を処理できるようにすることができます。最短のコードが勝ちます。

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


回答:


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の長さ:

#a
4

bにゼロを追加してaとbを同じ順序にします。

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

a、bの上位の累乗(最初の要素)を除算します。

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

それにbを掛けてaからそれを引く:

a - 12*b
12 0 _60

n回繰り返すb = f(a、b):

a f^:n b

2つのこと。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

Haskell、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

ラムダを使用した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)}

最初の引数をリマインダーに、2番目の引数を結果に置き換えます。

Firefoxでの使用例:

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

バグでごめんなさい。すでに修正済み。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.