ส่วนพหุนามยาว


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


คำตอบ:


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

คำอธิบายบางตัวอย่างระบุว่า: (12 -5 3 -1) และ b: (1 0 -5)

ความยาวของ:

#a
4

ทำ a และ b คำสั่งเดียวกันโดยการต่อเลขศูนย์เป็น b:

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

แบ่งพลังที่สูงขึ้น (องค์ประกอบแรก) ของ a, b:

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

คูณ b ด้วยสิ่งนั้นและลบออกจาก:

a - 12*b
12 0 _60

ทำซ้ำ n คูณ b = f (a, b):

a f^:n b

สองสิ่ง. 1) คุณชนะตัวละครโดยรับเงินปันผล / ตัวหารตามลำดับที่ผิดปกติหรือไม่? 2) นั่นคือ trailing `; '' 'ในเงินปันผลที่จำเป็นหรือไม่? ดูเหมือนสิ่งที่คุณควรทำจากในโปรแกรมจริง
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

@ xnor ฉันได้ทำไปแล้วครั้งหนึ่ง แต่สำหรับการแทนที่มากกว่าหนึ่งครั้ง
Justin

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 กับ 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)}

มันแทนที่อาร์กิวเมนต์แรกด้วยการแจ้งเตือนและที่สองตามผล

ตัวอย่างการใช้งานใน 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.