विशेषता बहुपद


13

विशेषता बहुपद एक वर्ग मैट्रिक्स की एक बहुपद के रूप में परिभाषित किया गया है पी (x) = det ( मैं x- एक ) जहां मैं है पहचान मैट्रिक्स और det निर्धारक । ध्यान दें कि यह परिभाषा हमेशा हमें एक राक्षसी बहुपद प्रदान करती है जैसे कि समाधान अद्वितीय है।

इस चुनौती के लिए आपका कार्य पूर्णांक मूल्यवान मैट्रिक्स के लिए विशेषता बहुपद के गुणांक की गणना करना है, इसके लिए आप बिल्ट-इन का उपयोग कर सकते हैं लेकिन यह हतोत्साहित किया जाता है।

नियम

  • इनपुट किसी भी सुविधाजनक प्रारूप में एनएक्सएन (एन any 1) पूर्णांक मैट्रिक्स है
  • आपका प्रोग्राम / फंक्शन या तो बढ़ते या घटते क्रम में गुणांक लौटाएगा (कृपया निर्दिष्ट करें)
  • गुणांक को मानदंड ऐसे हैं कि x N का गुणांक 1 है (परीक्षण मामलों को देखें)
  • आपको अमान्य इनपुट को संभालने की आवश्यकता नहीं है

परीक्षण के मामलों

गुणांक घटते क्रम में दिए गए हैं (जैसे। x N , x N-1 , ..., x 2 , x, 1):

[0] -> [1 0]
[1] -> [1 -1]
[1 1; 0 1] -> [1 -2 1]
[80 80; 57 71] -> [1 -151 1120] 
[1 2 0; 2 -3 5; 0 1 1] -> [1 1 -14 12]
[4 2 1 3; 4 -3 9 0; -1 1 0 3; 20 -4 5 20] -> [1 -21 -83 559 -1987]
[0 5 0 12 -3 -6; 6 3 7 16 4 2; 4 0 5 1 13 -2; 12 10 12 -2 1 -6; 16 13 12 -4 7 10; 6 17 0 3 3 -1] -> [1 -12 -484 3249 -7065 -836601 -44200]
[1 0 0 1 0 0 0; 1 1 0 0 1 0 1; 1 1 0 1 1 0 0; 1 1 0 1 1 0 0; 1 1 0 1 1 1 1; 1 1 1 0 1 1 1; 0 1 0 0 0 0 1] -> [1 -6 10 -6 3 -2 0 0]



1
क्या मैं एक बहुपद का उत्पादन कर सकता हूं?
आेलफाल्फा

1
@alephalpha: ज़रूर।

[ 1.00000000e+00 -1.51000000e+02 1.12000000e+03]उदाहरण के लिए, क्या मैं इसका उत्पादन कर सकता हूं ?
श्री एक्सकोडर

जवाबों:



9

ऑक्टेव , 16 4 बाइट्स

@BruteForce ने मुझे बताया कि मैं अपने पिछले समाधान में जिन कार्यों का उपयोग कर रहा था उनमें से एक वास्तव में पूरे काम कर सकता है:

poly

इसे ऑनलाइन आज़माएं!

16 बाइट्स: यह समाधान इनपुट मैट्रिक्स के आइगेनवेल्यूज की गणना करता है, और फिर दी गई जड़ों से एक बहुपद का निर्माण करता है।

@(x)poly(eig(x))

लेकिन निश्चित रूप से उबाऊ भी है

charpoly

( symbolicऑक्टेव में एक प्रकार की मैट्रिक्स की जरूरत है , लेकिन MATLAB में सामान्य मेट्रिसेस के साथ काम करता है।)

इसे ऑनलाइन आज़माएं!



6

आर , 53 बाइट्स

function(m){for(i in eigen(m)$va)T=c(0,T)-c(T,0)*i
T}

इसे ऑनलाइन आज़माएं!

बढ़ते क्रम में गुणांक लौटाता है; यानी, a_0, a_1, a_2, ..., a_n

मैट्रिक्स के eigenvalues ​​को खोजने के द्वारा बहुपद की गणना करता है।

आर + प्रकर्मा , 16 बाइट्स

pracma::charpoly

pracma आर के लिए "PRACtical MAth" लाइब्रेरी है, और इसमें कुछ काम हैं।


5

