#include <stdio.h>
#include <math.h>
#define N 4
#define EPS 1e-6
#define MAX_ITER 100
void print_matrix(double mat[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
}
}
}
int main() {
double A[N][N] = {
{5.0, 4.0, 1.0, 1.0},
{4.0, 5.0, 1.0, 1.0},
{1.0, 1.0, 4.0, 2.0},
{1.0, 1.0, 2.0, 4.0}
};
double A_orig[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
A_orig[i][j] = A[i][j];
double P[N][N] = {0};
for (int i = 0; i < N; i++) P[i][i] = 1.0;
int iter = 0;
// Clean Tabled Header for Convergence History [cite: 13]
printf("=== CONVERGENCE HISTORY ===\n"); printf("%-5s %-16s %-8s\n", "Iter", "Max Off-Diagonal", "Position"); printf("---------------------------------------\n");
while (iter < MAX_ITER) {
int p = 0, q = 1;
double max_val
= fabs(A
[0][1]); for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
if (fabs(A
[i
][j
]) > max_val
) { p = i;
q = j;
}
}
}
// Tidy row output alignment
printf("%-5d %-16.6f A[%d][%d]\n", iter
, max_val
, p
, q
);
if (max_val < EPS) {
printf("---------------------------------------\n"); printf("Status: Successfully converged.\n\n"); break;
}
double phi, cos_t, sin_t;
if (fabs(A
[p
][p
] - A
[q
][q
]) < 1e-12) { } else {
phi
= 0.5 * atan2(2.0 * A
[p
][q
], A
[p
][p
] - A
[q
][q
]); }
double Ap_old = A[p][p];
double Aq_old = A[q][q];
A[p][p] = Ap_old * cos_t * cos_t + Aq_old * sin_t * sin_t + 2.0 * A[p][q] * sin_t * cos_t;
A[q][q] = Ap_old * sin_t * sin_t + Aq_old * cos_t * cos_t - 2.0 * A[p][q] * sin_t * cos_t;
A[p][q] = A[q][p] = 0.0;
for (int i = 0; i < N; i++) {
if (i != p && i != q) {
double a_ip = A[i][p];
double a_iq = A[i][q];
A[i][p] = A[p][i] = a_ip * cos_t + a_iq * sin_t;
A[i][q] = A[q][i] = -a_ip * sin_t + a_iq * cos_t;
}
}
for (int i = 0; i < N; i++) {
double p_ip = P[i][p];
double p_iq = P[i][q];
P[i][p] = p_ip * cos_t + p_iq * sin_t;
P[i][q] = -p_ip * sin_t + p_iq * cos_t;
}
iter++;
}
// === Output Final Results ===
printf("=== EIGENVALUES & EIGENVECTORS ===\n"); for (int j = 0; j < N; j++) {
printf("Eigenvalue %d: %.4f\n", j
+ 1, A
[j
][j
]); printf("Eigenvector %d:\n", j
+ 1); for (int i = 0; i < N; i++) {
}
}
// === Automated Verification Step ===
printf("=== CODE-LEVEL VERIFICATION (Ax = lambda * x) ===\n");
int all_passed = 1;
double tolerance = 1e-5; // Threshold for acceptable math verification error
for (int j = 0; j < N; j++) {
double lambda = A[j][j];
for (int i = 0; i < N; i++) {
double Ax_i = 0.0;
for (int k = 0; k < N; k++) {
Ax_i += A_orig[i][k] * P[k][j];
}
double lambda_x_i = lambda * P[i][j];
// Programmatically verify the absolute difference
if (fabs(Ax_i
- lambda_x_i
) > tolerance
) { all_passed = 0;
}
}
}
if (all_passed) {
printf("Verification Status: PASSED (All equations hold within error tolerances)\n"); } else {
printf("Verification Status: FAILED (Discrepancy detected)\n"); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIE4gNCAgICAgICAgIAojZGVmaW5lIEVQUyAxZS02ICAgIAojZGVmaW5lIE1BWF9JVEVSIDEwMAoKdm9pZCBwcmludF9tYXRyaXgoZG91YmxlIG1hdFtOXVtOXSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBwcmludGYoIiU3LjRmICIsIG1hdFtpXVtqXSk7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBkb3VibGUgQVtOXVtOXSA9IHsKICAgICAgICB7NS4wLCA0LjAsIDEuMCwgMS4wfSwKICAgICAgICB7NC4wLCA1LjAsIDEuMCwgMS4wfSwKICAgICAgICB7MS4wLCAxLjAsIDQuMCwgMi4wfSwKICAgICAgICB7MS4wLCAxLjAsIDIuMCwgNC4wfQogICAgfTsKCiAgICBkb3VibGUgQV9vcmlnW05dW05dOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspCiAgICAgICAgICAgIEFfb3JpZ1tpXVtqXSA9IEFbaV1bal07CgogICAgZG91YmxlIFBbTl1bTl0gPSB7MH07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgUFtpXVtpXSA9IDEuMDsKCiAgICBpbnQgaXRlciA9IDA7CiAgICAKICAgIC8vIENsZWFuIFRhYmxlZCBIZWFkZXIgZm9yIENvbnZlcmdlbmNlIEhpc3RvcnkgW2NpdGU6IDEzXQogICAgcHJpbnRmKCI9PT0gQ09OVkVSR0VOQ0UgSElTVE9SWSA9PT1cbiIpOwogICAgcHJpbnRmKCIlLTVzICAgJS0xNnMgICAlLThzXG4iLCAiSXRlciIsICJNYXggT2ZmLURpYWdvbmFsIiwgIlBvc2l0aW9uIik7CiAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CgogICAgd2hpbGUgKGl0ZXIgPCBNQVhfSVRFUikgewogICAgICAgIGludCBwID0gMCwgcSA9IDE7CiAgICAgICAgZG91YmxlIG1heF92YWwgPSBmYWJzKEFbMF1bMV0pOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IE47IGorKykgewogICAgICAgICAgICAgICAgaWYgKGZhYnMoQVtpXVtqXSkgPiBtYXhfdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IGZhYnMoQVtpXVtqXSk7CiAgICAgICAgICAgICAgICAgICAgcCA9IGk7CiAgICAgICAgICAgICAgICAgICAgcSA9IGo7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFRpZHkgcm93IG91dHB1dCBhbGlnbm1lbnQKICAgICAgICBwcmludGYoIiUtNWQgICAlLTE2LjZmICAgQVslZF1bJWRdXG4iLCBpdGVyLCBtYXhfdmFsLCBwLCBxKTsKCiAgICAgICAgaWYgKG1heF92YWwgPCBFUFMpIHsKICAgICAgICAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgICAgICAgICBwcmludGYoIlN0YXR1czogU3VjY2Vzc2Z1bGx5IGNvbnZlcmdlZC5cblxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgZG91YmxlIHBoaSwgY29zX3QsIHNpbl90OwogICAgICAgIGlmIChmYWJzKEFbcF1bcF0gLSBBW3FdW3FdKSA8IDFlLTEyKSB7CiAgICAgICAgICAgIHBoaSA9IGFjb3MoLTEuMCkgLyA0LjA7IAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBoaSA9IDAuNSAqIGF0YW4yKDIuMCAqIEFbcF1bcV0sIEFbcF1bcF0gLSBBW3FdW3FdKTsKICAgICAgICB9CiAgICAgICAgY29zX3QgPSBjb3MocGhpKTsKICAgICAgICBzaW5fdCA9IHNpbihwaGkpOwoKICAgICAgICBkb3VibGUgQXBfb2xkID0gQVtwXVtwXTsKICAgICAgICBkb3VibGUgQXFfb2xkID0gQVtxXVtxXTsKICAgICAgICAKICAgICAgICBBW3BdW3BdID0gQXBfb2xkICogY29zX3QgKiBjb3NfdCArIEFxX29sZCAqIHNpbl90ICogc2luX3QgKyAyLjAgKiBBW3BdW3FdICogc2luX3QgKiBjb3NfdDsKICAgICAgICBBW3FdW3FdID0gQXBfb2xkICogc2luX3QgKiBzaW5fdCArIEFxX29sZCAqIGNvc190ICogY29zX3QgLSAyLjAgKiBBW3BdW3FdICogc2luX3QgKiBjb3NfdDsKICAgICAgICBBW3BdW3FdID0gQVtxXVtwXSA9IDAuMDsgCgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpICE9IHAgJiYgaSAhPSBxKSB7CiAgICAgICAgICAgICAgICBkb3VibGUgYV9pcCA9IEFbaV1bcF07CiAgICAgICAgICAgICAgICBkb3VibGUgYV9pcSA9IEFbaV1bcV07CiAgICAgICAgICAgICAgICBBW2ldW3BdID0gQVtwXVtpXSA9IGFfaXAgKiBjb3NfdCArIGFfaXEgKiBzaW5fdDsKICAgICAgICAgICAgICAgIEFbaV1bcV0gPSBBW3FdW2ldID0gLWFfaXAgKiBzaW5fdCArIGFfaXEgKiBjb3NfdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgZG91YmxlIHBfaXAgPSBQW2ldW3BdOwogICAgICAgICAgICBkb3VibGUgcF9pcSA9IFBbaV1bcV07CiAgICAgICAgICAgIFBbaV1bcF0gPSBwX2lwICogY29zX3QgKyBwX2lxICogc2luX3Q7CiAgICAgICAgICAgIFBbaV1bcV0gPSAtcF9pcCAqIHNpbl90ICsgcF9pcSAqIGNvc190OwogICAgICAgIH0KCiAgICAgICAgaXRlcisrOwogICAgfQoKICAgIC8vID09PSBPdXRwdXQgRmluYWwgUmVzdWx0cyA9PT0KICAgIHByaW50ZigiPT09IEVJR0VOVkFMVUVTICYgRUlHRU5WRUNUT1JTID09PVxuIik7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgIHByaW50ZigiRWlnZW52YWx1ZSAlZDogJS40ZlxuIiwgaiArIDEsIEFbal1bal0pOwogICAgICAgIHByaW50ZigiRWlnZW52ZWN0b3IgJWQ6XG4iLCBqICsgMSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIgICU3LjRmXG4iLCBQW2ldW2pdKTsgCiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KCiAgICAvLyA9PT0gQXV0b21hdGVkIFZlcmlmaWNhdGlvbiBTdGVwID09PQogICAgcHJpbnRmKCI9PT0gQ09ERS1MRVZFTCBWRVJJRklDQVRJT04gKEF4ID0gbGFtYmRhICogeCkgPT09XG4iKTsKICAgIAogICAgaW50IGFsbF9wYXNzZWQgPSAxOwogICAgZG91YmxlIHRvbGVyYW5jZSA9IDFlLTU7IC8vIFRocmVzaG9sZCBmb3IgYWNjZXB0YWJsZSBtYXRoIHZlcmlmaWNhdGlvbiBlcnJvcgoKICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICAgZG91YmxlIGxhbWJkYSA9IEFbal1bal07CiAgICAgICAgCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgZG91YmxlIEF4X2kgPSAwLjA7CiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgTjsgaysrKSB7CiAgICAgICAgICAgICAgICBBeF9pICs9IEFfb3JpZ1tpXVtrXSAqIFBba11bal07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG91YmxlIGxhbWJkYV94X2kgPSBsYW1iZGEgKiBQW2ldW2pdOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gUHJvZ3JhbW1hdGljYWxseSB2ZXJpZnkgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UKICAgICAgICAgICAgaWYgKGZhYnMoQXhfaSAtIGxhbWJkYV94X2kpID4gdG9sZXJhbmNlKSB7CiAgICAgICAgICAgICAgICBhbGxfcGFzc2VkID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoYWxsX3Bhc3NlZCkgewogICAgICAgIHByaW50ZigiVmVyaWZpY2F0aW9uIFN0YXR1czogUEFTU0VEIChBbGwgZXF1YXRpb25zIGhvbGQgd2l0aGluIGVycm9yIHRvbGVyYW5jZXMpXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCJWZXJpZmljYXRpb24gU3RhdHVzOiBGQUlMRUQgKERpc2NyZXBhbmN5IGRldGVjdGVkKVxuIik7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K