サイトマップ / C言語講座出入り口総目次目次:数学の関数>フェルマーの最終定理

青い直線

フェルマーの最終定理

青い直線

[双曲線関数]←このソース→[ポアッソン分布]

/* フェルマーの最終定理

フェルマー(Pierre de Fermat、1601〜1665)はフランスの数学者で、弁護士の仕事の傍ら余暇に数学を研究しました。フェルマーの最終定理とは、

    整数 X, Y, Z は互いに異なる0でない整数とする。
    X + Y = Z を満たす、整数 X, Y, Z は存在する。
    X * X + Y * Y = Z * Z  を満たす、整数 X, Y, Z も存在する。

ところが、3乗以上になるとそのような整数は存在しないというものです。

その証明を記すにはこの欄外には充分なスペースがない」という、フェルマーはそれを証明できたのかできなかったのか、あいまいな記述を残して亡くなってしまいました。その後、さまざまな数学者が証明を試みましたが、ことごとく失敗に終わっています。その証明ができたのはごく最近です。

ソースプログラムの説明

今日は、2乗の場合で、整数X、Y が20より小さい場合に限ってフェルマーの定理を満たす整数を探します。

整数X、Y、Zは互いに異なる0でない整数なので、2重のforループで、 XとYの値を1から20まで変化させて、もしX = Yなら、continueで内側のループから抜けます。

そうでなければ、X * X + Y * Yを計算し、その平方根を求めます。

平方根を返す標準ライブラリ関数を下記に示します。

    #include <math.h>
    double sqrt(double x);

    例:y = sqrt(x);

sqrt( )は倍精度浮動小数点数xの平方根を返します。平方根が整数であれば、X、Y、Zは上記の関係をみたします。

このアルゴリズムをコードに直せば良いのですが、整数かどうかの判定をしなければなりません。それにはceil( )floor( )を使います。

    #include <math.h>
    double ceil(double x);

    例:y = ceil(x);

    戻り値
    x より大きい最小の整数


    #include <math.h>
    double floor(double x);

    例:y = floor(x);

    戻り値
    x より小さい最大の整数

ceilingは天井、floorは床という意味です。平方根と平方根のceil( )かfloor( )とが等しければその数は整数です。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <math.h>    /* ceil(  ) floor(  ) sqrt(  ) で必要 */

#define NUM_MAX  20.0

void main(void);

void main(void)
{
    double x, y, z;

    for (x = 1.0; x < NUM_MAX; x++) {
        for (y = 1.0; y < NUM_MAX; y++) {
            if (x == y)
                continue;

            z = sqrt(x * x + y * y);
            if (z == ceil(z))    /*  平方根と平方根のceil(  )が等しければ整数  */
                printf(" X = %2.0lf, Y = %2.0lf, Z = %2.0lf\n", x, y, z);
        }
    }
}

/* ここまでソースプログラム */

[双曲線関数]←このソース→[ポアッソン分布]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:数学の関数>フェルマーの最終定理