読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

(2) 完全数が持つ性質から大きな完全数を探してみる。

前回の結果を再掲載します。


2進数や16進数に馴染みがあると、ピンと来るかもしれません。上の素因数分解のところは、以下のように書き直せます。


完全数はすべての形をしています。実際、Ευκλείδης(ユークリッド)が2300年以上前に以下の定理を証明しています。

もし素数なら、完全数である。

証明:
の約数は、

これらはの約数。
素数だから、の残りの約数は、の約数にを掛けたもの。ただし、約数の中に自身も含みます。
だから、の約数は、
約数すべてを足し合わせると、
自身を含む約数の和が自身の2倍になっていますから、完全数


はMersenne数、その中の素数はMersenne素数と呼ばれています。では、Mersenne素数Maximaで探してみましょう。

for k : 1 thru 1000 do if primep(2^k-1) then print("k=", k, "2^k-1=", 2^k-1)$


素数なので、私たちは完全数であるということができます。Eulerはk=31の場合を知っていたそうです。コンピュータを使ってEulerを越えることができました!


ページの頭に戻ってみると、求めた4つの完全数はすべて、Mersenne素数3, 7, 31, 127から構成されるものであることが確認できます。では完全数はすべてという形で表されるのでしょうか。
(つづく)