ピタゴラス数についての考察を紹介します。
正整数nが与えられたとき、既約なピタゴラス数 x2 + y2 = z2 (1≦x≦y≦z)で、
z2≦nを満たすものを求める。次の定理を利用する。
●生成法
すべてのピタゴラス数は既約なピタゴラス数(x,y,z)の定数倍(dx,dy,dz)となる。したがって、まず既約なピタゴラス数を求め、(dz)2≦nを満たすものを探索する。
●ピタゴラス数生成プログラム
/* << pg311.c >> */ #include <stdio.h> #include <math.h> int main() { double count, /* ピタゴラス数の個数。*/ k, n, /* nの値。*/ s,t, /* s,tの値。*/ x,y,z, /*x、y、zの値。*/ zz,w; double gcd(double s, double t); /* nの値の読み込み。*/ scanf("%lf",&n); /* 初期設定。*/ s = 2; t = 1; z = s*s + t*t; count = 0.0; /* ピタゴラス数の探索。*/ while( 1 ) { while( (z*z <= n)&&(t < s) ) { if( gcd(s,t) == 1 ) { x = s*s - t*t; y = 2*s*t; k = 1; /* 規約なピタゴラス数(x,y,z)の定数倍のピタゴラス数を求める。*/ for( w=z; w*w<=n; w=w+z ) { count = count + 1; printf("%16.0lf:",count); printf("%d %d %d\n",(int)(k*x),(int)(k*y),(int)(k*z)); k++; } } t = t + 2; z = s*s + t*t; } if( (z*z > n)&&(t <= 2) ) { break; } s = s + 1; if( s-floor(s/2)*2 == 0) { t = 1; } else { t = 2; } z = s*s + t*t; } printf("n=%16.0lf\n",n); printf("count=%16.0lf\n",count); } /* sとtの最大公約数を求める。*/ double gcd(double s, double t) { double q,r; while( 1 ) { q = floor(s/t); r = s - q*t; if( r == 0 ) { return t; } s = t; t = r; } }