k01ken’s b10g

He110 W0r1d!

Perlでユークリッドの互助法を用いる。

開発環境はWindows 7 Professional(32bit)+Perl 5.24.0。

ユークリッドの互助法とは、2つの自然数の最大公約数を求めるアルゴリズムです。

aとbの2つの自然数があって(a≧b)、aをbで割り、出現した余りをxとします。今度は、bをxで割り、出現した余りをx´とします。そして、今度は、xをx´で割り、出現した余りをx´´とします。これを、2つの数が割り切れるまで繰り返して、その時の「わる数」の部分が2つの自然数の最大公約数となります。

use strict;
use warnings;

my $a = 42;
my $b = 30;

print(ea($a,$b));


sub ea{
	my ($a,$b) = @_;

	my $dummy = 0;

    # $bの方が数値が大きい場合は入れ替える
	if($a < $b){
		$dummy = $b;
		$b = $a;
		$a = $dummy;
	}

		while($a % $b != 0){
			$dummy = $a % $b;
			$a = $b;
			$b = $dummy;
		}

	return $b;
}

上記の場合、42と30の最大公約数は6なので、結果は6と表示されます。最初、returnするのを$aと書いていたので、12が表示されて、おかしいな?と思い、$bをreturnすると6と表示されたので、こっちかと修正しました。

もし、同じ自然数だった場合は、その数が最大公約数となります。例えば、42同士だったら、42が最大公約数です。