ユークリッドの互除法を使って2つの整数の最大公約数を求める

2つの整数m、n(m > n)をユークリッドの互除法を使って、mとnの最大公約数を求めます。
減算を使った場合のアルゴリズムは次のようになります。

1.mとnが等しくないあいだは次を繰り返す
2.m > nの場合 m = m - n
 それ以外    n = n - m
3.m(もしくはn)が求める最大公約数となる

これをJavaで書くと次のように書くことができます。

public class Euclid {
	public static void main(String[] args){
		try{
			int m = Integer.parseInt(args[0]);
			int n = Integer.parseInt(args[1]);
			int count = 0;
			
			while(m != n){
				if(m > n){
					m = m - n;
				}else{
					n = n - m;
				}
				count++;
			}
			System.out.println("最大公約数:" + m + ", 計算回数:" + count);			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

ただし、上記のように減算を使った場合、mとnの差が大きいときは計算効率が悪くなる問題が考えられます。
効率を上げるには剰余を使います。剰余を用いたアルゴリズムは次のようになります。

1.mをnで割った余りをkとする
2.mにnを、nにkを入れる
3.kが0でなければ1.に戻る
4.mが求める最大公約数となる

public class Euclid {
	public static void main(String[] args){
		try{
			int m = Integer.parseInt(args[0]);
			int n = Integer.parseInt(args[1]);
			int count =0, k = 0;
			do{
				k = m % n;
				m = n;
				n = k;
				count++;
			}while(k != 0);			
			
			System.out.println("最大公約数:" + m + ", 計算回数:" + count);			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

例として、引数に1071、81を渡して実行すると、計算効率の違いが分かると思います。


減算の場合

最大公約数:9, 計算回数:18

剰余の場合

最大公約数:9, 計算回数:3