गणितज्ञ, 22 बाइट्स

Det[MatrixExp[0#]x-#]&


मिशा लावरोव से एलेफाल्फा -3 बाइट्स से -7 बाइट्स

इसे ऑनलाइन आज़माएं!

और निश्चित रूप से...

गणितज्ञ, 29 बाइट्स

#~CharacteristicPolynomial~x&

इसे ऑनलाइन आज़माएं!

दोनों जवाब एक बहुपद उत्पादन


4

हास्केल , 243 223 222 बाइट्स

s=sum
(&)=zip
z=zipWith
a#b=[[s$z(*)x y|y<-foldr(z(:))([]<$b)b]|x<-a]
f a|let c=z pure[1..]a;g(u,d)k|m<-[z(+)a b|(a,b)<-a#u&[[s[d|x==y]|y<-c]|x<-c]]=(m,-s[s[b|(n,b)<-c&a,n==m]|(a,m)<-a#m&c]`div`k)=snd<$>scanl g(0<$c<$c,1)c

इसे ऑनलाइन आज़माएं!

मुझे यह गोल्फ मदद करने के लिए @ JrjanJohansen को धन्यवाद!

व्याख्या

यह गुणांक की गणना करने के लिए Faddeev-LeVerrier एल्गोरिथ्म का उपयोग करता है। यहाँ अधिक क्रिया नाम के साथ एक अनगुल्ड संस्करण है:

-- Transpose a matrix/list
transpose b = foldr (zipWith(:)) (replicate (length b) []) b

-- Matrix-matrix multiplication
(#) :: [[Int]] -> [[Int]] -> [[Int]]
a # b = [[sum $ zipWith (*) x y | y <- transpose b]|x<-a]


-- Faddeev-LeVerrier algorithm
faddeevLeVerrier :: [[Int]] -> [Int]
faddeevLeVerrier a = snd <$> scanl go (zero,1) [1..n]
  where n = length a
        zero = replicate n (replicate n 0)
        trace m = sum [sum [b|(n,b)<-zip [1..n] a,n==m]|(m,a)<-zip [1..n] m]
        diag d = [[sum[d|x==y]|y<-[1..n]]|x<-[1..n]]
        add as bs = [[x+y | (x,y) <- zip a b] | (b,a) <- zip as bs]
        go (u,d) k = (m, -trace (a#m) `div` k)
          where m = add (diag d) (a#u)

नोट: मैं इस समाधान से सीधे ले लिया


1
यहाँ एक और बाइट c=z pure[1..]a:।
अर्जन जोहान्स

अरे, यह चतुर है!

धन्यवाद! मैंने अभी पाया f a|let c=z pure[0..]a;g(u,d)k|m<-[z(+)a b|(a,b)<-a#u&[[s[d|x==y]|y<-c]|x<-c]]=(m,-s[a#m!!n!!n|n<-c]`div`(k+1))=snd<$>scanl g(0<$c<$c,1)c, कुछ इसी तरह दूसरे पर भी काम करना चाहिए।
अर्जन जोहान्स



1

CJam (48 बाइट्स)

{[1\:A_,{1$_,,.=1b\~/A@zf{\f.*1fb}1$Aff*..+}/;]}

ऑनलाइन टेस्ट सूट

विच्छेदन

यह पूर्णांक मैट्रिक्स के निर्धारक के मेरे उत्तर के समान है । इसके कुछ मोड़ हैं क्योंकि संकेत अलग हैं, और क्योंकि हम केवल पिछले एक के बजाय सभी गुणांक रखना चाहते हैं।

{[              e# Start a block which will return an array
  1\            e#   Push the leading coefficient under the input
  :A            e#   Store the input matrix in A
  _,            e#   Take the length of a copy
  {             e#     for i = 0 to n-1
                e#       Stack: ... AM_{i+1} i
    1$_,,.=1b   e#       Calculate tr(AM_{i+1})
    \~/         e#       Divide by -(i+1)
    A@          e#       Push a copy of A, bring AM_{i+1} to the top
    zf{\f.*1fb} e#       Matrix multiplication
    1$          e#       Get a copy of the coefficient
    Aff*        e#       Multiply by A
    ..+         e#       Matrix addition
  }/
  ;             e#   Pop AM_{n+1} (which incidentally is 0)
]}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.