#include <stdio.h>
#include <math.h>

#define SIZE 4

// ガウスの消去法で行列式を計算する関数
double calculate_determinant(double lambda) {
    // 画像の行列 A - λI をセット
    // ※ A[1][1] の位置は「-5.0 - lambda」になります
    double mat[SIZE][SIZE] = {
        {1.0 - lambda,  2.0,           3.0,           5.0},
        {3.0,          -5.0 - lambda,  1.0,           4.0},
        {5.0,           9.0,           2.0 - lambda, -6.0},
        {1.0,           7.0,           4.0,           1.0 - lambda}
    };

    double det = 1.0;

    for (int i = 0; i < SIZE; i++) {
        // ピボットが0に近い場合の処理（簡易的な部分ピボット選択）
        if (fabs(mat[i][i]) < 1e-9) {
            int swap_row = -1;
            for (int k = i + 1; k < SIZE; k++) {
                if (fabs(mat[k][i]) > 1e-9) {
                    swap_row = k;
                    break;
                }
            }
            if (swap_row == -1) return 0.0; // 行列式は0

            // 行の入れ替え
            for (int j = 0; j < SIZE; j++) {
                double temp = mat[i][j];
                mat[i][j] = mat[swap_row][j];
                mat[swap_row][j] = temp;
            }
            det *= -1.0; // 行を入れ替えたので符号を反転
        }

        // 下三角成分を消去
        for (int k = i + 1; k < SIZE; k++) {
            double factor = mat[k][i] / mat[i][i];
            for (int j = i; j < SIZE; j++) {
                mat[k][j] -= factor * mat[i][j];
            }
        }
        // 対角成分を掛け合わせる
        det *= mat[i][i];
    }

    return det;
}

int main() {
    printf("=== 特性方程式 det(A - λI) の係数確認用チェック ===\n");
    
    // 特定の λ を代入して、多項式が 0 になるか（＝固有値か）をテスト
    // あなたがべき乗法で見つけた「8.6120894541」をテストします
    double test_lambda = 8.6120894541;
    double result = calculate_determinant(test_lambda);

    printf("λ = %.10f のときの行列式の値: %e\n", test_lambda, result);
    
    if (fabs(result) < 1e-4) {
        printf("-> 行列式がほぼ0になったため、この値は間違いなく正しい固有値（根）です。\n");
    } else {
        printf("-> 0になりません。方程式か固有値のどちらかがズレています。\n");
    }

    return 0;
}