パズル万華鏡

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

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

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

 c2≦nを満たすピタゴラス数(a2 + b2 = c2 a,b,c(1≦a≦b≦c)は正整数)の求め方を考察する。

 cの値が与えられたとする。ピタゴラス数は格子点(0,0)と格子点(c,c)を結ぶ対角線より上側の4分円a2+b2=c2 (0≦a≦c,0≦b≦c)上に存在する。平面の格子点(a,b)を(0,c)から出発し、4分円に沿って見落としがないようにたどっていくと、効率よくピタゴラス数をさがすことができる。下図の赤線に沿って探索する。探索が終了すれば、cの値をひとつ増やし、同様の探索をc2の値がnの値に達するまで繰り返す。

f:id:isemba:20150801095709j:plain
ピタゴラス数生成プログラム

/* << pg211.c >> */
#include <stdio.h>
int main () {
  double a,b,c,                             
         count, /* ピタゴラス数の個数。*/       
         n,     /* nの値。*/                    
         w;                                     
  /* nの値を読み込む。*/                 
  scanf("%lf",&n);                        
  /* 初期設定。*/                        
  c = 1; count = 0;                      
  /* ピタゴラス数の探索。*/              
  while( c*c <= n ) {
    a = 1; b = c;
    while( a <= b ) {
      w = a*a + b*b - c*c;
      if( w == 0 ) {
        count++; 
        printf("%d: ",(int)count);
        printf("%d %d %d\n",(int)a,(int)b,(int)c);
      }
      if( w > 0 ) { b--; } else { a++; }
    }
    c++;
  }
  printf("n=%16.0lf\n",n);
  printf("count=%16.0lf\n",count);
}

f:id:isemba:20150801095757j:plain
f:id:isemba:20150801095807j:plain