ユークリッド互除法
2つの整数の最大公約数(Greatest Common Divisor, GCD)
a, bを2つの自然数とする。aとbの最大公約数をGCD(a,b)と表す。すると次の公式が成り立つ。a>bならば
GCD(a,b) = GCD(a-b, b)
これを証明するのは簡単だ。
xがaとbの公約数だとしよう。 つまりa,bの両方をxが割り切るのだ。 このときa-bもxで割り切れてしまう。xはa-bとbを割り切るのだからa-bとbの公約数だ。 aとbの公約数はa-bとbの公約数でもある。
逆にxがa-bとbの公約数だしよう。 つまりa-b,bの両方をxが割り切る。 このときa=(a-b)+bもxで割り切れてしまう。 xはaとbを割り切るのだから aとbの公約数だ。 a-bとbの公約数はaとbの公約数でもある。 以上まとめると、a,bの公約数の集合とa-b,bの公約数の集合は一致することが分かる。 したがって、最大の公約数も当然一致する。 これで証明終わり。
応用してみよう。
GCD(120,45) = GCD(120-45,45) = GCD(75,45) = GCD(75-45, 45) = GCD(35, 45)
随分簡単になることが分かる。このプロセスをよくよく観察すると
GCD(a,b) = GCD(a%b, b)
という公式が成り立つことが分かる。aからbを引く操作を繰り返すと最後はa%bが残るからだ。また、
GCD(a,b) = GCD(b,a)
であるのは自明だから、先の計算は以下のように続けられる。
GCD(35,45) = GCD(45,35) = GCD(45%35, 35) = GCD(10, 35) = GCD(35, 10) = GCD(35%10, 10) = GCD(5, 10) = 5
この方法はユークリッドの互除法と呼ばれている。素因数分解を使った方法に比べて計算量が著しく少なくなることが分かっている。証明は簡単だが、技術的な準備
が必要なので、アルゴリズムの教科書を参照して欲しい。
互除法
擬似コードで互除法のアルゴリズムを記述すると以下のようになる。
GCD(a,b) もし a=0 ならば return b そうでないならば return GCD(b%a,a)
このプロセスは必ず終わる。なぜならa>b%aが成り立つから、再帰呼び出しの第1引数は単調に減少し、0になって計算が停止する。
既約分数
a,bを自然数とするとき分数a/bを考える。aとbの最大公約数をdとすると
a = x*d b = y*d
となる自然数x,yがあるはずで約分により
a/b=x/y
となる。x/yは既約分数と呼ばれる。