第一章初等整數論 §2最大公約數,最小公倍數(中編2)

前回は,2つの正の数の積は,その正の最小公倍数と,最大公約数の積であること[定理1.5]と, a,bが互いに素で bc aの倍数ならば, c aの倍数であること[定理1.6]を証明しました.

 

今回は,実際に最小公倍数と最大公約数を求める方法についてです.

實際ニ,與ヘラレタル(正ノ)整數ノ最大公約數,又ハ最小公倍數ヲ求メル方法ハ周知デアルガ,コノ際,念ノ爲ニソノ理論的ノ根據ヲ叩イテオクノモ無用デハアルマイ.

最大公約数を求めるには,ユークリッドの互除法を用いるか,2つ以上の整数を素因数分解して指数部分の最小値を見ていくかすればよいです.

最大公約数の筆算(すだれ算)というのもあります.例えば, 12,24,48の最大公約数は次のように共通の約数でどんどん割っていって,割れなくなったら 3\times 2\times 2とするものです.これも,どうやら素因数分解の一意性を根拠にしているようです.

2つの数の最大公約数が分かれば,定理1.5から最小公倍数を求めることができます.

 

[問題1]  (a,b)=(a-qb,b)

 a,bの最大公約数は, a-qb,bの最大公約数に等しい,という有名な定理です.

 

[解]  m a,bノ最大公約數トスレバ, m a-qbノ約數,従テ a-qb,bノ公約數,従テ (a-qb,b)ノ約數デアル.(定理1.4)

定理1.1*1より, a-qb mの倍数となります.よって m a-qb,bの公約数です.定理1.4*2より,これは a-qb,bの最大公約数の約数です.

 

 a-qb=a'トスレバ, a=a'+qbデアルカラ,同樣ニ (a',b) (a,b)の約數デアル.

 m' a',bの最大公約数とすれば, m' a'+qbの約数なので, a'+qb,bの公約数です.よって (a,b)の約数です.

 

コノヤウニ (a,b) (a',b)トハ各ガ他ノ約數デアルカラ,相等シイ.

「各」は「おのおの」の意味です.これで (a,b)=(a',b)がめでたく証明できました.

手元の学習参考書には,最後の部分は「 m\leqq m'かつ m'\leqq mなので, m=m'である」とあります.これもいいですね.

 

特ニ a bデ割ツタ剰餘ヲ cトスレバ, (a,b)=(b,c)

剰余には,最小正剰余*3と,絶対的最小剰余というものがありました.どちらの定義でも a=bq+cが成り立つので, (a,b)=(b,c)が成立します.

 

 b cデ割ツタ剰餘ヲ dトスレバ, (b,c)=(c,d)

 d=b-qcとなる qが存在するので,確かにそうです.

 

コノヤウニ進ンデ行ケバ a\gt b\gt c\gt d\gt....デアルカラ竟ニハ剰餘ガ 0ニナル.

 a,bが非負整数で, a\geqq bのとき,非負整数列 \{a_n\}を次のように定めます.ただし, a\neq 0とします.

  •  a_0=a,a_1=b
  •  a_n 0でないとき, a_{n+1} a_{n-1}=qa_n+a_{n+1},~0\leqq a_{n+1}\lt a_nを満たす唯一の整数
  •  a_n 0のとき, a_{n+1}以降は定義しない

このとき a_n\gt 0ならば 0\leqq a_{n+1}\lt a_nが成り立つので,確かに a_1\gt a_2\gt \dotsとなり,数列 \{a_n\}\ (n\geqq 1)は狭義単調減少です.また非負整数列でもあるので,添え字が b増加するまでには,つまり n\leqq b+1の範囲には a_n=0となる nが存在します.

 

 c dデ割リ切レルトスレバ, (c,d)=(d,0)=d即チ d=(a,b).

 0でない任意の整数は 0の約数なので, a_n=0のとき, a_{n-1}が最大公約数になります.

 

コレガユウクリッドノ互除法デアル.

pythonで書いてみると次のようになります. a,b a\geqq b\geqq 0を満たす整数で, a\neq 0とします.

def func(a,b):
    if b==0:
        return a
    else:
        return func(b,a%b)

mathモジュールをインポートしてから

math.gcd(a,b)

でも十分です*4

 a\gt b\gt 0のとき,整除を何回すればよいかについて考えてみます.最悪なケースは余りがなかなか小さくなっていかないとき,つまり商が常に1のときでしょう.例えば (21,13)のときは, (21,13)=(13,8)=(8,5)=(5,3)=(3,2)=(2,1)=(1,0)=1のように 6回の整除をする必要があります.これは (22,13)=(13,9)=(9,4)=(4,1)=(1,0)=1 4回よりも多いですね.

 f_0=1,f_1=1,f_{n+2}=f_{n+1}+f_n\ (n\geqq 0)

で定まる数列 \{f_n\}を定義して, a_n=0となる n\ (n\geqq 2) Nとおきます. 2\leqq n\leqq Nのとき a_{n-2}\gt a_{n-1}より a_{n-2} a_{n-1}で割った商は 1以上なので,

 a_{n-2}\geqq a_{n-1}+a_n

です. a_N=0なので, f_{n+2}=f_{n+1}+f_nと合わせて帰納的に考えると, 1以上 N以下のすべての nについて

 a_{N-n}\geqq f_n

が成り立ちます. n=Nとすると a\geqq f_Nが得られます.

つまり N-1回目の整除でユークリッドの互除法が終わるとしたら a\geqq f_Nであるということです.数列 \{f_n\}に現れる整数であって, a以下の最大のものを f_mとすれば, N\leqq mが成り立ちます. m\geqq 1のとき,

 f_m\geqq\left(\dfrac 32\right)^{m-1}

であることが数学的帰納法によって分かるので, m\leqq 1+\log_{\frac 32}aです. \lfloor\log_{\frac 32}a\rfloor回以内の整除で,ユークリッドの互除法が終わると言えるでしょう.

*1: a_1,a_2,...,a_n bの倍数ならば, x_1a_1+x_2a_2+\dots+x_nb_n bの倍数である.

*2: a,bの任意の公約数は, a,bの最大公約数の約数である.

*3:ここでは 0も含めていると思われる.

*4: a=b=0のときはエラーを吐かず, 0が返ってくる.