パズル万華鏡

面白いパズルの紹介と解説をします。

ピタゴラス数についての考察(5)

 ピタゴラス数についての考察を紹介します。

 正整数nが与えられたとき、既約なピタゴラス数 x2 + y2 = z2 (1≦x≦y≦z)で、
z2≦nを満たすものを求める。次の定理を利用する。
f:id:isemba:20150801100249j:plain

●生成法

 すべてのピタゴラス数は既約なピタゴラス数(x,y,z)の定数倍(dx,dy,dz)となる。したがって、まず既約なピタゴラス数を求め、(dz)2≦nを満たすものを探索する。
f:id:isemba:20150801100402j:plain

ピタゴラス数生成プログラム

/* << 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;
  }
}

f:id:isemba:20150801100513j:plain
f:id:isemba:20150801100524j:plain