다항식 긴 나눗셈


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]이됩니다.

작성할 long 나누기 함수는 몫과 나머지 두 값을 반환합니다. 수치 적 부정확성과 산술 오류를 처리 할 필요는 없습니다. 수학 라이브러리를 사용하여 작업을 수행하지 마십시오. 그러나 함수가 기호 값을 처리 할 수있게 만들 수 있습니다. 가장 짧은 코드가 승리합니다.

예: 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 : (100-5)를 제외하고 일부 스 니펫에 대한 설명

길이 :

#a
4

b에 0을 추가하여 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

두가지. 1) 특이한 순서로 배당 / 제수를 취함으로써 캐릭터를 이길 수 있습니까? 2) 배당에서 마지막 ';' ''이 필요한가? 실제 프로그램 내에서해야 할 일처럼 보입니다.
JB

@JB : 1) 아니요, 실제로는 "일반적인"주문보다 짧을 수 있습니다. 내가 생각하기 시작한 방식 일뿐입니다. 2) 배열의 일부이므로 입력의 일부 여야 한다고 가정 합니다.
Eelvex

추가 빈 배열이 입력과 어떤 관련이 있는지 파악할 수 없습니다.
JB

3

파이썬 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

하스켈, 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

람다가 포함 된 자바 스크립트, 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.