Đặc biệt đa thức


13

Các đa thức đặc trưng của một ma trận vuông A được định nghĩa là đa thức p Một (x) = det ( Tôi x- Một ), nơi tôima trận sắcDet các yếu tố quyết định . Lưu ý rằng định nghĩa này luôn cung cấp cho chúng ta một đa thức monic sao cho giải pháp là duy nhất.

Nhiệm vụ của bạn cho thử thách này là tính toán các hệ số của đa thức đặc trưng cho một ma trận có giá trị nguyên, vì điều này bạn có thể sử dụng các hàm dựng sẵn nhưng nó không được khuyến khích.

Quy tắc

  • đầu vào là ma trận số nguyên NxN (N ≥ 1) ở bất kỳ định dạng thuận tiện nào
  • chương trình / chức năng của bạn sẽ xuất / trả về các hệ số theo thứ tự tăng hoặc giảm (vui lòng ghi rõ)
  • các hệ số được định mức sao cho hệ số của x N là 1 (xem các trường hợp thử nghiệm)
  • bạn không cần phải xử lý đầu vào không hợp lệ

Tủ thử

Các hệ số được đưa ra theo thứ tự giảm dần (ví dụ: 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
Tôi có thể xuất đa thức không?
alephalpha

1
@alephalpha: Chắc chắn rồi.
ბიმო

Tôi có thể xuất ra [ 1.00000000e+00 -1.51000000e+02 1.12000000e+03], ví dụ?
Ông Xcoder

Câu trả lời:



9

Octave , 16 4 byte

@BruteForce chỉ nói với tôi rằng một trong những chức năng tôi đang sử dụng trong giải pháp trước đây của tôi thực sự có thể thực hiện toàn bộ công việc:

poly

Hãy thử trực tuyến!

16 byte: Giải pháp này tính toán các giá trị riêng của ma trận đầu vào, và sau đó tiến hành xây dựng một đa thức từ các gốc đã cho.

@(x)poly(eig(x))

Nhưng tất nhiên cũng có sự nhàm chán.

charpoly

(cần một symbolicma trận loại trong Octave, nhưng hoạt động với các ma trận thông thường trong MATLAB.)

Hãy thử trực tuyến!



6

R , 53 byte

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

Hãy thử trực tuyến!

Trả về các hệ số theo thứ tự tăng dần; ví dụ a_0, a_1, a_2, ..., a_n.

Tính toán đa thức bằng cách tìm giá trị riêng của ma trận.

R + pracma , 16 byte

pracma::charpoly

pracma là thư viện "PRACtical MAth" cho R và có khá nhiều chức năng tiện dụng.



4

Haskell , 243 223 222 byte

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

Hãy thử trực tuyến!

Cảm ơn @ rjanJohansen đã giúp tôi chơi gôn này!

Giải trình

Điều này sử dụng thuật toán FVerdeevTHER LeVerrier để tính toán các hệ số. Đây là một phiên bản không có tên với nhiều tên dài dòng hơn:

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

Lưu ý: Tôi lấy cái này từ giải pháp này


1
Thêm một byte ở đây : c=z pure[1..]a.
Ørjan Johansen

Chết tiệt, thật thông minh!
ბიმო

Cảm ơn! Tôi chỉ tìm thấy 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, một cái gì đó tương tự cũng nên làm việc trên một cái khác.
Ørjan Johansen



1

CJam (48 byte)

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

Bộ kiểm tra trực tuyến

Mổ xẻ

Điều này khá giống với câu trả lời của tôi đối với Xác định ma trận nguyên . Nó có một số điều chỉnh vì các dấu hiệu khác nhau và vì chúng tôi muốn giữ tất cả các hệ số thay vì chỉ các yếu tố cuối cùng.

{[              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)
]}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.