前々からゼータ関数の計算に興味があったのでやってみようと思いました.
一番下にある参考文献等(思い出し次第追加します)を頼りにせっせとやってみましたのと,個人的に興味あって調べた内容をツラツラと書き連ねます.
プログラム本体は参考文献にあるものとほとんどそのままです・・・
今回は記事が長くなるのでここで折りたたみます.
ゼータ関数の基本
ディリクレ級数のゼータ関数
について,一般調和級数から実数に対し
はのときに収束する.
これを引数を複素数にした場合
に絶対値をつけて
ここでと置換すると
となるため,の実部が1超過のときに絶対収束することが示せる.
しかしこれではプロットをしようとしても複素数平面全体に関数は定義できていないので,定義域を拡張する必要がある.
そこで解析接続という函数の再定義を行い定義域を広げる必要がある.
解析接続ってなーに?
一致の定理
複素関数は正則な点*1を中心としてテイラー展開*2ができる.
もしもなら定数項はゼロになる.
ここでとなる最小のを用いると
となりはから少しずれると0にはならないし,
についても少しずれると0にはならないため正則関数の零点は孤立することになる.
つまり正則関数で零点がで連続するなら周辺の小領域は零点の集積点となり,その集積点の端も零点が集積する.
これをつづけていくとは正則の範囲で恒等的に0になる.
そこでについてとが正則な範囲で一部がなら正則な範囲で恒等的にになるので正則な範囲で恒等的にとなる.
解析接続
ここでとが共有する正則範囲で一致することはわかった.
そこで
(が正則の範囲)
(が正則の範囲)
と場合分けを行い新たに函数を定義する.これを解析接続という.
この接続は正則の範囲を共有するなら一意に決まるが,例えばとを共有していない箇所で新たにをに接続する場合,例えとが正則の範囲を別に共有する箇所があったとしてもとならない場合がある.
例えばこの解析接続で新たに定義域を広げた函数について性質考えると元の函数について新たな式変形ができたり発見があるかもしれないという利点がある.
ここでリーマン予想はリーマンゼータ関数について解析接続した結果について函数の零点を用い因数分解を行おうとしてリーマン予想という問題にぶち当たった.
ゼータ関数の解析接続
ゼータ関数の解析接続はリーマンの『与えられた数より小さい素数の個数について』という論文*3で二種類の方法が提案されている.
これはオイラーが予め求めていたガンマ関数*4を用いた別の表記を用いるもので,これはガンマ関数
から,と変数変換を行い
最後にからまでを足し上げると,絶対収束*5する範囲なら
と変形ができることを示した.
リーマンはこれから複素数平面全体に解析接続できることを示し,函数等式を導出した.
1つ目の方法
1つ目の方法は複素積分
を用いる方法で,積分経路については3つの部分から成り,1つの部分はからまでの実軸よりすこーしだけ上,は半径の原点中心の円についてからまでぐるっと回る経路,は実軸のすこーしだけ下側をからと戻っていく経路をとる.
ここで注意したいのは分母がで極をとるのでとする.
すると
と変形でき,の積分については一周回っているので
とする必要があるのでそこに注意しながらと同じように変形を行うと
が得られる.
については,と置換しのテイラー展開を用いると
こうしてのとき
より
が得られ,ここで
なので
ここでより
と変形できるので
になる.
次に
という積分を考えるが,積分経路はからまで(は正の整数)の実軸の少し上側の経路を通り,原点中心で半径の円をぐるっと周り,からまでの実軸の少し下側の経路を通る経路をとる.
すると積分経路については閉路をとり,で極をとる.
その極の留数はを利用するとからが得られる.
一方
について一周回る箇所の経路は半径をとおくと,,なので
となり,なので分母は0になる心配はない.
もしもならのとき分母は指数関数的に大きくなり,分子は小さくなるのでこの積分は0に収束する.
つまり留数定理から
が得られ,となってしまったので
オイラーの公式から
と変形でき
と変形ができる.
変形を続けると
と面白い形ができる.
これまでの積分は
であり,共通する積分
は全平面で定義ができるから解析接続され,それぞれを代入して相反公式
を利用して整理すると
という函数等式が得られる.
2つ目の方法
を用いて得られるテータ変換公式
を用いて函数等式を得る.
aryuaryuaryuryu.hatenablog.com
これもガンマ関数
から,と置換すると
ここからからまで足し上げると
ここでと関数定義すると
つまり
及び
が得られるので
と積分を分割する.
の積分をメインに考えると,,と置換すると
テータ変換公式より
こうして全体の積分はのとき
になるのでをに変数変換して整理すると
という結果が得られる.
はが多くなれば非常に小さくなるため右辺の積分は収束し,とを除く複素平面全体に定義ができる.
この式はとをそれぞれ代入した結果は同じになるので
という美しい関係が得られる.
3つ目の方法
ここではリーマンの論文にない解析接続について述べる.
について,絶対収束するの範囲について
と記し,
と変形を行う.2つの差を取ると
になる.
これをイータ関数と呼び
と定義する.
交代級数について
を満たすバイアスを定義し
これをイータ関数に適用すると,になるので
となる.
なので
と全複素平面に対して有効な表示が得られる.
正直この説明ではが未知の数値であることと,定数であるということで納得いってないからもうちょっとリサーチしていきたい.
ちなみにがのテイラー展開から得られる.
ゼータ関数の特殊値
零点について
リーマン予想で有名な『ゼータ関数の非自明な零点』は有名だけど実際『非自明』というからには『自明な零点』というものも存在するか?というのも考える人もいると思う.
結論から言うと自明な零点は存在して,『引数が負の偶数』の点が零点になる.
函数等式
についてとおくと
より及びなので
が得られる.
非自明な零点は言わずもがなの直線上に存在すると予想されている.
今回のプロットで色々見ていけたらいいなーって思う.
引数が負の整数の値
自明な零点は負の偶数なのに対して,負の奇数は?というと,函数等式
にを代入した
について,先日導出したゼータ関数の特殊値
aryuaryuaryuryu.hatenablog.com
を代入すると
が得られる.
ちなみになので
が得られ,なので
と特殊値を得ることができる.
ゼータ関数の極
といった感じになる.極は1位の極で留数は
になる.
ところではと函数等式の対の存在になるけどこちらはちゃんと数値をとり
をとる.
プログラム
今回はゼータ関数の解析接続3つ目の方法をメインに計算した.
double Combination(int a, int b) {
int tmpa = a, tmpb = b;
double result = 1;
for (int i = b; i > 0; i--) {
result *= (double)tmpa / (double)tmpb; tmpa--; tmpb--; }
return result;
}
//η(a+bi)
std::complex<double> EtaFunc(std::complex<double> s) {
std::complex<double> result(0, 0), tmp(1, 0);
for (int n = 0; n <= CALCMAX; n++) {
tmp *= 0.5;
std::complex<double> sum(0, 0);
for (int k = 0; k <= n; k++) {
if (k % 2 == 0)sum += Combination(n, k) * pow(k + 1, -s);
else sum -= Combination(n, k) * pow(k + 1, -s);
}
result += sum * tmp;
if (abs(sum * tmp) <= EPSIL)break;
if (abs(result) >= INFTY)break;
}
return result;
}
std::complex <double> ZetaFunc(std::complex<double> s) {
if (s.real() >= 1. - EPSIL && s.real() <= 1. + EPSIL && s.imag() >= - EPSIL && s.imag() <= EPSIL)return INFTY;
if (s.real() < -10) {
std::complex<double> tsum(INFTY, INFTY);
int a = (int)s.real(); if( (int)s.real()) return tsum;
}
std::complex<double> Eta = EtaFunc(s);
std::complex<double> bias = 1. / (1. - pow(2., 1. - s));
std::complex<double> result = Eta * bias;
return result;
}
実行結果
のときに多分オーバーフローするのでのときは表示しないようにした.
(0,0)から0.1ごとに計算を行い0~8までをカラースケール表示を行った.8超過は白で表示している.
また実軸と虚軸,の直線を表示している.
Dxlibでをプロットした結果は
となった.
次に左からの0~2までの値,の-2~2まで,の-2~2までをプロットしてその値を飛び出ると2超過を白,0もしくは-2未満を黒で表示した.
数値が大きくなる箇所の計算が少し怪しいから白と黒についてはあまりアテにはできない.
実部がの直線上に青い丸が存在して
とか付近が青くなっているから多分コレが零点になると思う.
一方自明な零点は周辺がすごく小さいから非常に見にくいからちょっと見れそうにないのが残念.
以下はリーマン予想の問題となっているのグラフ.零点が結構あるのがわかる.
そのうちまた何か追記するかも.