다항식의 특징


13

특성 다항식 제곱 매트릭스의 A는 다항식으로 정의된다 피의 (X) = DET ( I X- ) 여기서 I는 은 IS 행렬DET 행렬식 . 이 정의는 해가 다항식 임을 나타내므로 해가 독특합니다.

이 과제의 과제는 정수 값 행렬에 대한 특성 다항식의 계수를 계산하는 것입니다.이를 위해 내장 함수를 사용할 수 있지만 권장하지 않습니다.

규칙

  • 입력은 편리한 형식의 NxN (N ≥ 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
다항식을 출력 할 수 있습니까?
alephalpha

1
@alephalpha : 물론입니다.
ბიმო

[ 1.00000000e+00 -1.51000000e+02 1.12000000e+03]예를 들어 로 출력 할 수 있습니까?
Mr. Xcoder

답변:



9

옥타브 , 16 4 바이트

@BruteForce는 방금 이전 솔루션에서 사용했던 기능 중 하나가 실제로 전체 작업을 수행 할 수 있다고 말했습니다.

poly

온라인으로 사용해보십시오!

16 바이트 : 이 솔루션은 입력 행렬의 고유 값을 계산 한 다음 주어진 근에서 다항식을 작성합니다.

@(x)poly(eig(x))

물론 지루한 것도 있습니다

charpoly

( symbolic옥타브 에는 형식 행렬이 필요 하지만 MATLAB의 일반적인 행렬과 작동합니다.)

온라인으로 사용해보십시오!



6

R , 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.

행렬의 고유 값을 찾아 다항식을 계산합니다.

R + pracma , 16 바이트

pracma::charpoly

pracma R의 "PRACtical MAth"라이브러리이며, 몇 가지 편리한 기능이 있습니다.



4

하스켈 , 243223222 바이트

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

온라인으로 사용해보십시오!

골프를 도와 주신 @ ØrjanJohansen에게 감사드립니다!

설명

이것은 사용 Faddeev-LeVerrier 알고리즘 계수를 계산. 자세한 이름을 가진 ungolfed 버전은 다음과 같습니다.

-- 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.
Ørjan Johansen '12

젠장, 영리 해!
ბიმო

감사! 방금 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다른 것과 비슷한 것이 작동한다는 것을 알았 습니다.
Ørjan Johansen '12



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)
]}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.