#include <stdio.h>
#include<math.h>    // sqrt(),ceil(),floor()を使う
int root(int);
int euclid(int a, int b);

main()
{
  int x,y,a,c;  
  for(x=1 ;x<10000 ; x++)     // xの最大値は適当に定める 
    for(y=1;x*x-5*y*y>0;y++)  // yの範囲は解説文にて説明している 
      if(euclid(x,y) != 1) continue;
      /* 互いに素でなければ平方数の判定をしない */
      else{
        a = root(x*x+5*y*y);
        c = root(x*x-5*y*y);
        if(a != 0 && c != 0) // 平方数でなかった場合は 0が返る
          { /* 解の表示 */
            printf("found: %d/%d\n",x,y);
            printf("(%d/%d)^2 + 5 = (%d/%d)^2\n",x,y,a,y);
            printf("(%d/%d)^2 - 5 = (%d/%d)^2\n",x,y,c,y);
          }
      }
  return 0;
}

//引数の平方根が整数ならその値を，そうでなければ0を返す．
int root(int num)
{
  double root = sqrt(num);
  int i;
  i = ceil(root);  /* 切り上げた数の２乗を引数と比較 */
  if(i*i==num) return i;
  i = floor(root); /* 切り捨てた数の２乗を引数と比較 */
  if(i*i==num) return i;
  return 0;   /* 平方根が整数でなければ０を返す */
}

/* ユークリッドの互除法で最大公約数を求める */
int euclid(int m, int n)
{
    int amari;
    if ((amari = m % n) == 0)
        return n;
    else 
        return euclid(n, amari);
}
