非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

超越数と無限長リスト(1)

笑わない数学 - NHK』で超越数の話があったとき調べてみましたが、超越数を構成する方法はプログラミング言語の無限長リストを構成する方法に似ているといえば似ています。そこで ChatGPT で調べてみました。

プログラミング言語の無限長リストと超越数とは関係がありますか

と入力すると以下の結果となりました。

無限長リスト(ストリーム)と超越数の関係は、ある意味では深く、ある意味では間接的です。具体的には、無限長リストを数列とみなすことで、超越数を構成したり、無限の情報を扱う手法として捉えることができます。

1. 無限長リスト(ストリーム)とは?

プログラミング言語では、無限長リスト(ストリーム)は遅延評価を用いて実装されることが多いです。たとえば、Haskell や F# では、次のように無限に続くリストを定義できます:

Haskell の例:

ones :: [Integer]
ones = 1 : ones  -- 1が無限に続くリスト

F# の例:

let rec ones = seq { yield 1; yield! ones }

これにより、有限のメモリしか持たないコンピュータ上で、無限のデータを扱うことができます。

2. 超越数とは?

超越数とは、有理数係数の代数方程式の解にならない実数のことです。有名な超越数には、π(円周率)e(ネイピア数 があります。これらは無限桁の小数展開を持ち、決して循環しません。

3. 無限長リストと超越数の関係

無限長リストは、超越数の小数展開を記述するために使えます。たとえば、π の小数展開を無限長リストとして表現できます。

Haskell での π のデジット列:

piDigits :: [Integer]
piDigits = [3, 1, 4, 1, 5, 9, 2, 6, ...]  -- 無限に続く

このように、超越数の各桁を無限長リストで表現できます。

無限長リストを用いた超越数の構成

無限長リストを利用すると、新しい超越数を構成することもできます。たとえば、チャンパーノウン定数 0.123456789101112... のように、自然数を順に並べた数)を考えます。

champernowne :: [Integer]
champernowne = concatMap digits [1..]
  where digits n = map (read . (:[])) (show n)

このような数は超越数であることが知られています。

4. 計算の観点からの関係

超越数は有限の規則で完全に記述することが困難ですが、無限長リストは遅延評価を使うことで、有限の規則から無限の数列を生成できます。
例えば、e を次のような級数展開で表せます:
\displaystyle
e = \sum_{n=0}^{\infty} \frac{1}{n!}
この無限級数をストリームとして定義すれば、e の近似値を求めることができます。

factorialStream :: [Integer]
factorialStream = scanl (*) 1 [1..]

eStream :: [Double]
eStream = scanl (+) 1 (map (1 /) (map fromIntegral factorialStream))

これにより、超越数の桁を順に計算し続けることが可能になります。

5. 無限長リストを使った超越数の圧縮表現

無限長リストをプログラムで扱うことで、超越数を有限の情報でエンコードできます。例えば、ラムダ計算 などでは、超越数の無限列を有限の規則で定義できます。こうした方法は、圧縮技術や乱数生成(擬似乱数列の解析)にも応用されています。

まとめ

無限長リストと超越数は、以下の点で関係しています:
1. 超越数の小数展開は無限長リストとして記述できる
2. 無限長リストを用いた数列から超越数を構成できる(例:チャンパーノウン定数)。
3. 無限長リストを用いた計算により、超越数を近似できる(例:e の級数展開)。
4. 無限長リストによる有限の規則を使って、超越数の表現を圧縮できる

このように、無限長リストは超越数を扱うための強力なツールとなります。