フェルマーの最終定理のニアミス解

以前谷山・志村予想の所で"フェルマーの最終定理"について触れましたが,今日はそのニアミス解についてのお話です
サイモンシン著・青木薫訳 数学者たちの楽園 "第3章 ホーマーの最終定理"をフォローします
アニメ「ザ・シンプソンズ」≪エバーグリーン・テラスの魔法使い≫(1998)の回でホーマーが黒板に書いた数式の一部がこちらです


3987^12 + 4365^12 = 4472^12


フェルマーの最終定理は正しいことが証明されてますので,上式は当然誤りです
ですがその誤差は非常に小さく,電卓等の有効桁数の低い処理系では正しい(ように見える)という理系ジョークです
本書の巻末にニアミス解を計算するC言語のコードが載っていたので計算してみます
コードの著者は「ザ・シンプソンズ」の脚本家 デービッド・S・コーエン氏です
当初はwxMaxima用にコードを書いたのですが,あまりにも数値計算が遅かったためにC言語に書き直したのでほとんどオリジナルと変わりません('A`)


コンパイラにはBorland C++ Compiler 5.5 (BCC32) を使いました
getch関数を使っているのでコンパイラによっては動作が異なるかもです・・・


fltnm,zip

  • fltnm.exe プログラム本体
  • fltnm.c  ソースコード(テキストファイル)


以下にソースコードを示します
【fltnm.c】

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

int main(){

	double x, y, z, i, az, d, upmin;
	
	upmin = pow(10, -7);
	
	for(x = 51; x <= 3999; x++){
	
		printf("\r[%.lf]", x);
		
		for(y = x+1; y <= 4444; y++){
		
			for(i = 7; i <= 77; i++){
			
				z = pow(pow(x, i) + pow(y, i), (1/i));
				az = floor(z + 0.5);
				d = fabs(z - az);
				
				if(az == y) break;
				
				if(d <= upmin){
				
					printf("\r%.f,\t%.f,\t%.f,\t%.f,\t%8.10f\n", x, y, az, i, d);
				
				}
				
				if(z < (y + 1)) break;
				
			}
			
		}
		
	}
	
	getch();
	return 1;

}

d : 両辺の差の絶対値
upmin : 許容する誤差=10^-7
両辺の差の絶対値が0.0000001以下となる組合せを計算します


http://cdn-ak.f.st-hatena.com/images/fotolife/r/ryooji_f/20161221/20161221215355.png
画面出力には,左から x, y, z, i, d を表示しています


というわけで,3987^12 + 4365^12 = 4472^12 が非常によい近似を与えていることが解ります


数学者たちの楽園: 「ザ・シンプソンズ」を作った天才たち

数学者たちの楽園: 「ザ・シンプソンズ」を作った天才たち