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