চারিত্রিক বহুবচন


13

চরিত্রগত বহুপদী একটি বর্গাকার ম্যাট্রিক্সের একটি বহুপদী হিসাবে সংজ্ঞায়িত করা হয় পি একটি (x) এর = Det ( আমি এক্স একজন ) যেখানে আমি নেই পরিচয় ম্যাট্রিক্স এবং Det নির্ধারক । নোট করুন যে এই সংজ্ঞাটি সর্বদা আমাদের একটি মনিক বহুবচন দেয় যাতে সমাধানটি অনন্য।

এই চ্যালেঞ্জটির জন্য আপনার কাজটি হ'ল একটি পূর্ণসংখ্যা মূল্যবান ম্যাট্রিক্সের জন্য বৈশিষ্ট্যযুক্ত বহুবর্ষের গুণাগুণগুলি গণনা করা, এর জন্য আপনি বিল্ট-ইনগুলি ব্যবহার করতে পারেন তবে এটি নিরুৎসাহিত করা হয়েছে।

বিধি

  • ইনপুটটি কোনও সুবিধাজনক বিন্যাসে একটি এনএক্সএন (N ≥ 1) পূর্ণসংখ্যা ম্যাট্রিক্স
  • আপনার প্রোগ্রাম / ফাংশনটি ক্রমবর্ধমান বা হ্রাস ক্রমে সহগের আউটপুট / ফিরিয়ে দেবে (দয়া করে কোনটি নির্দিষ্ট করুন)
  • গুণাগুণগুলি এমনভাবে আদর্শ হয় যে এক্স এন এর সহগ 1 হয় (পরীক্ষার কেস দেখুন)
  • আপনার অবৈধ ইনপুট হ্যান্ডেল করার দরকার নেই

Testcases

সহগ হ্রাস ক্রমে দেওয়া হয় (উদাঃ x এন , এক্স এন -1 , ..., এক্স 2 , এক্স, 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
@ আলেফালফ: অবশ্যই
ბიმო

[ 1.00000000e+00 -1.51000000e+02 1.12000000e+03]উদাহরণস্বরূপ আমি কি আউটপুট দিতে পারি ?
মিঃ এক্সকোডার

উত্তর:



9

অক্টাভা , 16 4 বাইট

@ ব্রুটফোরস আমাকে কেবল বলেছিল যে আমি আমার পূর্ববর্তী সমাধানে যে ফাংশনগুলি ব্যবহার করেছি তার মধ্যে একটি কার্যত পুরো কাজটি করতে পারে:

poly

এটি অনলাইন চেষ্টা করুন!

16 বাইটস: এই দ্রবণটি ইনপুট ম্যাট্রিক্সের ইগেনভ্যালুগুলি গণনা করে এবং তারপরে প্রদত্ত শিকড়গুলি থেকে বহুভুজ তৈরির দিকে এগিয়ে যায়।

@(x)poly(eig(x))

তবে অবশ্যই একঘেয়েও রয়েছে

charpoly

( symbolicঅষ্টাভে একটি টাইপ ম্যাট্রিক্স প্রয়োজন , তবে ম্যাটল্যাবে সাধারণ ম্যাট্রিকগুলির সাথে কাজ করে))

এটি অনলাইন চেষ্টা করুন!



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,।

ম্যাট্রিক্সের ইগেনভ্যালুগুলি সন্ধান করে বহুভিত্তিকে গণনা করে।

আর + প্র্যাকমা , 16 বাইট

pracma::charpoly

pracma আর এর জন্য "প্র্যাকটিকাল ম্যাথ" লাইব্রেরি এবং এটি বেশ কয়েকটি কার্যকরী ফাংশন রয়েছে।



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

এটি অনলাইন চেষ্টা করুন!

আমাকে এই গল্ফ সাহায্য করার জন্য @ janrjanJohansen ধন্যবাদ!

ব্যাখ্যা

এটি সহগের গুণাগুণ গণনা করতে 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
janrjan জোহানসেন

অভিশাপ, এতো চালাক!
ბიმო

ধন্যবাদ! আমি সন্ধান পেয়েছি 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, অনুরূপ কিছু অন্যটির সাথেও কাজ করা উচিত।
janrjan জোহানসেন



1

সিজেএম (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)
]}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.