読者です 読者をやめる 読者になる 読者になる

かたちづくり

つれづれに、だらだらと、おきらくに

リーマンのゼータ関数を描画してみた

数々の数学者の人生を狂わせたリーマン予想というものがある、ということは以前から知識として知ってはいたのですが、とあるキッカケでなんとなくWikipediaで調べてみました。

ゼータ関数を次のように定義する。
http://upload.wikimedia.org/math/3/c/2/3c295b03578ef959e080c322d9682ee0.png
1859年にリーマンは自身の論文の中で、複素数全体 (s ≠ 1) へゼータ関数を拡張した場合、
ζ(s) の自明でない零点 s は、全て実部が 1/2 の直線上に存在する。
と予想した。

リーマン予想 - Wikipedia

あーそういえば数学ガールバーゼル問題は読んだなあと思いつつ、難しいことはサッパリ分からんが正月休みのヒマを埋めるべくとりあえずゼータ関数を可視化してみたら面白いかもしれんと、プログラミングの書き初めを始めたわけであります。

まずゼータ関数に出てくる数列を次のように定義します。(あ、C#ね)

    static IEnumerable<Complex> ZetaSequence( Complex z )
    {
      int n = 1;
      while ( true ) yield return 1.0 / Complex.Pow( n++, z );
    }

.NET Framework 4.0 から Complex 型が導入されたので大変便利ですなー。
次にこの数列の和を計算してゼータ関数が定義されます。

    static Complex ZetaFunc( Complex z )
    {
      const int N = 1000;
      return ZetaSequence( z ).Take( N ).Aggregate( Complex.Zero, ( acc, item ) => acc.Magnitude < 10.0 ? acc + item : acc );
    }

ここでは数列の1000項まで計算することにしました。あと、無限大に発散されても困るので絶対値10未満に抑えました。

ここからゴニョゴニョと色々やって、OpenGLで描画したものがこちら。
f:id:u_1roh:20130102194550p:plain

おお!確かに X = 1/2 の直線上にツノのような形のゼロ点があるではないか!
ちなみに、Z軸はゼータ関数の絶対値、色は偏角を色相に割り当てたもの。

裏から見るとこんな感じ。
f:id:u_1roh:20130102194658p:plain

もっとY軸方向に大きく描画してみたものがこちら。
f:id:u_1roh:20130102194756p:plain

う、美しい・・・。
なんといいますか、数々の数学者たちの挑戦を跳ね除けたエピソードを知った上でこの形を眺めると、なんだか妖しい美しさがあるように感じられてしまうものですね。

僕は人生をこれ以上狂わせたくないので、リーマン予想に深入りするのは辞めておきます。深入りするだけの能力が無いだけですが。みなさんも気をつけましょう。

数学ガール (数学ガールシリーズ 1)

数学ガール (数学ガールシリーズ 1)