フリーソフトの小道   

コンピュータ・プログラマー養成講座(入門編)

第6回 コンテスト第3回「分数計算」における公約数に関する数学の知識
〜管理人(志)からプログラムのヒントを差し上げようということです〜

〜公約数の数学の理論〜

 小学生でも出来る公約数、公倍数ですが、この算数をコンピュータに教えることが出来るでしょうか。 今回は、プログラミングコンテスト第3回のテーマ「分数計算」において必須となる「公約数」について勉強してみましょう。
 挑戦したくても「どうしてよいのやら」と、 糸口が掴めない素人プログラマに贈り物を差し上げる目的で管理人(志)が筆を起こす気持ちになったのです。

 数が特定の数で割り切れるとき、特定の数を約数といいます。2つの数において共通の約数を持つ場合それを公約数といい、 その最大のものを最大公約数といいます。 分数の分子、分母を簡単なものに直すときに使われる算数の技術です。 小学生でも知っていることを高校生に向かって説明する必要は無いのですが、 コンピュータプログラミングをする人はパソコンにこの技術を教えなければなりません。 そこで、数学を使って、この公約数を研究してみましょう。
 2つの数を X、Y としましょう。X、Y に公約数 m があるとします。このとき、次の関係式が成立します。

   X = m・x ・・・(1)   Y = m・y ・・・(2)   Z = X − Y = m(x − y)・・・(3)

 このとき、Z = X − Y の値はどのような数になるのでしょうか? Zも 「同じ公約数 m を持つ」 か、または 「ゼロ」 のどちらかになることは明らかです。
 これを使えば公約数を簡単に求めることができます。

 そこで、上で説明した「引き算した結果は同じ公約数をもつ」 を使って、実際に公約数を求めて見ましょう。 一つの例として次の2つの数で手順を説明してみましょう。1961 と 1484 の二つの数です。

  1. 最初に、1961 − 1484 = 477 より、477 が得られます。
  2. 1961 と 1484 のうち小さい方の 1484 と 477 も同じ公約数を持つはずです。
  3. 1484 − 477 = 1007 が得られます。
  4. 1484 と 477 のうち小さい方の 477 と 1007 も同じ公約数を持つはずです。
  5. 1007 − 477 = 530 が得られます。
  6. 1007 と 477 のうち小さい方の 477 と 530 も同じ公約数を持つはずです。
  7. 530 − 477 = 53 が得られます。
  8. 530 と 477 のうち小さい方の 477 と 53 も同じ公約数を持つはずです。
  9. 477 − 53 = 424 が得られます。
  10. 477 と 53 の小さい方の 53 と 424 も同じ公約数を持つはずです。
  11. 424 − 53 = 371 が得られます。
  12. 424 と 53 の小さい方の 53 と 371 も同じ公約数を持つはずです。
  13. 371 − 53 = 318 が得られます。
  14. 371 と 53 の小さい方の 53 と 318 も同じ公約数を持つはずです。
  15. 318 − 53 = 265 が得られます。
  16. 318 と 53 の小さい方の 53 と 265 も同じ公約数を持つはずです。
  17. 265 − 53 = 212 が得られます。
  18. 265 と 53 の小さい方の 53 と 212 も同じ公約数を持つはずです。
  19. 212 − 53 = 159 が得られます。
  20. 212 と 53 の小さい方の 53 と 159 も同じ公約数を持つはずです。
  21. 159 − 53 = 106 が得られます。
  22. 159 と 53 の小さい方の 53 と 106 も同じ公約数を持つはずです。
  23. 106 − 53 = 53 が得られます。
  24. 106 と 53 の小さい方の 53 と 53 も同じ公約数を持つはずです。
  25. 53と53は同じ数なので処理は終わり。公約数は「53」である。

最後に一致した数値が公約数になります。 もし、最後に一致した数が1であったときは公約数が無かったということになります。

 この方法は、ユークリッド幾何学の名前で有名な古代ギリシアの数学者ユークリッド(BC330?〜BC275)により 発明され、ユークリッドの「互除法」といわれる有名な 「公約数を求める方法」 です。 上の例ではその手順通りに行ったもので、人間的ではありません。 人間がする場合、後半部分では53の整数倍を一気に引くようにします。
コンピュータと人間の違いは、「要領よく」、「巧みな判断」などに出てきます。 コンピュータは 「アホ」 ですから、余計な判断をさせるより、 「バカ正直」に単純な繰り返しをさせる方法の方が良いのです。  コンピュータは繰り返しの処理が大変得意な上に、人間と違って「退屈」、「邪魔くさい」はありません。 「やめなさい」 といわない限り真面目に根気よく単純な繰り返ししてくれます。 それに疲れを知らない上に、ミスをしません。 プログラムの上でも繰り返しの部分は1回分を書けばよいので全体の長さが短くて済みます。だから、プログラマは繰り返し処理を好んで使います。

 今回はプログラムの実例を一切示しません。処理の構造を上の例から読み取って、自分の力でプログラムを完成してください。
分数の計算全体の手順では、最初に 「通分をし」、次に 「分子の足し算」 をする。 最後に、「分子と分母が公約数を持つ場合それを約分」 して、分数計算が終了です。
以上の処理をプログラミングすればよいのです。約分以外は簡単ですから、その手順を説明する必要はないでしょう。 挑戦者の健闘を祈ります。

2004/02/13  管理人(志)


感想・意見は、掲示板、または メールでどうぞ