前回は,2つの整数のユークリッドの互除法を証明しました.
の最大公約数をとするとき,が成り立ちます.
これを何度も使うことによって,最大公約数を求めることができます.
の最大公約数が分かれば最小公倍数はによって求めることができます(が非負整数の場合).
今回は,3つ以上の整数の最大公約数について考えます.
三ツ以上ノ整數ノ最大公約數ヲ求メルニモ互助法ヲ應用スルコトガデキル.
は12番目のアルファベットなので,これだと12個の整数という意味に思えます.有限個ということを強調したのでしょうか.ともかく,を2以上の整数として,1以上の整数の組の意味だと考えることにします.
今コレラノ數ノ中ガ最モ小サイトキハ,デヲ割ツテ剰餘ヲトスル.然ラバ問題1ト同樣ニ
うーん.として,この中の最小値はであるとしてよいです.
整除の原理より,なるすべてのについて,となるが唯一つ存在します.このとき,
として,を示せばよいです.
はの倍数なので,はの倍数です.よってはの公約数なので,はの約数であり,であることが分かります.
また,はの倍数なので,はの倍数です.よってはの公倍数なので,はの約数であり,であることが分かります.
以上より,です.
剰餘ノ中ニガアレバソレヲノ中カラ省イテヨイ.
の約数は以外の任意の整数なので,と,の以外の整数のみの最大公約数は,一致するはずです.
サテニ同樣ノ操作ヲ行フ.
同様の操作というのは,このうちの最小値をとして,それ以外の剰余をとるということです.
ソノトキ除數ニスル最小數ハノ中デ,ソレハヨリモ小デアル.
はで割ったときの余りだったので,より小さいです.
コノ操作ヲ繼續スレバ,毎回( )内ノ最大數ガ減少スルカラ,次第ニ剰餘0ガ出テ來テ,竟ニハ括弧内ニ唯一ツノ數ガ殘ル.
この操作を継続して行うと,割る数がだんだん小さくなっていく,ということでしょうね.の最小値をとすれば,回以内の操作で唯一の数が残ることでしょう.
ソレガ即チデアル.
pythonでは次のようになるでしょうか.Aは自然数を要素に持つ配列です.
def func(A):
m=min(A)
R=[a%m for a in A]+[m]
F=list(filter(None,R))
if len(F)==1:
return F[0]
else:
return func(F)
剰餘ハ絶對的最小剰餘ヲ取ルガヨイ.
ムムム,普通の剰余ではなく絶対的最小剰余なんですね.
絶対的最小剰余とは,次のようなものでした.
整数と自然数について,
となる整数が存在する.このを絶対的最小剰余という.
がの奇数倍であるときはは2組考えられますが,どちらにせよです.
普通の剰余に比べて,絶対的最小剰余を採用すると,割る数が急速に小さくなっていきます.例えばとの最大公約数を求めるとき,普通の剰余を用いると
のように回の整除が必要ですが,絶対的最小剰余なら
のように回で済みます.
先程の剰余をとるところを,絶対的最小剰余をとるように変更すれば,次のようになるでしょうか.
def func(A):
m=min(A)
R=[min(a%m,m-a%m) for a in A]+[m]
F=list(filter(None,R))
if len(F)==1:
return F[0]
else:
return func(F)
[例] .
絶対的最小剰余の絶対値は,割る数の半分以下になるのがよいですね.
[問題2.] 三ツ以上ノ整數ノ最小公倍數ヲ求メルトキ,ソレラノ整數ノ一部分ヲソノ最小公倍數デ置キ換エテヨイ.例ヘバノ最小公倍數ハ,ノ最小公倍數トノ最小公倍數ニ等シイ.
当たり前に使っているような気がします.の最小公倍数を求めるとき,の最小公倍数はなので,の最小公倍数を求めればよい,と考えるようなことですね.
[解] ノ最小公倍數ヲトシ,ノ最小公倍數ヲトスレバ,はノ公倍數デアルカラ,ノ倍數デアル(定理1.3).
個()の自然数の組の最小公倍数をとし,をの最小公倍数とし,の最小公倍数をとします.
はに共通する倍数のうち最小のものなので,の公倍数です.定理1.3は「2つ以上の整数の公倍数は,最小公倍数の倍数である」というものでしたから,これを適用してはの倍数です.
ハ固ヨリノ倍數デアルカラハノ公倍數,從テノ倍數デアル.
「固より」は「もとより」と読み,「もともと」「いうまでもなく」のような意味です.
は結局の倍数ということが分かり,これらの公倍数です.再び定理1.3を用いれば,はの倍数であることが分かります.
又ハノ倍數,從テ,ノ倍數,従テノ公倍數,從テノ倍數デアル.
定義を使っているだけですね.最後はみたび定理1.3を使っています.
コノヤウニハノ倍數,ハノ倍數デアルカラ.
であり,であるから,です.この証明法,何度目か分かりませんがよく出てくる気がします.
二ツノ整數ノ最小公倍數ハ定理1.5ニ由テ最大公約數カラ求メラレル.
定理1.5とは,の最小公倍数を,最大公約数をとするとき,であるという定理です.
由テ上記問題ノ定理ヲ應用シテ任意數ノ整數ノ最小公倍數ガ求メラレル.
の最小公倍数を求めたいとします.
の最大公約数をユークリッドの互除法で求めると,最小公倍数はです.このとき,の最大公約数はとなります.これで,個の数の最大公約数を求める問題から,個の数の最大公約数を求める問題になりました.
これを何度も使えば,最小公倍数を求めることができます.pythonでは,次のように書けるでしょう.Aは自然数からなる配列です.
def gcd(a,b):
if b==0:
return a
else:
return gcd(b,a%b) def lcm(A):
ans=1
for a in A:
ans=ans*a//gcd(ans,a)
return ans
3つの自然数の組の最小公倍数を,最大公約数をとするとき,は必ずしも成り立たないことに注意します*1.
*1:例えば,の最大公約数はで,最小公倍数は.