Bộ phận đa thức dài


10

Thực hiện phép chia dài đa thức, một thuật toán chia hai đa thức và lấy thương số và phần dư:

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

Trong các chương trình của bạn, bạn sẽ biểu diễn các đa thức dưới dạng một mảng, với số hạng không đổi trên đuôi. ví dụ: x ^ 5 - 3x ^ 4 + 2x ^ 2 - x + 1 sẽ trở thành [1, -3, 0, 2, -1, 1].

Hàm phân chia dài mà bạn sẽ viết sẽ trả về hai giá trị: thương số và phần còn lại. Bạn không cần phải xử lý các lỗi số và lỗi số học. Không sử dụng thư viện toán học để thực hiện công việc của bạn, tuy nhiên, bạn có thể làm cho chức năng của mình có thể xử lý các giá trị tượng trưng. Mã ngắn nhất sẽ thắng.

THÍ DỤ: div([12, -5, 3, -1], [1, 0, -5]) == ([12, -5], [63, -26])


Câu trả lời:


3

J, 94

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

ví dụ.

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

Giải thích về một số đoạn, cho rằng a: (12 -5 3 -1) và b: (1 0 -5)

chiều dài của một:

#a
4

thực hiện cùng một thứ tự và b bằng cách nối các số 0 vào b:

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

chia quyền hạn cao hơn (các phần tử đầu tiên) của a, b:

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

nhân b với đó và trừ nó từ a:

a - 12*b
12 0 _60

lặp lại n lần b = f (a, b):

a f^:n b

Hai điều. 1) bạn có giành được các nhân vật bằng cách chia cổ tức / ước số theo thứ tự bất thường không? 2) đó có phải là dấu `; '' 'trong cổ tức cần thiết không? trông giống như một cái gì đó bạn nên làm từ bên trong chương trình thực tế.
JB

@JB: 1) Không, thực tế nó có thể ngắn hơn cho đơn hàng "thông thường"; đó chỉ là cách tôi bắt đầu nghĩ về nó. 2) Đó là một phần của mảng nên tôi cho rằng nó phải là một phần của đầu vào.
Eelvex

Tôi dường như không thể nắm bắt được một mảng trống bổ sung phải làm gì với đầu vào.
JB

3

Python 2, 260 258 256 255 byte

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 ')

Điều này thực thi:

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:]]

Sử dụng như vậy:

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

1
Ồ, lần đầu tiên tôi thấy một người thực hiện / thay thế thực sự được sử dụng để lưu các ký tự.
xnor

@xnor Tôi đã làm điều đó một lần khác, nhưng cho nhiều hơn một lần thay thế.
Justin

2

Haskell, 126

Cho một sự khởi đầu:

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

Sử dụng mẫu:

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

1

Javascript với lambdas, 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)}

Nó thay thế đối số đầu tiên bằng cách nhắc nhở và thứ hai theo kết quả.

Ví dụ về việc sử dụng trong Firefox:

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

Xin lỗi vì lỗi. Đã sửa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.