ユークリッドの互除法単語

7件
ユークリッドノゴジョホウ
2.0千文字の記事
  • 7
  • 0pt
掲示板へ

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

概要

大公約数をめたい2つの整数mn (どちらか一方が0以上の整数、もう一方が正の整数)とすると、以下のような手順で、mn の最大公約数をめることが出来る。

  1. n = 0の場合、m を最大公約数として終了する。n ≠ 0(すなわち n > 0)の場合、2.へ進む。
  2. m ÷ n剰余r とする。
  3. mnnr を代入する。
  4. 1.へ戻る。

剰余の代わりに減算を用いる方法もあるが、両者の間に本質的な差異は何も無い

ユークリッドの互除法は最古のアルゴリズムとしても有名だが、優れたアルゴリズムと言われる所以は手数の少なさにある。アルゴリズムを終了するのに十分な手数は、n の桁数に例するのである。具体的に言うと、n の10進桁数の5倍だけ行うまでに、結果がわかる。紀元前の時代にここまで優れたアルゴリズムが存在したことは注に値する。

728と693の最大公約数をめる。

m n r
(1) 728 693 35
(2) 693 35 28
(3) 35 28 7
(4) 28 7 0
(5) 7 0 -

よって、728と693の最大公約数は、7。

なお、m < n のとき、m ÷ n → 0 余り m であるため、mn の大小関係に関して特に制約はい。

プログラミング言語での実装例

ここではPythonでの実装例を記載する。他のプログラミング言語においても、ループ処理、再帰処理等が実装であれば大体同じようにして実装出来る。なお、引数 mn については前提条件(どちらか一方が0以上の整数、もう一方が正の整数)を必ず満たしているものとする。

ループ処理による実装例

def getGCD(m, n):
    while n != 0:
        m, n = n, m % n
    return m

再帰処理による実装例

def getGCD(m, n):
    if n == 0:
        return m
    else:
        return getGCD(n, m % n)

再帰処理及び三項演算子による実装例

def getGCD(m, n):
    return m if n == 0 else getGCD(n, m % n)

拡張ユークリッドの互除法

a,bの最大公約数をdとして、ユークリッドの互除法の逆をたどることでax+by=dとなる整数x,yを全てめることができる。これはa,bが互いに素、つまりd=1である時に特に有用。

a=728、b=693とする。

728=693+35

693=35×19+28

35=28+7

28=7×4+0

大公約数が7と分かったので逆をたどる。

7=35-28

=35-(693-35×19)=35×20-693

=(728-693)×20-693=728×20-693×21

以上より、x=20、y=-21が補の一つ。

728x+693y=7なので、728x-728×20+693y-693×(-21)=0

7(104(x-20)+99(y+21))=0

104,99は互いに素なので、kを整数として、x-20は99k、y+21は104k。

以上より、x=99k+20、y=104k-21の形で表される。

多項式のユークリッド互除法

多項式に関しても整数と同じように最大公約多項式や最小倍多項式といったものが定義できる。

例 2x9-x8-2x+1 と x4+x3-x-1 の最大公約多項式を実数係数の範囲でめる。

(2x9-x8-2x-1)=(x4+x3-x-1)(2x5-3x4+3x3-x2)+(2x3-x2-2x+1)

(x4+x3-x-1)=(2x3-x2-2x+1)(x/2+3/4)+7/4(x2-1)

(2x3-x2-2x+1)=7/4(x2-1)(8x/7-4/7)+0=(x2-1)(2x-1)+0

大公約多項式は(x2-1)=(x+1)(x-1)と分かった。
実際、2x9-x8-2x+1=(x4+1)(x2+1)(2x-1)(x+1)(x-1)、x4+x3-x-1=(x+1)(x-1)(x2+x+1)であることから確認できる。
先ほどの表と対応させると以下のようになる。

m n r
(1) 2x9-x8-2x+1 x4+x3-x-1 2x3-x2-2x+1
(2) x4+x3-x-1 2x3-x2-2x+1 x2-1
(3) 2x3-x2-2x+1 x2-1 0
(4) x2-1 0 -


