बहुपद लंबी श्रेणी


10

बहुपद लंबे विभाजन को लागू करें, एक एल्गोरिथ्म जो दो बहुपद को विभाजित करता है और भागफल और शेष मिलता है:

(12x ^ 3 - 5x ^ 2 + 3x - 1) / (x ^ 2 - 5) = 12x - 5 Rx - 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

जे, 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

बी के लिए शून्य जोड़कर एक और बी एक ही क्रम बनाएं:

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

उच्च शक्तियों को विभाजित करें (प्रथम तत्व) a, b:

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

उसके द्वारा b को गुणा करें और उससे घटाएं:

a - 12*b
12 0 _60

एन एन बार बी = एफ (ए, बी):

a f^:n b

दो चीज़ें। 1) क्या आप असामान्य क्रम में लाभांश / भाजक लेकर अक्षर जीतते हैं? 2) क्या वह अनुगामी `? '' 'लाभांश में आवश्यक है? कुछ ऐसा लगता है जो आपको वास्तविक कार्यक्रम के अंदर से करना चाहिए।
जेबी

@ जेबी: 1) नहीं, वास्तव में यह "सामान्य" आदेश के लिए कम हो सकता है; यह उसी तरह है जैसे मैंने इसके बारे में सोचना शुरू किया। 2) यह सरणी का हिस्सा है, इसलिए मुझे लगता है कि यह इनपुट का हिस्सा होना चाहिए।
23

मैं समझ नहीं सकता कि इनपुट के साथ एक अतिरिक्त खाली सरणी का क्या करना है।
जेबी

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
वाह, पहली बार मैंने एक निष्पादन देखा / प्रतिस्थापित किया है जो वास्तव में पात्रों को बचाने के लिए उपयोग किया जाता है।
xnor

@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

लैम्बदास के साथ जावास्क्रिप्ट, 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)}

यह पहले तर्क को अनुस्मारक द्वारा और दूसरा परिणाम द्वारा प्रतिस्थापित करता है।

फ़ायरफ़ॉक्स में उपयोग का उदाहरण:

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

बग के लिए क्षमा करें। पहले से ही नियत है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.