#include <stdio.h>
#define SIZE 4
// 行列のトレース(対角成分の和)を計算
double calculate_trace(double mat[SIZE][SIZE]) {
double trace = 0.0;
for (int i = 0; i < SIZE; i++) {
trace += mat[i][i];
}
return trace;
}
// 行列の積 C = A * B
void matrix_multiply(double A[SIZE][SIZE], double B[SIZE][SIZE], double C[SIZE][SIZE]) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
C[i][j] = 0.0;
for (int k = 0; k < SIZE; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
int main() {
// あなたの1つ目の行列 A
double A[SIZE][SIZE] = {
{1.0, 2.0, 3.0, 5.0},
{3.0, -5.0, 1.0, 4.0},
{5.0, 9.0, 2.0, -6.0},
{1.0, 7.0, 4.0, 1.0}
};
double M[SIZE][SIZE]; // ワーキング行列 AM
double B[SIZE][SIZE]; // 各ステップの行列 B
double c[SIZE + 1]; // 多項式の係数 (c0, c1, c2, c3, c4)
// 初期化
c[0] = 1.0; // λ^4 の係数は必ず 1.0
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
B[i][j] = (i == j) ? 1.0 : 0.0; // 単位行列
}
}
// Faddeev-LeVerrier アルゴリズムの実行
for (int m = 1; m <= SIZE; m++) {
matrix_multiply(A, B, M); // M = A * B_{m-1}
double trace = calculate_trace(M);
c[m] = -trace / m; // 係数の決定
// 次のステップのための B_m を計算: B_m = M + c_m * I
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
B[i][j] = M[i][j] + ((i == j) ? c[m] : 0.0);
}
}
}
// === 行列式(特性方程式)の出力 ===
printf("=== 行列式の展開結果 (特性方程式) ===\n"); printf("det(A - λI) = 0\n\n"); printf("f(λ) = λ^4 + (%.1f)λ^3 + (%.1f)λ^2 + (%.1f)λ + (%.1f) = 0\n", c[1], c[2], c[3], c[4]);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFNJWkUgNAoKLy8g6KGM5YiX44Gu44OI44Os44O844K577yI5a++6KeS5oiQ5YiG44Gu5ZKM77yJ44KS6KiI566XCmRvdWJsZSBjYWxjdWxhdGVfdHJhY2UoZG91YmxlIG1hdFtTSVpFXVtTSVpFXSkgewogICAgZG91YmxlIHRyYWNlID0gMC4wOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKICAgICAgICB0cmFjZSArPSBtYXRbaV1baV07CiAgICB9CiAgICByZXR1cm4gdHJhY2U7Cn0KCi8vIOihjOWIl+OBruepjSBDID0gQSAqIEIKdm9pZCBtYXRyaXhfbXVsdGlwbHkoZG91YmxlIEFbU0laRV1bU0laRV0sIGRvdWJsZSBCW1NJWkVdW1NJWkVdLCBkb3VibGUgQ1tTSVpFXVtTSVpFXSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFNJWkU7IGorKykgewogICAgICAgICAgICBDW2ldW2pdID0gMC4wOwogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IFNJWkU7IGsrKykgewogICAgICAgICAgICAgICAgQ1tpXVtqXSArPSBBW2ldW2tdICogQltrXVtqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICAvLyDjgYLjgarjgZ/jga4x44Gk55uu44Gu6KGM5YiXIEEKICAgIGRvdWJsZSBBW1NJWkVdW1NJWkVdID0gewogICAgICAgIHsxLjAsICAyLjAsIDMuMCwgIDUuMH0sCiAgICAgICAgezMuMCwgLTUuMCwgMS4wLCAgNC4wfSwKICAgICAgICB7NS4wLCAgOS4wLCAyLjAsIC02LjB9LAogICAgICAgIHsxLjAsICA3LjAsIDQuMCwgIDEuMH0KICAgIH07CgogICAgZG91YmxlIE1bU0laRV1bU0laRV07IC8vIOODr+ODvOOCreODs+OCsOihjOWIlyBBTQogICAgZG91YmxlIEJbU0laRV1bU0laRV07IC8vIOWQhOOCueODhuODg+ODl+OBruihjOWIlyBCCiAgICBkb3VibGUgY1tTSVpFICsgMV07ICAgLy8g5aSa6aCF5byP44Gu5L+C5pWwIChjMCwgYzEsIGMyLCBjMywgYzQpCgogICAgLy8g5Yid5pyf5YyWCiAgICBjWzBdID0gMS4wOyAvLyDOu140IOOBruS/guaVsOOBr+W/heOBmiAxLjAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBTSVpFOyBqKyspIHsKICAgICAgICAgICAgQltpXVtqXSA9IChpID09IGopID8gMS4wIDogMC4wOyAvLyDljZjkvY3ooYzliJcKICAgICAgICB9CiAgICB9CgogICAgLy8gRmFkZGVldi1MZVZlcnJpZXIg44Ki44Or44K044Oq44K644Og44Gu5a6f6KGMCiAgICBmb3IgKGludCBtID0gMTsgbSA8PSBTSVpFOyBtKyspIHsKICAgICAgICBtYXRyaXhfbXVsdGlwbHkoQSwgQiwgTSk7IC8vIE0gPSBBICogQl97bS0xfQogICAgICAgIGRvdWJsZSB0cmFjZSA9IGNhbGN1bGF0ZV90cmFjZShNKTsKICAgICAgICBjW21dID0gLXRyYWNlIC8gbTsgICAgICAgIC8vIOS/guaVsOOBruaxuuWumgoKICAgICAgICAvLyDmrKHjga7jgrnjg4bjg4Pjg5fjga7jgZ/jgoHjga4gQl9tIOOCkuioiOeulzogQl9tID0gTSArIGNfbSAqIEkKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFNJWkU7IGorKykgewogICAgICAgICAgICAgICAgQltpXVtqXSA9IE1baV1bal0gKyAoKGkgPT0gaikgPyBjW21dIDogMC4wKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyA9PT0g6KGM5YiX5byP77yI54m55oCn5pa556iL5byP77yJ44Gu5Ye65YqbID09PQogICAgcHJpbnRmKCI9PT0g6KGM5YiX5byP44Gu5bGV6ZaL57WQ5p6cICjnibnmgKfmlrnnqIvlvI8pID09PVxuIik7CiAgICBwcmludGYoImRldChBIC0gzrtJKSA9IDBcblxuIik7CiAgICBwcmludGYoImYozrspID0gzrteNCArICglLjFmKc67XjMgKyAoJS4xZinOu14yICsgKCUuMWYpzrsgKyAoJS4xZikgPSAwXG4iLCAKICAgICAgICAgICAgY1sxXSwgY1syXSwgY1szXSwgY1s0XSk7CgogICAgcmV0dXJuIDA7Cn0=