一般に、ユークリッド整域と呼ばれる集合であればユークリッドの互除法が使える。整数集合と1変数の多項式の集合は共にユークリッド整域の構造を持つ。しかし、2変数以上の多項式はユークリッド整域ではないのでユークリッドの互除法を適用する事ができない。直接因数分解するより余計めんどくさいが1変数多項式に互除法を適用できるという事実が重要なのである。用の詳しい説明は環(数学)を参照。

こちらも拡ユークリッドの互除法が使えるが、係数が多く非常にめんどくさいことになる。

関連動画

高校数学の範囲での明方法である。

関連項目

【スポンサーリンク】

  • 7
  • 0pt
記事編集 編集履歴を閲覧

ニコニ広告で宣伝された記事

まちカドまぞく (単) 記事と一緒に動画もおすすめ!
提供: ゲスト
もっと見る

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

ユークリッドの互除法

2 ななしのよっしん
2008/11/07(金) 12:13:19 ID: wftDL6fIj8
最古のアルゴリズムだって事も書いた方がいいのでは。
その所為かアルゴリズムの本では最初に出てくる事が多いし。
👍
高評価
0
👎
低評価
0
3 ななしのよっしん
2010/06/12(土) 19:54:35 ID: VWRwrNm8p6
{例}

728と693の最大公倍数

ネタですよね
👍
高評価
0
👎
低評価
0
4 ななしのよっしん
2010/12/09(木) 23:07:57 ID: M1hNrt49qx
エラトステネスの篩の記事もほしいな
👍
高評価
0
👎
低評価
0
5 ななしのよっしん
2013/12/02(月) 21:21:49 ID: SckFaMGQ5w
しかし互除法の記事あるのにユークリッド先生の記事がないのは台パンものですわぁ
👍
高評価
0
👎
低評価
0
6 ななしのよっしん
2013/12/02(月) 21:34:45 ID: gIxAxwRytZ
DとCでまったく同じことやってて、どちらも同じ書き方できるのに
わざわざ違う書き方で並べるのは何の嫌がらせかとw
👍
高評価
0
👎
低評価
0
7 ななしのよっしん
2014/06/08(日) 23:18:41 ID: DR4S8nSeqy
>>1
すげー綺麗だな
引数だけ足そう
int GetGcd(int a, int b){return a<b?GetGcd(b,a):(b>0?GetGcd(b,a%b):a);}
👍
高評価
0
👎
低評価
0
8 ななしのよっしん
2016/04/03(日) 20:04:13 ID: zMqL4A08ZL
>>7
>>1が言いたいのは「aとbの大小較をする必要がい」ってことでは?
(b>0 よりも b!=0 か単に b の方が良いとは思うが)
👍
高評価
0
👎
低評価
0
9 ななしのよっしん
2016/11/10(木) 00:30:48 ID: jvIkoIKVD4
>>8
最初の一回だけ必要なんだよな。
(前提として、最初に与えられる値が a ≧ b としてるから)

まあ、実際に実装する場合はラッパー関数で最初だけ大小較するんだろうが。
👍
高評価
0
👎
低評価
0
10 ななしのよっしん
2017/10/03(火) 21:14:19 ID: zMqL4A08ZL
>>9
その前提、本当に必要?

記事の例を逆さにして、「693と728の最大公約数」をめてみよう。
0. 693 ÷ 728 → 0 あまり 693
1. 728 ÷ 693 → 1 あまり 35
2. 693 ÷ 35 → 19 あまり 28
3. 35 ÷ 28 → 1 あまり 7
4. 28 ÷ 7 → 4 あまり 0
よって、693と728の最大公約数は7。

大小較によって手順を1回だけ減らせはするけど、果たしてコードが増える苦労に見合うか…
👍
高評価
0
👎
低評価
0
11 ななしのよっしん
2019/10/12(土) 19:57:42 ID: R5MLGVvsQz
互除法の拡改造物)っていろいろあるけど
この記事の拡ユークリッド互除法は「互除法の逆行」という名前で呼んでいるpdfがあってなかなかよかった

台風ひまひま
👍
高評価
0
👎
低評価
0

ニコニコニューストピックス