サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−
