パソコン活用研究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 投げる

TopPage > Visual BasIc&EXCEL活用研究目次