ピタゴラスの三角形

 プログラミング関連で、やや面倒な作業を見てきましたが、もうチョット足が地に付いたものを、と思いました。ところが適当な素材が見当たりません。 もし、実務で「同じような作業の繰り返しで手間取っている」ような作業がありましたら、メールでも使ってお知らせください。

 提供されるものが、仕事の中身が見えすぎて、公開されると困る場合は、当方で、適宜「抽象化」し、了解を頂いた上で公開する方式も考えたいと思います。

 今回は、まだ自分で「テーマ探し」をしなくてはなりませんので、「ピタゴラスの三角形」、即ち、「3辺が全て整数で与えられる直角三角形」のデータを列挙してみます。 

1) サンプル 2) 3つの整数 3) 相関関係の確認 4) 最小データ

 これらのデータは、3辺の数値が、互いに素になる組み合わせの中で、1) が、斜辺の値が小さい方から5つ並べたものです。 これらの数値をどうやって求めたって ? 整数m,nを準備し、2) のような3つの式によって、3辺 a,b,c が与えられます。

 2つの辺の自乗を加え合わせて残りの1辺を与えることができるという、3) の相関関係により、直角三角形を与えることは明らかです。 4) は、mをnの関数式として定義し、n=h=1を代入して最小のピタゴラス3角形を与えた例です。

5) hの値を順次増やした場合の計算結果

 あらゆる整数m,nの組み合わせが全て、ピタゴラスの直角三角形になります。 「この方式で作られる以外には、3辺が整数になる直角三角形はない」と証明されているそうです。(私の記憶違いでなければ、ですが)

 ところで、5) で求めた計算結果は、h=2(m=3)と h=4(m=5)で、3辺の値がいずれも偶数です。データが、基本形の整数倍になるものを全部求めると玉石混交になります。 そこで、3辺が互いに素になるもののみをリストアップすることにしてみます。

 ここで、プログラムを組んで、ピタゴラスの三角形を取り出してみましょう。 このような繰り返し計算をする作業では、プログラミングが有利になります。 計算をした結果を羅列するには、配列が便利ですが、誰が見ても分り易いのは表です。 スクリプト関数を作る前に出力用の表(6)を準備しておきます。

* 1行目:関数名「ピタ1」、
引数は、変数n。
* 変数 iは、表の行数。
* 変数n2に、n2を代入。
* for文の300は、適当に
大きな数値。 step 2 はk
を奇数のみに。
* mにn+kを代入。
* 変数m2に、m2を代入。
* tb1は表で、2,3,4列目
を計算して表の i 行目に
代入。
* 斜辺の数値が320より大
きくなったら loopを脱出。
* break条件に達しなけれ
ば、表の行数を1つ増やし
for文の頭へ戻る。
7) プログラム
6) 空の表 8) 実行後: 9) 実行結果

 プログラム(7)の内容は、その右側にゴチャゴチャ書きましたが、これだけのスペースで書けるほど簡単な関数です。 kを奇数にした理由は、「偶数にすれば得られる3辺が全て偶数になる」ので、その条件を外しました。

 作業の方は、ドキュメントの何処かへと書いて、計算を実行させます(8)。 計算の結果は、戻り値 9 で、9行分即ち9組のデータが得られます。そのデータが、9) 実行結果の表です。 引数の値を、2,3,4・・・と変える度に得られるデータは変わります。

n=2 n=3 n=4 n=5

 引数が3の場合は、3辺が全て9の倍数になる場合があります。nとkが共に3の倍数になった場合です。上に記したように3辺の数値が共に素であるためには、nとkが共通の約数を持たないことという条件が必要です。

 プログラム上では、そのようなものがリストアップされたら、目印をつけて、後から排除します。 少し改良したpytha2(n) では、これまで空欄だった1列目に、nとkの最大公約数を入れるようにしました。


 ドキュメントの何処かへ、4列
10行を代入しておきます。

 もう1つの改良点は、表を使った後、次の作業で前回のデータが残るのを防止するため、関数 renew_tb1 を準備し、pytha2(n) の最初の部分で全体を0でクリアしました。 この表をクリアする関数は、forループの終点値を代入定義しておくことが必要です。

