1 / 17

最大公約数とユークリッドの互除法

情報数学1 第 1-2 章. 最大公約数とユークリッドの互除法. 香川大学工学部 富永浩之 tominaga@eng.kagawa-u.ac.jp. 概 要. ■ 最大公約数の性質 整除関係 互いに素 公約数 公倍数 GCD LCM ■ ユークリッドの互除法の漸化式と計算過程 gcd(a,b) 初期条件 漸化式 ■ 互除法の剰余列とアルゴリズム 剰余列 機械性と停止性 手続と算法 ■ 互除法の効率性と最小剰余による改良 最小剰余 ■ 互除法の図形的意味とブレントの算法 二コマコスの算法 ブレントの算法.

ricky
Download Presentation

最大公約数とユークリッドの互除法

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 情報数学1 第1-2章 最大公約数とユークリッドの互除法 香川大学工学部 富永浩之 tominaga@eng.kagawa-u.ac.jp

  2. 概 要 • ■ 最大公約数の性質 • 整除関係 互いに素 公約数 公倍数 GCD LCM • ■ ユークリッドの互除法の漸化式と計算過程 • gcd(a,b) 初期条件 漸化式 • ■ 互除法の剰余列とアルゴリズム • 剰余列 機械性と停止性 手続と算法 • ■ 互除法の効率性と最小剰余による改良 • 最小剰余 • ■ 互除法の図形的意味とブレントの算法 • 二コマコスの算法 ブレントの算法

  3. 第01節 [1] 公約数と公倍数 • 6の約数±1, ±2, ±3, ±61は全ての約数 • 6の倍数0, ±6, ±12, ±18, ‥0は全ての倍数 • 12と18の公約数1, 2, 3, 6 • 10と15の公倍数0, 30, 60, 90, ‥ • 最大公約数GCD[Greatest Common Divisor] • gcd(a,b)gcd(12,18)=6 • 最小公倍数LCM [Least Common Multiple] • lcm(a,b)lcm(10,15)=30 • ・ 約数と倍数は符号付で考えることがある • ・ 公約数の約数は公約数、公倍数の倍数は公倍数

  4. 第01節 [2] 整除関係と互いに素 • 整除関係a|bbがaで割り切れる • aがbの約数、bがaの倍数 • 整除系列a≪b整除関係を順序として表記 • 1≪3≪6≪12≪0 • 互いに素a⊥b aとbのGCDが1 • 整数の性質を調べる上での基本の場合 • 余因数a,bに対し、GCDで割った整商 • gcd(a,b)=d とおくと a’=a/d, b’=b/d • a=a’d, b=b’d かつ a’⊥b’ • 整数の様々な性質の証明に用いる

  5. 第02節 [1] 最大公約数の性質 • <1> gcd(a,b) = gcd(b,a) 交換律 • <2> gcd(-a,b) = gcd(a,b) 符号無視 • <3> gcd(a,1) = 11は全ての約数 • <4> gcd(a,0) = a0は全ての倍数 (a>0) • <5> gcd(ka,kb) = k×gcd(a,b) 共通因数の括出し (k>0) • <5>’ gcd(ab,b) = b 整除関係 (b>0) • <6> gcd(a,b) = gcd(a-b,b) 差への還元 • <6>’ gcd(a,b) = gcd(a%b,b) 剰余への還元 (b≠0) <5>gcd(42,30)=gcd(6×7,6×5)=6×gcd(7,5)=6×1=6 <6> gcd(42,15)=gcd(27,15)=gcd(12,15) =gcd(15,12)=gcd(3,12)=3

  6. 第02節 [2] 目の子の筆算によるGCDの計算 2 | 84 60 2 | 42 30 3 | 21 15 ーーーーーー ×75 12 ⊥ • gcd(84,60) • = gcd(42,30)×2 • = gcd(21,15)×2×2 • = gcd( 7, 5)×3×2×2 • = 1×3×2×2 • = 12 ・ GCDの性質<5> 共通因数の括出し を利用している ・ 筆算は、式変形の本質的な部分のみを抜き出している ・ 目の子(人間の直感)で、共通因数を見つけている ・ 小さい数には有効だが、大きい数には歯が立たない ・ 機械的な処理手順ではないので、プログラムとして書けない ・ 全ての数で順に割り切れるか調べる方法は、効率が非常に悪い

  7. 第03節 [1] 最小公倍数の性質 • <1> a⊥b のとき lcm(a,b) = a×b • <2> 余因数の括出し lcm(a,b) = a’×b’×gcd(a,b) • <3> 共通因数の括出し lcm(ka,kb) = k×lcm(a,b) • <4> 積の公式 a×b = gcd(a,b)×lcm(a,b)

  8. 第04節 [1] ユークリッドの互除法の定義 • 漸化式による、効率的なGCDの計算 • 古代ギリシャの数学者ユークリッドが発見(?) • 世界最古の算法(アルゴリズム)‥機械的な計算手順 gcd(a,b) = { a ; b=0 { gcd(b,a%b) ; else gcd(51,36)=gcd(36,15)=gcd(15,6)=gcd(6,3)=gcd(3,0)=3 gcd(3,5)=gcd(5,3)=gcd(3,2)=gcd(2,1)=gcd(1,0)=1 初期条件 性質<4>gcd(a,0)=a より 漸化式 性質<6>’gcd(a,b)=gcd(a%b,b)より 性質<1>gcd(a%b,b)=gcd(b,a%b) より

  9. 第06節 [1] 互除法の図形的意味 gcd(8,6)=2 lcm(3,2)=6 8×6の長方形を覆う、 最大の正方形のタイルは 2×2⇒ GCD 3×2のタイルを並べて、 覆える最小の正方形は 6×6 ⇒ LCM 長方形から最大サイズ (短辺)の正方形を 取れるだけ除く⇒ <6>’ 縦横を置き換えて、 同様に繰り返す ⇒ <4> 残余がなくなれば、 そのサイズがGCD ⇒ <1> gcd(17,7)=gcd(7,3)=gcd(3,1)=1

  10. 第04節 [2] ユークリッドの互除法の計算過程 • k a b q r • ------------------------------ • 0 48 ÷34 = 1 ‥14 gcd(48,34) • 1 34 ÷14 = 2 ‥6= gcd(34,14) • 2 14 ÷6 = 2 ‥2= gcd(14, 6) • 3 6 ÷2 = 3 ‥0= gcd( 6, 2) • 4 20= gcd( 2, 0) • ------------------------------ • 4回の再帰呼出= 2

  11. 第05節 [1] 互除法の剰余列 計算 gcd(48,34)=gcd(34,14)=gcd(14,6)=gcd(6,2)=gcd(2,0)=2 剰余列 48, 34, 14, 6, 2, 0 0で終わる有限の数列 34, 48, 34, 14, 6, 2, 0 a<b のときは b, a と入替え

  12. 第05節 [2] 互除法の剰余列の漸化式 gcd(a,b) の計算における剰余列 N(k) の定義 初期条件 N(0) = a, N(1) = b; 与数 漸化式 N(k) = N(k-2) % N(k-1) ; k≧2,N(k-1)>0 終了条件 N(p+1) = 0; 列長 p+2 剰余条件より 狭義単調減少 N(1)>N(2)>‥>N(p)>N(p+1)=0 GCDの性質より gcd(a,b)=gcd(N(k),N(k+1))=N(p) while ( b != 0 ) { t = b; b = a%b; a = t; } n[0] = a; n[1] = b; k = 1; while ( n[k] != 0 ) { k++; n[k] = n[k-2] % n[k-1]; }

  13. 第05節 [2] アルゴリズムの条件 • ● 機械性 ‥ 手続[procedure] • ・ 個々の処理が厳密に定義されていて、機械的に実行できる • ・ 同じ入力に対し、いつ誰が計算しても、同じ出力となる • ● 停止性 ‥ 算法[algorithm] • ・ 有限な入力に対し、有限回のうちに手順が必ず終了する ・ 真の乱数は、アルゴリズムでは作れない(疑似乱数) ・ 機械的であるが止まらない手続が存在する(無限ループ) ・ 止まるか止まらないか未だに分からない手続きも存在する ■ 互除法がアルゴリズムであること ○ 機械性 数学的な漸化式で定義されている ○ 停止性 剰余列が狭義単調減少で必ず0で終了する

  14. 第06節 [2] 最小剰余による効率化 • ● 互除法の計算回数の最悪ケース • 整商が1しか立たず、大きな剰余が残ると、計算が進まない • すなわち、 N(k)=N(k-1)%N(k-2)=N(k-1)-N(k-2)のとき • これは、フィボナッチ数列を逆順にした数列 • ● 互除法の漸化式を効率化 • 剰余列の次項を最小剰余で考え、性質<2>より符号無視 • 正剰余で次項が除数の1/2超のとき、最小剰余では1つ飛越し • 正 13, 8, 5, 3, 2, 1, 04回 13 ÷8 = 1 ‥+5 • 最小 13, 8, 3, 1, 02回 13 ÷ 8 = 2 ‥ -3 • 【例題】621, 323, (298), 25, (23), 2, 1, 0

  15. 第07節 [1] ニコマコスの算法 • ● ニコマコスの算法 • ・ ユークリッドの互除法より以前に用いられた算法 • ・ a>b のとき gcd(a,b)=gcd(b, a-b) とする • ・ 負荷の高い除算の代わりに、減算を使った漸化式を考える • ・ a,bの桁数が異なると、大量の減算が必要となり、効率的でない • ・ 除算の実装は、実際には二進数の減算の繰返しなので、 • うまく改良できれば効率化できるかも ● ブレントの算法 ・ 二進数同士のGCDを高速に行う算法 ・ 2で割る(最下位桁の0を取り除く)ことと減算だけを使う ・ gcd(a,b)=gcd(a',b')×2↑eとし、奇数となる gcd(a',b') に着目

  16. 第07節 [2] ブレントの算法 • ・ 事前処理として、下位桁の共通の0を取り除く(2↑eで割る) • ・ さらに一方のみの0も取り除く(2は共通因数にならないので無視) • ・ 大きい方から小さい方を引く(ニコマコスの算法) • ・ 差が0(両者が一致)になれば、直前の値がGCD'になっている • ・ 上位桁というより下位桁から減らしていく方法 • ・ 1回の減算で必ず1桁以上が減るので、log2(a) の計算量となる • ・ 負荷の高い除算を使わないので、ビットレベルの実装を工夫すれば、 • ユークリッドの互除法よりも高速 164 10101000[2] ⇒ 101010⇒ 10101 ⇒ 10101 ⇒ 10101 ⇒ 10010 ⇒ 1001 ⇒ 110 ⇒ 11 二進数 前処理 移動 減算 移動 減算 移動 一致 004×3 = 12 二進数 前処理 減算 移動 一致 10000100[2] ⇒ 100001 ⇒100001⇒ 1100⇒ 11 ⇒ 11 ⇒ 11 ⇒ 11 ⇒ 11 132

  17. 第00節 [1] ユークリッドの不定方程式 • ユークリッドの一次不定方程式 23x-10y=-2 を満たす具体解を1つ求めよ。 • 整除演算 23÷10=2‥3 より、 23x-10y=10(2x-y)+3x と式変形し、 • z=2x-y とおいて変数変換を行い、小さな係数の方程式 10z+3x=-2 に帰着させる。 • ユークリッドの互除法のように、 この操作を続け、一方の係数が1となる自明な方程式の • 具体解(他方の解は0)を求める。変数変換を逆算しながら、各変数を求めていく。 • 整除演算 [ ] より、 [ ] と式変形し、 • [ ] とおいて変数変換を行い、小さな係数の方程式 [ ] に帰着させる。 • ここで、 zの係数が1となり、自明な具体解 w= [ ], z= [ ] を得る。 • 変数変換の式を逆算し、 x= [ ], y=2x-z から、 • 具体解 x= [ ], y= [ ] を得る。 • 与式を図形の方程式とみると、具体解は、直線 L : 23x-10y=-2 上の • 格子点(XY座標がともに整数の点)になっている。 • 直線の傾きを考えると、xが10増えれば、yは23増えるという関係になっている。 • よって、他の具体解として、 x= [ ], y=[ ] や、 x= [ ], y= [ ] が挙げられる。

More Related