パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
ABC予想をやってみる
(準備中)
ABC予想とは、
自然数a,b,cにおいて a + b = c, a < b を満たし、aとbが互いに素である時に、
任意のε>0 に対して
c > rad(abc)1+ε
を満たす自然数の組(a,b,c)は高々有限個しかないという予想。
radは根基(radical)のこと。
根基とは、自然数nの互いに異なる素因数の積のことであり、rad(n)と書く。
言葉で書くと少々わかりにくいので実例をあげる。
rad(8)=rad(2*2*2)=2
rad(10)=rad(2*5)=2*5=10
rad(36)=rad(2*2*3*3)=2*3=6
rad(45)=rad(3*3*5)=3*5=15
rad(90)=rad(2*3*3*5)=2*3*5=30
ちなみにaとbが互いに素であるならば、cもa,bと素であり、
a,b,cはそれぞれ互いに素になります。
これは「整数の問題2」の中で説明がありますのでご参照下さい。
試しに、いくつかの(a,b,c)の組でCとrad(abc)を比較してみます。
(a,b,c)=(1,2,3) 3 < rad(1*2*3)=6
(a,b,c)=(2,3,5) 5 < rad(2*3*5)=30
(a,b,c)=(3,4,7) 7 <rad(3*2*2*7) =3*2*7=42
なんとなく、ほとんどのケースでrad(abc)の方が大きくなりそうです。
ABC予想は1985年にジョゼフ・オステルレとデイヴィッド・マッサーにより提唱され、京都大学の望月新一教授による
宇宙際タイヒミューラー理論というすごい理論により証明されたと言われているが、いまだに議論は続いている。
ABC予想が正しければ、数論の多くの予想や定理が導けるそうで、いまだに解決していない予想も解決できるそう
なので、これはどえらいことです。
ここでは、ABC予想の証明の説明などはもちろん全くやりません。
EXCELに c > rad(abc)1+ε となる(a,b,c)の組を見つけさせてみるということをやってみます。
1.素因数分解する
まず、自然数を素因数分解してみます。
A列に正の自然数。B列以降は素因数分解した結果です。
VBAのコード
1〜3は直接セルに書き込んで、4以降をForループで素因数分解しています。
If Cells(j, 3) = "" Then p = Cells(j, 2).Value: m = x Mod p Else GoTo L1
という行が肝で、ある自然数が素数の場合は素因数はB列のみでC列以降は空のセルになります。
cells(j,3)="" でj行の自然数が素数かどうかを判断しています。
素数であれば、その数を使って素因数分解を試みます。
p = Cells(j, 2).Value: m = x Mod p
でmが0であれば割り切れる=その数(p)を素数に持つということになります。
p = Cells(j, 2).Value というのは、今回のケースでは冗長なコードで、ここはp=j で構いません。
Sub prime_factor()
Cells(1, 1) = 1: Cells(1, 2) = 1
Cells(2, 1) = 2: Cells(2, 2) = 2
Cells(3, 1) = 3: Cells(3, 2) = 3
For i = 4 To 10000
Cells(i, 1) = i
x = i
k = 2
For j = 2 To i - 1
If Cells(j, 3) = "" Then p = Cells(j, 2).Value: m = x Mod p Else
GoTo L1
While (m = 0)
Cells(i, k) = p
x = x / p
k = k + 1
m = x Mod p
Wend
L1:
Next j
If Cells(i, 2) = "" Then Cells(i, 2) = i
Next i
End Sub
2. 互いに素な数を求める
互いに素の自然数の組み合わせをP列、Q列に求めます。
互いに素である自然数の組を求めるにはユークリッド互除法を使っています。
ユークリッド互除法で最大公約数が1になる自然数の組み合わせを探しています。
※ユークリッド互除法に関しては「最大公約数を求める(ユークリッド互除法)」をご参照下さい。
Cによるユークリッド互除法で最大公約数を求めるプログラムは「再帰呼び出しのショートプログラム」に
あります。再帰呼び出しを使う方法とwhileループでやる方法とがありますが、今回はここではwhileループで
やる方法を採用しています。
@のif文にあるrad(k)で、radを求めるプロシージャをッコールしています。
radを求めるプロシージャは「3.radを求める」を見てください。
k = 1
For i = 1 To 100
For j = i + 1 To 100
m = j Mod i
x = i
While (m <> 0)
n = m
m = x Mod n
x = n
Wend
If x = 1 Then radx(k) = i: rady(k) = j: Cells(k, 16) = radx(k): Cells(k,
17) = rady(k): rad (k): k = k + 1 ' @
Next j
Next i
3.radを求める
R列以降にabcのradを求めていきます。
radを求めるプロシージャ
Sub rad(k As Integer)
x = Cells(k, 16): y = Cells(k, 17)
i = 1: j = 1
v = Cells(x, 2)
Cells(k, 18) = v
While (Cells(x, 2 + i) <> "")
If Cells(x, 2 + i) <> v Then v = Cells(x, 2 + i): Cells(k, 18 + j) = v: j = j + 1
i = i + 1
Wend
i = 0
While (Cells(y, 2 + i) <> "")
If Cells(y, 2 + i) <> v Then v = Cells(y, 2 + i): Cells(k, 18 + j) = v: j = j + 1
i = i + 1
Wend
i = 0
Z = x + y
While (Cells(Z, 2 + i) <> "")
f = 0
For h = 0 To j - 1
If Cells(Z, 2 + i) = Cells(k, 18 + h) Then f = 1
Next h
If f = 0 Then Cells(k, 18 + j) = Cells(Z, 2 + i): j = j + 1
i = i + 1
Wend
End Sub
4. ABC予想をしてみる
c > rad(abc)1+ε
になる自然数の組、a,b,cを探していきます。
AB列が c=a+b
AC列が rad(abc)
AD列が rad(abc)1.1
の結果です。
c > rad(abc)1+ε
の場合は赤字で表示しています。
For i = 1 To k
Cells(i, 28) = Cells(i, 16) + Cells(i, 17)
radm = Cells(i, 18): j = 1
While (Cells(i, 18 + j) <> "")
radm = radm * Cells(i, 18 + j).Value
j = j + 1
Wend
Cells(i, 29) = radm
Cells(i, 30) = radm ^ 1.1
If Cells(i, 28) > Cells(i, 29) Then Cells(i, 29).Font.Color = RGB(255, 0, 0)
If Cells(i, 28) > Cells(i, 30) Then Cells(i, 30).Font.Color = RGB(255, 0, 0)
Next i
1〜100までの自然数の組み合わせ5000個のなかで、互いに素の組み合わせは案外多くて
3043個(組)もあります。
そのうちc>rad(abc) を満たすのは(1,8) (1,48) (1,63) (1,80) (5,27) (32,49)
の6組
c> rad(abc)1.1を満たすのは (1,8) (1,63) (1,80) (32,49)の4組
この結果からみると、
c > rad(abc)1+ε
を満たす自然数の組(a,b,c)はかなり限定的と言えそうではあります。
ただし、ε=0の時、すなわち c>rad(abc) を満たす自然数の組(a,b,c)は無限にあることが証明されています。
例えば、a=0, b=26n-1, c=26n という組み合わせは、c>rad(abc) となることが証明されています。
★ABC予想関連のページ
ABC予想をやってみる 〜 数学のBlog
整数の問題3
★ワンポイント英語
ABC予想は英語では abc conjecture と呼ばれます
con 共に + ject 投げる -> 推測する
guessが単純なことの推測に用いるのに対し、conjectureは複雑なことの推論に使います。
I cannot conjecture what his plans are. 彼の計画がどうあんおか推測できない。
語幹の -jac, -jact, -ject はラテン語のjacere(投げる)に由来します。
語幹にjjac, jact, ectを持つ単語は沢山あります。
jet 噴出する。 ject(投げる)の語幹そのままです。
deject 落胆させる de 下へ + ject 投げる
inject 注入する in 中へ + ject 投げる
object 反対する、(名)目的,対象 ob 反対に、のほうへ + ject 投げる
subject 下に置く、(名)主題、臣下 sub 下に + ject 投げる
project 計画する pro 前に + ject 投げる
reject 拒絶する re 後ろに + ject 投げる