พหุนามลักษณะ


13

พหุนามลักษณะเฉพาะของเมทริกซ์จัตุรัสถูกกำหนดให้เป็นพหุนามP (x) = det ( ฉัน x- ) ซึ่งผมเป็นเมทริกซ์เอกลักษณ์และdetปัจจัย โปรดทราบว่าคำจำกัดความนี้ให้พหุนาม monicกับเราเสมอว่าคำตอบนั้นมีเอกลักษณ์

งานของคุณสำหรับความท้าทายนี้คือการคำนวณค่าสัมประสิทธิ์ของพหุนามลักษณะสำหรับเมทริกซ์จำนวนเต็มสำหรับเรื่องนี้คุณอาจใช้บิวด์อิน แต่มันก็หมดกำลังใจ

กฎระเบียบ

  • input เป็นเมทริกซ์จำนวนเต็ม NxN (N ≥ 1) ในรูปแบบที่สะดวก
  • โปรแกรม / ฟังก์ชั่นของคุณจะแสดงผล / คืนค่าสัมประสิทธิ์ไม่ว่าจะเพิ่มหรือลดลง (โปรดระบุว่า)
  • สัมประสิทธิ์เป็นบรรทัดฐานที่สัมประสิทธิ์ของ x Nคือ 1 (ดูกรณีทดสอบ)
  • คุณไม่จำเป็นต้องจัดการอินพุตที่ไม่ถูกต้อง

Testcases

สัมประสิทธิ์จะได้รับตามลำดับที่ลดลง (เช่น. 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]

ที่เกี่ยวข้อง ที่เกี่ยวข้อง
2560


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เมทริกซ์ประเภทใน Octave แต่ใช้ได้กับเมทริกซ์ปกติใน 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 เป็นไลบรารี "PRACtical MAth" สำหรับ R และมีฟังก์ชั่นที่ใช้งานได้สะดวก



4

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

ลองออนไลน์!

ขอบคุณ @ ØrjanJohansenที่ช่วยฉันเล่นกอล์ฟนี้!

คำอธิบาย

วิธีนี้ใช้อัลกอริทึม Faddeev – LeVerrierเพื่อคำนวณค่าสัมประสิทธิ์ นี่คือรุ่นที่ไม่ได้แต่งแต้มด้วยชื่อ verbose เพิ่มเติม:

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

นี่มันช่างฉลาดจริงๆ!
2560

ขอบคุณ! ฉันเพิ่งพบ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



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.