n=3 n=5

 pytha2(n)= のnを変えながら順次作業すると、nとhの最大公約数が1列目に表示され、処理し易い状態になりました。 0が並んだ行も、除外処理対象です。


 ここまでできたので、取り敢えず、これまでnを引数として与えながら、繰り返し表を作ってきた作業を、一挙動で済ませるプログラムに変換してみます。 nを forループへ組み込み、その最大値を引数として入力します。勿論、表の行数は、大幅に増やす必要があり、80行としました。

 と入
力し、enter にて
 
計算結果が出ました。
 表の中身は、全部で
74行の出力になりま
した。
 尚、renew_tb1関数
は不要になったので、
プログラムから削除
しました。

 結果は、余りにも長い表なので、ここではお見せできません。 尤も、表を配列に変えれば、できない話ではありません。

p,qの代入定義と
tb2 の配列定義
計算実行は同様 配列用のプログラム

 表と配列では、サフィックスの並びを逆にすることが必要です。 勿論、表と配列は名前も変えてあります。

 後は、sortのプログラムを組んで並べ替えるだけです。参考書でいいものが見付からなかったので強引に組み上げてみました。 引数「tb」は、処理先の表です。 表の第1列と第2列の順位で、データの小さいものほど上段に並ぶようにしました。

 先ほどの74行のデータを得た表のコピーを取ると、「Sheet3」という名前になったので、プログラム「sorttb」を計算実行する際の引数は、これを使いました。 代入定義のk0は、処理対象の行数です。

 実行させてみると、16秒も掛かりました。 並べ替え作業はこんなに時間が掛かりますが、手作業でやることを考えたら比較にならないほど速いのです。

 結果がうまく出たので、このたくさんのデータを4つの表に分けてみました。 第1列目が3〜7になっているデータは、ピタゴラスのデータとしては面白くありませんが、並べ替えで「排除したい行」がうまく分離できたので、ご参照ください。

 この作業で、これ以上もっと大きな数値を求めようとすれば、総数が斜辺最大値の自乗に比例しそうだし、並べ替えも、総数の自乗に比例するはずです。

 その場合、並べ替えの作業を分割して、第1列が1になる部分と、3以上になる部分を別々の表に分けたり、1の部分でも、2列目の数値が100以下、200以下、・・・1000以上 のように細かく分けて作業すれば、個々の並べ替えで暫らくパソコンが動きっぱなし! なんてことは避けられるはずです。

 それより、プログラムの実行とともに、バグ(間違い)があったら、クラッシュすることになるので注意してください。 1つは、新規に組んだばかりのプログラムを実行する前に、必ずファイルの保存をしておきましょう。

 もう1つは、異常現象の場合に、ソフトが警告を発してくれる場合に、「OK」を出すとクラッシュすることがあります。「OK」の代わりに、「esc」をキー入力すれば、クラッシュを回避できる場合もあります。


 (注)「クラッシュ」に対して問合せがありましたので、説明しておきます。 ここで記した「クラッシュ」は、旧来よく遭遇した、ハング・暴走・フリーズ、といった現象とは少し異なります。 Windows は保全状態にあります。

 このカルキングで起こっているクラッシュ現象は、恐らく、基本ソフト「Windows」が本体の保全のため、「自分の配下で動いているソフト(或いはユーザー)が指定外の作業をした」場合に、「不都合なことが起こった」としてその行為を排除する強権発動です。

 従って、本来のクラッシュよりは、はるかに軽い症状なのでその辺はご安心ください。でも、作成中の(ウッカリすると2〜3時間保存し忘れていた)文書ファイルが、一瞬で飛んでしまいますので、ご注意ください。

 カルキングに、私の言うようなクラッシュ現象が多いのは、基本ソフトWindows のバージョンアップの際に変更された要求条項が沢山あって、ソフトメーカーとして全部を修正しきれないこともあるようです。

 ソフト屋さんって結構大変な仕事なのです。そのWindows メーカーから押し付けられた「要求条項」が、一読して理解できるものばかりではないからです。

 次のページ へ進む

 トップページ へ戻る

 前のページ へ戻る

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送