チューリングマシンの動作を数式で表現しようプロジェクト

チューリングマシンの動作を数式で表現しようと思い立ちました。
数式で表現するにあたり必要なのは、チューリングマシンのインデックスと、チューリングマシンの状態と、テープの状態、の、それぞれを適当にコード化したもの。
したがって、3つの自然数をいっぺんに扱わなければなりません。
そこで、まずは N×N から N への全単射関数を構成することにします。
また、ここでは簡単のため、N は 1 以上の整数の集合とします。
自然数を次のように並べます。


1 2 4 7 11 16 22 …
3 5 8 12 17 23 …
6 9 13 18 24 …
10 14 19 25 …
15 20 26 …
21 27 …
28 …
んで、この表の i 行 j 列の数を求める関数ができればよいわけです。
まず、第 i 行の数列の初項は、第 1 列の数列の第 i 項であり、
第 1 列の数列が、初項が 1 で階差数列が 2, 3, 4, 5, …である数列であることから
\frac{1}{2}i(i+1) … (1)
となります。
よって、第 i 行の数列は、初項が (1) で、その階差数列が初項 i, 項差 1 の等差数列であるものになります。
したがって、表の i 行 j 列の数は
\frac{1}{2}i(i+1)+\sum_{k=1}^{j-1}(i+k-1) = \frac{1}{2}\{(i+j)^2-i-3j+2\}
となります。
因数分解しようとしたけどできませんでした。気持ち悪いー。
ちなみにこの式は、「ゲーデルと20世紀の論理学 第3巻」の54ページにある dpair なる関数と本質的に同じものです。
それはともかく、これで、二つの自然数を一つの自然数にコード化することができました。
それならば、三つの自然数はどうするかというと、これは簡単です。
上で構成した関数を d とおくと、自然数 a, b, c をコード化するには
d(a,d(b,c))
とすれば良いのであります。
次に、コード化された自然数から元の自然数を抜き出す関数を構成します。
ゲーデルと20世紀の論理学 第3巻」の54ページでは最小化関数が使われていますが、それは今の自分のポリシーに反するので、使いません。
使わなくても構成できます。
自然数 k が与えられたとき k = d(i,j) を満たす自然数 i, j を求めるには、それぞれが k 以下であることから、それぞれを独立に 1 から k まで動かしたときに、k = d(i,j) なら 1, そうでないなら 0 を返す関数を使えばヨロシ。
それには、単位階段関数を使って定義されたクロネッカーのデルタ D を使えば良いのであります。
要するに、次のようになります。
i=\sum_{i=1}^k \sum_{j=1}^k i D(k,d(i,j))
j=\sum_{i=1}^k \sum_{j=1}^k j D(k,d(i,j))
というわけで、これで第一段階完了です。