1859年にドイツの数学者ベルンハルト・リーマン (Bernhard Riemann) によって提唱された リーマン予想 は現代 (2019年5月8日時点) でも解決に至っていない、数学の難問中の難問です。リーマン予想の意味を理解するためには、まずリーマンゼータ関数について理解する必要があります。この記事では、Python で リーマンゼータ関数 を実装して「リーマン予想とは何か?」を解説します。
リーマンゼータ関数
解析的整数論において重要な位置を占めるリーマンゼータ関数 (Riemann zeta function) は
\[\zeta(s)=\sum_{n=1}^{\infty}\frac{1}{n^s}\quad (\mathrm{Re}(s)\gt 1)\tag{1}\]
によって定義されます。Scipy にはリーマンゼータ関数を計算する scipy.special.zeta() が用意されていますが、定義 (1) の $s$ に相当する引数に正の実数しか渡せないので、応用範囲が限定的です。
この記事では mpmath に組み込まれている mpmath.zeta() を使うことにします。mpmath は Scipy や Sympy のバックグラウンドではたらく任意精度演算パッケージです。mpmath.zeta() は解析接続によって $s=1$ をのぞく複素数全域で定義されたゼータ関数を計算できます。
mpmath.zeta(s, a=1, derivative=0)
a=1 を指定すると(デフォルトで 1 になっています)、リーマンのゼータ関数を計算します。
ゼータ関数は $0$ を除く偶数点 $s=2n$ で収束します。
\[\begin{align*}&\zeta(2)=-\frac{\pi^2}{2}=1.6449\\[6pt]&\zeta(4)=-\frac{\pi^2}{90}=1.0823\\[6pt]&\zeta(6)=-\frac{\pi^2}{945}=1.0173\end{align*}\]
mpmath.zeta() を使って確認してみましょう。
# PYTHON_RIEMANN_ZETA
# In[1]
# s=2nにおけるゼータ関数の値
import mpmath
mpmath.mp.dps = 25
mpmath.mp.pretty = True
# ζ(2),ζ(4),ζ(6)
z2 = mpmath.zeta(2, 1)
z4 = mpmath.zeta(4, 1)
z6 = mpmath.zeta(6, 1)
# 計算結果を小数点以下8桁まで表示
print("ζ(2): {}".format(z2))
print("ζ(4): {}".format(z4))
print("ζ(6): {}".format(z6))
# ζ(2): 1.644934066848226436472415
# ζ(4): 1.082323233711138191516004
# ζ(6): 1.017343061984449139714518
$s=1$ はリーマンゼータ関数の極なので、mpmath.zeta(1, 1) はエラーを返します。$s=2n+1$ における値も計算しておきます。
# In[2]
# s=2n+1におけるゼータ関数の値
# ζ(3),ζ(5),ζ(7)
z3 = mpmath.zeta(3, 1)
z5 = mpmath.zeta(5, 1)
z7 = mpmath.zeta(7, 1)
# 計算結果を小数点以下8桁まで表示
print("ζ(3): {}".format(z3))
print("ζ(5): {}".format(z5))
print("ζ(7): {}".format(z7))
# ζ(3): 1.202056903159594285399738
# ζ(5): 1.036927755143369926331365
# ζ(7): 1.008349277381922826839798
リーマン予想
リーマンゼータ関数の $s=-2n\ (n\gt 0)$ は自明な零点とよばれます。
mpmath.zeta() に零点での値を計算させてみましょう。
# In[3]
# 自明な零点の計算
# ζ(-2),ζ(-4),ζ(-6)
zm2 = mpmath.zeta(-2)
zm4 = mpmath.zeta(-4)
zm6 = mpmath.zeta(-6)
print("ζ(-2): {}".format(zm2))
print("ζ(-4): {}".format(zm4))
print("ζ(-6): {}".format(zm6))
# ζ(-2): 0.0
# ζ(-4): 0.0
# ζ(-6): 0.0
ちなみに、自明な零点以外の零点を非自明な零点とよびますが、
「非自明な零点はすべて $s=1/2+ti$ の上にあるよ」
というのが、かの有名な リーマン予想 です ($i$ は虚部、$t$ は任意の実数パラメータ) 。直線 $s=1/2+ti$ のことをクリティカル・ライン (critical line) といいます。
非自明な零点がどのあたりにあるのか、Matplotlib でグラフを描いて調べてみましょう。横軸にはクリティカル・ライン、縦軸にはリーマンゼータ関数の絶対値 $|\zeta(s)|$ をとります。
# In[4]
# 非自明な零点の探索
import matplotlib.pyplot as plt
x = []
absz = []
t = range(0, 5000)
for q in t:
s = 0.5 + 0.01 * t[q] * 1j
x.append(0.01 * t[q])
absz.append(abs(mpmath.zeta(s)))
# リーマンゼータ関数のグラフを描画
fig = plt.figure(figsize = (6, 6))
ax = fig.add_subplot(111)
ax.set_title("Absolute value of Riemann zeta Function", size = 14)
ax.grid()
ax.set_xlim(0, 40)
ax.set_ylim(-1, 4)
ax.set_xlabel("Critical Line", size = 14, labelpad = 10)
ax.set_ylabel("|ζ(s)|", size = 14, labelpad = 10)
ax.plot(x, absz, color = "darkblue")
クリティカル・ライン上で $|\zeta(s)|$ が $0$ になっている点が非自明な零点です。詳しい計算によると、原点に最も近い非自明な零点は $s=1/2\pm (14.13...)i$ であることが知られています。
【AI解説】リーマンゼータ関数
[ChatGPT] リーマンゼータ関数(Riemann zeta function)は、数学における特殊な関数の一つです。ドイツの数学者ベルンハルト・リーマンによって提案され、彼の名前が冠されています。リーマンゼータ関数は、複素数(実数と虚数の組み合わせ)に対して定義される関数であり、sを複素数として、以下のように表されます:
ζ(s) = 1^(-s) + 2^(-s) + 3^(-s) + 4^(-s) + …
ここで、^(-s)はsのべき乗の逆数を意味します。具体的には、1^(-s)は1のs乗の逆数、2^(-s)は2のs乗の逆数、といった具合です。リーマンゼータ関数は、sの実部(複素数の実数部分)が1より大きい範囲で定義されます。この範囲では、リーマンゼータ関数は収束し、有限の値を持ちます。しかし、sの実部が1以下の場合には、リーマンゼータ関数は発散し、無限大になります。リーマンゼータ関数は、数論(整数論)や解析数論(数論の一分野)において重要な役割を果たしています。特に、sの実部が1より大きい場合において、リーマンゼータ関数は無限級数の形で表されるため、数論の研究において数の分布や素数の性質などを調べる上で重要な道具となっています。リーマンゼータ関数には多くの興味深い性質があり、数学の研究者たちによってさまざまな研究が行われています。また、リーマンゼータ関数の特殊な値やゼータ関数の性質に関する予想や未解決問題も存在しており、これらは数学界での重要な課題となっています。
【AI解説】リーマン予想
[ChatGPT] リーマン予想は、数学の分野である解析数論において非常に重要な未解決問題の1つです。これは、19世紀にドイツの数学者であるベルンハルト・リーマンによって提唱された予想です。リーマン予想は、複素数の特殊な性質に関係しています。複素数とは、実数部と虚数部を持つ数のことであり、例えば2+3iのように表されます。リーマン予想は、ある特殊なグラフ上の複素数における特定の性質についての予想です。具体的には、リーマン予想は「すべての非自明なゼータ関数の複素数解の実部が1/2である」という主張です。ここで言われているゼータ関数は、リーマンが研究した特殊な関数であり、数学のさまざまな分野で重要な役割を果たしています。リーマン予想の意味するところは、このゼータ関数の解の実部が1/2以外の値を取らないということです。これは数学者たちにとって非常に興味深く、重要な予想です。実際、リーマン予想が正しい場合、多くの数学的結果やパターンが明らかになることが期待されています。リーマン予想の証明はまだ見つかっておらず、現在も解決されていません。これは、数学の難解な問題の1つであり、多くの数学者が取り組んできました。リーマン予想の解決は、数学の分野において大きな進展をもたらすことが期待されており、数学界全体にとっての重要な課題となっています。
【AI解説】ベルンハルト・リーマン
[ChatGPT] ベルンハルト・リーマン(Bernhard Riemann)は、19世紀のドイツの数学者であり、特に解析数論の分野で顕著な業績を残しました。彼は1826年に生まれ、1866年に亡くなりました。リーマンは、数学における様々な分野で重要な業績を残しましたが、特に彼の名前は「リーマン予想」と関連して広く知られています。リーマン予想は、リーマン自身が1859年に提唱した予想であり、解析数論の中でも最も重要かつ難解な問題の1つです。この予想は、特殊な関数であるゼータ関数の解の分布に関するものであり、数学の多くの分野に深い影響を与えています。リーマンの業績には、他にも多くの重要な成果が含まれています。彼は複素解析の分野で革新的なアイデアを提案し、リーマン面(Riemann surface)と呼ばれる概念を導入しました。リーマン面は、複素関数の解析的な拡張を考えるための道具として重要であり、現代数学において幅広く応用されています。また、リーマンは楕円関数、リーマン積分、リーマン=スティルチェス積分、リーマン幾何学など、さまざまな分野で貢献しました。彼の業績は、数学の基礎を築き、数学の発展に大きな影響を与えました。リーマンは、数学的な洞察力や創造性に加えて、非常に厳密で詳細な証明の方法を追求する姿勢でも知られています。彼の研究と思考の深さは、多くの数学者に影響を与え、現代の数学の発展に大きな遺産を残しました。