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

int main() {
    double x[8] = {0.15708, 0.23982, 0.37400, 0.57120, 0.82674, 1.04720, 1.23200, 1.43452};
    double y[8] = {0.98769, 0.97138, 0.93087, 0.84125, 0.67728, 0.50000, 0.33236, 0.13586};

    double Sx2 = 0, Sx4 = 0, Sy = 0, Sx2y = 0;

    for (int i = 0; i < 8; i++) {
        double x2 = x[i] * x[i];
        Sx2 += x2;
        Sx4 += x2 * x2;
        Sy += y[i];
        Sx2y += x2 * y[i];
    }

    double A11 = 8,     A12 = Sx2;
    double A21 = Sx2,   A22 = Sx4;
    double B1 = Sy,     B2 = Sx2y;
    double det = A11 * A22 - A12 * A21;
    double a1 = (B1 * A22 - A12 * B2) / det;
    double a2 = (A11 * B2 - B1 * A21) / det;

    printf("(1): y = a1 + a2*x^2 計算結果\n");
    printf("求められた係数:\n");
    printf("  a1 = %.6f\n", a1);
    printf("  a2 = %.6f\n", a2);

    double E = 0;
    for (int i = 0; i < 8; i++) {
        double yhat = a1 + a2 * x[i] * x[i];
        double diff = y[i] - yhat;
        E += diff * diff;
    }

    printf("\n近似式による偏差の2乗和 (誤差 E):\n");
    printf("  E = %.10f\n", E);

    printf("\n近似式による y の予測値 :\n");
    for (int i = 0; i < 8; i++) {
        double yhat = a1 + a2 * x[i] * x[i];
        printf("%f\n", yhat);
    }

    return 0;
}