Math Battle [ 0333: 原始ピタゴラス数をさがす ]

[ 0333: 原始ピタゴラス数をさがす ]


[ 千手春弥さんの出題 ]

多絵さんが 0056 で 100 までの値の範囲で
(a,b,c) という原始ピタゴラス数セットを全部見つけるプログラムを書きましたが、
結果出力が a の昇順になっていません。

これを改造して結果出力が a の昇順になるようにしてください。


[ 大宙麗亜ちゃんの回答 ]

えへへ、簡単です。

湯会老人が 「数学まるわかり」見本 の中ですでにやってます。

#!/usr/local/bin/perl

@found = ();
$count = 0;

for ($y=1; $y<10; $y++) {
 for ($x=$y+1; $x<10; $x++) {
  $a = $x*$x - $y*$y;
  $b = 2*$x*$y;
  $c = $x*$x + $y*$y;
  # 互いに素でないものを無視。
  $flag = 0;
  for($n=2; $n<=$c; $n++) {
   if (($a%$n == 0) && ($b%$n == 0)
    && ($c%$n == 0)) {
    $flag = 1;
    last;
   }
  }
  next if ($flag == 1);
  goto END if ($c >= 100);
  if ($a > $b) {
   $tmp = $a;
   $a = $b;
   $b = $tmp;
  }
  @found[$count++] =
   sprintf("(%2d, %2d, %2d)", $a, $b, $c);
 }
}
END:
printf("原始ピタゴラス数が %d セット見つかりました。\n",
 $count);
@found = sort {$a cmp $b} @found;
for ($n=0; $n<$count; $n++) {
 printf("%s\n", @found[$n]);
}

実行結果は:


原始ピタゴラス数が 16 セット見つかりました。
( 3,  4,  5)
( 5, 12, 13)
( 7, 24, 25)
( 8, 15, 17)
( 9, 40, 41)
(11, 60, 61)
(12, 35, 37)
(13, 84, 85)
(16, 63, 65)
(20, 21, 29)
(28, 45, 53)
(33, 56, 65)
(36, 77, 85)
(39, 80, 89)
(48, 55, 73)
(65, 72, 97)

きれいに並んでいますね。(a の値の順)
結果は正しいと思います。

x > y の範囲で:

a = x2 - y2
b = 2*x*y
c = x2 + y2

としますと:

a2 + b2
= (x2 - y2)2 + 4*x2*y2
= x4 + 2*x2*y2 + y4
= (x2 + y2)2
= c2

(a, b, c) はピタゴラスの定理を満たします。

見つかった (a,b,c) の中で a と b と c が公約数を持つものを除外していますから、
残るのは原始ピタゴラス数だけです。
これらを ( 3, 4, 5) などの文字列にして @found 配列に順次入れ、
最後に Perl 組み込みの sort 関数で昇順にソートします。

sort 結果を @found 配列にもどしてから、@found 配列から順次要素を取り出して
printf します。

こういうわけです。


[ 千手春弥さんのコメント ]

レイアちゃん、素晴らしい !!!

Perl の配列の使いかたもよくわかってますね。
感心、感心。

[ 0341: 次の記事 ]

[ 0340: 素数日プログラム ]

[ 0339: emirp 探し ]

[ 0338: 0331の解きなおし ]

[ 0337: ubuntu 20.04 へ upgrade ]

[ 0336: πの近似計算 ]

[ 0335: 0253 の振り返り ]

[ 0334: Data Camp Python ]

[ 0333: 原始ピタゴラス数をさがす ]

[ 0332: LaTex の使いかた ]

[ 0331: 青い三角形の面積 ]

[ 0330: 長方形の幅 ]

[ 0329: 三角関数の関数の最大最小 ]

[ 0328: IMO 過去問 9 ]

[ 0327: 1+2+3+...+無限 ]

[ 0326: 2分木 sort も含めた性能比較 ]

[ 0325: 最悪ケースでの sort 比較 ]

[ 0324: 0307の回答 ④ ]

[ 0323: 0307の回答 ③ ]

[ 0322: 0307の回答 ② ]

[ 0321: 0307の回答 ① ]

[ 0320: 前の記事 ]

[ トップページへ ]