About zeta function by VBA

リーマン予想に登場する、ζ(ゼータ)関数の振る舞いを目にすることはなかなか大変です。しかしながら、いまでは様々なサイトからゼータ関数の情報を入手できるので、このちんけなサイトでゼータ関数について述べる意味はなく、そもそも語れるほどの器量も持ち合わせていません。でも、ほんのちょっとだけ雰囲気に浸ってみました。

まず、ゼータ関数ζ(s)は、メビウス関数μ(n)を用いて 1/ζ(s) = Σ_n{μ(n)/n^s} のような簡潔な形にまとめられることが分かっています。メビウス関数の詳細などは、それなりの書籍かサイトで調べてください。さて、このことからζ(s)の計算ができるのですが、実際にやってみるとまともな計算にはなりません。

まともに計算するには、オイラー・マクローリンの和公式を適用するのがよいでしょう。これについても、それなりの書籍かサイトで調べてください。より精確に計算するには、計算項を適切なところまで加える必要があります。いずれにせよ、これらの方法でどこまで頑張れるか Excel の VBA でマクロを組んでみました。

ここからファイルをダウンロードして、自由に試してください(ブラウザ上でファイルを開くことができるかもしれませんが、これはダウンロードして実行することが前提のファイルです)。97-2004以前のバージョンでも利用できるようにファイルフォーマット .xls で保存してますが、2004以降の Excel が使えるなら .xlsファイルを開いたあと、ファイルフォーマット .xlsm で保存し直してください。

マクロが何をし、ワークシートに何が表示されるのかを簡単に述べておきます。以下の説明は、ファイルフォーマット .xlsm で開いたものとします。その際、次のマクロモジュール「DrawRoutine」「EulerMaclaurin」「MebiusMu」に記述されたマクロにおいて、コメントアウトされた // から // までのすべての行を有効にしてください(先頭の ' を取る)。

  1. sheet2(zeta_plain)の緑線の左側の複素平面には、ζ(s)の値域の変化が表示されます。横軸は実数軸、縦軸は虚数軸で交点が原点 (0, 0i) です。実数軸、虚数軸ともに1, 1i間隔の目盛を±4, ±4iまで刻んであります。s = 1/2+k*i において、0 < k が増加するのに合わせて、左側の複素平面にζ(s)の値がプロットされていきます。
  2. sheet2(zeta_plain)の緑線の右側の複素平面には、定義域 s = 1/2+k*i の変化が表示されます(.xlsmフォーマットファイルで開き直したときに現れます)。横軸は虚数軸、縦軸は実数軸で交点が原点 (0i, 0) です(左側の複素平面とは縦・横が逆であることに注意してください)。もし右側の複素平面は表示されていない場合は、マクロ「InitPlain」を実行して表示させてください。虚数軸にだけ、1i間隔の目盛を35iまで刻んであります。途中、14.13, 21.02, 25.01が赤い目盛になっていますが、これらは最初の3個の零点を示しています。また黄色い帯は、幅1のクリティカルストリップを表しています。s = 1/2+k*i において、0 < k が増加するのに合わせて直線が引かれていきます。
  3. sheet2(zeta_plain)は 14% の縮小表示にしてあります。列幅・行高などは適宜変更してもらってかまいません。
  4. マクロ「MebiusFailure」はメビウス関数を用いた描画を行います。ゼータ関数の計算に使うメビウス関数の値を作成するのにそれなりに時間がかかるので、sheet1(calc_mu)に進捗状況を表示しています。値の作成が終わると、sheet2(zeta_plain)に定義域 s = 1/2+k*i の各点と、それに対するζ(s)の値がプロットされます。
  5. マクロ「ZetaFunction」はオイラー・マクローリンの和公式を用いた描画を行います。sheet3(calc_zeta(s))を計算の補助に使いながら、sheet2(zeta_plain)に定義域 s = 1/2+k*i の各点と、それに対するζ(s)の値がプロットされます。

マクロ「MebiusFailure」は、s = 1/2+5i あたりから値を束ねられなくなる様子が分かるでしょう。零点付近はそれっぽい値になるようですが、全体では破綻しています。マクロの定数 LIM の値 2^12 を大きくすると、もう少し先のsまで束ねる様子が見られますが、計算に時間がかかる割に精確さは増しません。

マクロ「ZetaFunction」は、s = 1/2+35i あたりまでうまく計算できているはずです。さらに先までそこそこの計算をさせるには、sheet3(calc_zeta(s))の補助計算の項数を増やす必要があります。

ちなみに、定義域を表示させるためにExcelシートのIV列より先を使うので、97-2004以前のバージョンでは定義域の表示ができませんが、マクロは動作します。ただしその場合は、マクロモジュール「DrawRoutine」「EulerMaclaurin」「MebiusMu」の // から // までのすべての行をコメントアウトして実行してください。


マクロ「MebiusFailure」

「素数に憑かれた人たち/ジョン・ダービーシャー著、松浦俊輔訳」(日経BP社 2004年発行)を参考にマクロを作成しました。

マクロ「ZetaFunction」

「明解 ゼータ関数とリーマン予想/ハロルド・M・エドワーズ著、鈴木治郎訳」(講談社 2012年発行)を参考にマクロを作成しました。