この記事では位取り記数法について私なりに色々考えてみた話を紹介していきます。
皆さんご存じのように私たちが普段$2021$とか$3.1415\ldots$とかのように数値を表すのに使っている記法は$10$進位取り記数法と呼ばれています。これは、平たく言うと、数字の各桁に$10$のべきを対応させた記数法となっています。
\begin{eqnarray}
2021&=&2\c10^3+0\c10^2+2\c10^1+1\c10^0
\\\pi=3.14\ldots&=&3\cdot10^0+1\cdot10^{-1}+4\cdot10^{-2}+\cdots
\\\ldots d_1d_0.d_{-1}d_{-2}\ldots&=&\cdots+10^1d_1+10^0d_0+10^{-1}d_{-1}+10^{-2}d_{-2}+\cdots
\end{eqnarray}
このように数字の各桁に何らかの値を掛けて数値を表す記法を位取り記数法といいます。位取り記数法は基本的に$10$進法や$2$進法という$N$進法
$$\ldots d_1d_0.d_{-1}d_{-2}\ldots_{(N)}
=\cdots+N^1d_1+N^0d_0+N^{-1}d_{-1}+N^{-2}d_{-2}+\cdots$$
として使われるのが一般的ですが、そろばんの二五進法
$$01|12|02|13=(0\c5+1)\c10^3+(1\c5+2)\c10^2+(0\c5+2)\c10^1+(1\c5+3)\c10^0$$
($|$で各串の境界を表し、左の数字が天、右の数字が地の状態を表すものとした)や時間を表す記数法
$$11:30:25=(1\c10+1)\c60^2+(3\c10+0)\c60+(2\c10+5)\mbox{秒}$$
など少し変則的な記数法も使われています。
数学クラスタではしばしば位取り記数法の各桁にある数列を整列させたり、各桁を並べ替えたりして遊ぶようなことがあります。
\begin{align}
111111&=3\c7\c11\c13\c37\\
123_{(29)}&=321_{(17)}
\end{align}
でもこういうのって大体$10$進法や$N$進法止まりで、もっと一般の記数法で遊ばれることは少ないように感じます(尤も専用の記法がないだけで実質的に変則的な記数法で遊んでいることもありますが)。それはちょっともったいない気がしたので私なりに$N$進じゃない記数法について軽く考察してみることにしました。
まず位取り記数法に求められる要件について定めておきましょう。
単調増加な正整数$\{A_k\}$と非負整数$\{d_k\}\;(0\leq d_k< c_k)$について
$$\cdots+A_2d_2+A_1d_1+A_0d_0=:\ldots d_2d_1d_0\ua$$
のように表すことを$\A$進法と言う。
とりあえず非負整数を表現できるものとして次のような性質は欲しいです。
任意の非負整数$n$は$n=\ldots d_2d_1d_0\ua\quad(0\leq d_k< c_k)$と一意的に表せる。
この条件と単調増加性から$A_k$未満の任意の非負整数$n$は
$$n=d_{k-1}\ldots d_2d_1d_0\ua\quad(0\leq d_l< c_l)$$
のように書けるので
$$A_k=1+\sum^{k-1}_{l=0}A_l(c_l-1)$$
である必要があります。特に漸化式
$$A_{k+1}=A_k+A_k(c_k-1)=c_kA_k$$
が成り立つので$1=d_0\ua=A_0d_0$と表せることから$A_0=1$に注意すると
$$A_k=\prod_{l=0}^{k-1}c_l$$
であればよいことになります。よって以下のようにまとめられます。
任意に整数列$\{c_k\}\;(2\leq c_k)$を取って
$$A_k=\prod^{k-1}_{l=0}c_l$$
と定めたとき、任意の非負整数$n$を
\begin{align}
n={}&\ldots d_2d_1d_0\ua\\
:={}&\cdots+A_2d_2+A_1d_1+A_0d_0\quad(0\leq d_k< c_k)
\end{align}
のように表現することを$\A$進法と言う。このような表現は一意的であり、その表現を$\A$進展開と言う。
また$c_k$のことを$k$番位の底または基数といい、各桁の値$d_k$を$k$番位の仮数と言う。
代表的な位取り記数法である$N$進法は
$$\{c_0,c_1,c_2,\ldots\}=\{N,N,N,\ldots\}$$
そろばんの二五進法は
$$\{c_0,c_1,c_2,\ldots\}=\{5,2,5,2\ldots\}$$
時間を表す記数法は
$$\{c_0,c_1,c_2,\ldots\}=\{10,6,10,6,10\}$$
もしくは時分秒をそれぞれ一桁とみなし日や年まで考えると
$$\{c_0,c_1,c_2,\ldots\}=\{60,60,24,365,10,10\ldots\}$$
のような場合となっている。
私たちが普段使っている記数法が上手くいってるのは
$$A_k=\prod^{k-1}_{l=0}c_l$$
というカラクリがあったんですね。
ちなみに負の方向にも
$$A_{-k}=\farc1{c_{-k}}A_{-(k-1)}=(\prod^k_{l=1}c_{-l})^{-1}$$
と伸ばして
\begin{align}
r&=\ldots d_1d_0.d_{-1}d_{-2}\ldots\ua\\
&=\cdots+A_1d_1+A_0d_0+A_{-1}d_{-1}+A_{-2}d_{-2}+\cdots
\end{align}
と表すことで任意の有理数や実数まで表現することができます(仮数は$0\leq d_{-k}< c_{-k}$)。
ある非負整数$n$が与えられたときその$\A$進展開は次にようにして求められます。
まず$c_0$から順に割り算をして行き、商と余りを求めます。
\begin{eqnarray}
n\div c_0&=&q_0\cdots r_0
\\q_0\div c_1&=&q_1\cdots r_1
\\q_1\div c_2&=&q_2\cdots r_2
\\&\vdots&
\\q_{k-1}\div c_k&=&0\cdots r_k
\end{eqnarray}
このとき$n$の$\A$進展開は$n=r_k\ldots r_2r_1r_0\ua$となります。
\begin{eqnarray} 2021\div7&=&288\cdots5 \\288\div7&=&41\cdots1 \\41\div7&=&5\cdots6 \\5\div7&=&0\cdots5 \\\therefore\quad2021&=&5615_{(7)} \end{eqnarray}
また一般の非負実数$r$の小数部分$f=r-[r]$については以下のように求められます。
まず$c_{-1}$から順に掛け算をして行き、整数部分$r_{-k}$と小数部分$f_k$を求めます。
\begin{eqnarray}
c_{-1}f&=&r_{-1}+f_1
\\c_{-2}f_1&=&r_{-2}+f_2
\\c_{-3}f_2&=&r_{-3}+f_3
\\&\vdots&
\end{eqnarray}
このとき$f=r-[r]$の$\A$進展開は$f=0.r_{-1}r_{-2}r_{-3}\ldots\ua$となります。
\begin{eqnarray} \pi&=&3+0.1514\ldots \\9\c0.1514\ldots&=&1+0.2743\ldots \\9\c0.2743\ldots&=&2+0.4690\ldots \\9\c0.4690\ldots&=&4+0.2210\ldots \\9\c0.2210\ldots&=&1+0.9894\ldots \\&\vdots& \\\therefore\quad\pi&=&3.1241\ldots_{(9)} \end{eqnarray}
足し算引き算については$N$進法の場合とやることは変わりません。足し算
$$\ldots d_2d_1d_0\ua+\ldots e_2e_1e_0\ua=\ldots f_2f_1f_0\ua$$
は$d_k$と$e_k$(と繰り上がり)の和が$c_k$未満のとき
$$f_k=d_k+e_k(+\mbox{繰り上がり})$$
とし、$c_k$以上のとき一桁繰り上がって
$$f_k=d_k+e_k(+\mbox{繰り上がり})-c_k$$
とするだけです(引き算についても同様)。
掛け算割り算についてはおそらく特に一般的な方法がなく、かなり煩雑なことになります。せめて任意の$i,j$にある$k_{i,j}$が存在して$A_iA_j=A_{k_{i,j}}$のような関係が成り立ってくれているとある程度の定式化はできそうですが、おまけとして示すようにそのような性質を持つものは$N$進法(に類似するもの)のみに限られることがわかるのでどうしようもないです。
$10$進法ではある数が$2^k$や$5^k$で割り切れるか調べるには下$k$桁が$2^k$や$5^k$で割り切れるかどうかを確かめればよい、という約数判定がありました。
\begin{align}
2^3&\nmid28&&\therefore\;\;2^3\nmid1028\\
5^3&\mid125&&\therefore\;\;5^3\mid1125
\end{align}
これは一般の$\A$進法でも似たようなことができます。と言っても至極単純なことで、ある数が$d\;(d\mid A_k)$で割り切れるか調べるには下$k$桁が$d$で割り切れるかどうかを確かめればよい、という話です。漸化式$A_{l+1}=c_lA_l$が成り立っているので当然と言えば当然ですね。ついでに言うと合同式
$$\ldots d_2d_1d_0\ua\equiv d_{k-1}\ldots d_2d_1d_0\ua\pmod{d}$$
が言えます。
というわけで$N$進じゃない記数法を考えてみましょう。とりあえず$c_k=k+2$とした階乗進法
$$\ldots d_2d_1d_0{}_{(!)}=\ldots d_2\c3!+d_1\c2!+d_0\c1!$$
なんてものを考えたくなります。階乗進法では一桁増えるごとに階乗$n!$の速さで大きくなるので、十分に大きい同じ数を表すのに指数関数$N^n$の速さで大きくなる$N$進法より少ない桁数で済みます。ただ$N$桁程度の$N$進数だったら階乗進法で表すより$N$進法で表した方が少ない桁数で済むのでよっぽど大きい数じゃない限り実用性は低そうです。
$100000_{(3)}=20011_{(!)}$($6$桁$\to5$桁)
$100000=23551220_{(!)}$($6$桁$\to8$桁)
$10^{30}=\mathrm{37MFCDG58464CF8BC01182251220}_{(!)}$($31$桁$\to28$桁)
階乗進法は小数展開に少し面白い性質があります。
$$d_0.d_{-1}d_{-2}d_{-3}\ldots=d_0+\frac{d_{-1}}{2!}+\frac{d_{-2}}{3!}+\farc{d_{-3}}{4!}+\cdots\quad(0\leq d_0\leq1,\;0\leq d_{-k}\leq k)$$
$N$進法においては大抵の無理数に対し、それが恣意的に作られたものでなければ、その小数展開に目に見えた規則性はありませんが、階乗進法においては規則性が見られる場合があります。
\begin{eqnarray}
e&=&2+\sum^\infty_{n=2}\farc1{n!}&=&10.11111\ldots_{(!)}
\\\sinh1&=&1+\sum^\infty_{n=1}\frac1{(2n+1)!}&=&1.010101\ldots_{(!)}
\\\cosh1&=&1+\sum^\infty_{n=1}\frac1{(2n)!}&=&1.101010\ldots_{(!)}
\\e^{-1}&=&\sum^\infty_{n=0}\frac{2n}{(2n+1)!}&=&\mathrm{0.020406080A}\ldots_{(!)}
\\\sin1&=&\sum^\infty_{n=0}\l(\frac{4n+1}{(4n+2)!}+\farc{4n+2}{(4n+3)!}\r)
&=&\mathrm{0.120056009A}\ldots_{(!)}
\\\cos1&=&\sum^\infty_{n=0}\l(\frac{4n}{(4n+1)!}+\frac{4n+1}{(4n+2)!}\r)
&=&0.1004500890\ldots_{(!)}
\end{eqnarray}
このように整数係数なマクローリン展開を持つ関数の特殊値といった限られた場合くらいにしかこのような性質は見られませんが、ネイピア数$e$のような馴染み深い超越数がこのような規則的な小数展開を持つのは中々面白いですね。
ただ階乗進法には実用的にちょっと問題があります。上でもしれっと$\mathrm{A}$とか$\mathrm{B}$とか出てきたように上や下に$10$桁以上伸びる数を表現するには$0$から$9$までの数字だけでは足りなくなってしまいます。そこで$32$進法などでも使われているように$9$の先に$\mathrm{A,B,C\ldots,Z}$と延長することで$0$から$35$までの仮数を一桁で表すことができますが、それでも上や下に$36$桁以上伸びる数を表現するには足りません。そう、階乗進数では$k$桁目の仮数は$k$個必要なのですべての自然数に対してなんらかの記号を割り当てないといけないのです。
じゃあ二桁以上使って仮数を表わせばいいじゃんとなりますが、$10$進法で表すにしても
$$12!-1=\{11\}\{10\}87654321_{(!)}$$
のようになりますし、階乗進法で表すにしても
$$6!-1=\{21_{(!)}\}\{20_{(!)}\}\{11_{(!)}\}11_{(!)}$$
のようにかなりわかりづらい見た目になってしまいます。
このように仮数が無限に必要になる問題を防ぐには$c_k$が有限である必要があり、特に仮数を$\A$進法で表したとき二桁以上になってしまう問題を防ぐには$c_k\leq c_0$である必要があります。$c_0$を固定したとき、$c_k\leq c_0$を満たすような記数法のうち、桁数の増加に伴う発散速度が一番大きいもの(任意の数を表すのに一番桁数が少なくて済むもの)は$N$進法($N=c_0$)となるのでそういう意味で$N$進法は最も理に適った記数法であると言えます。
$N$進法は掛け算割り算が定式的に計算可能で、仮数が有限である記数法のうち実用的に最も理に適った記数法なので、いくら未知の文化を発展させた宇宙人が飛来してきても記数法は$N$進法に則ったものを使っている可能性が高いですね(ローマ数字のようなものを使っていない限り)。
$N$進法最強!$N$進法最強!
一般の位取り記数法における掛け算割り算について「任意の$i,j$にに対しある$k_{i,j}$が存在して$A_iA_j=A_{k_{i,j}}$のような関係が成り立つものは$N$進法(に類似するもの)のみに限られることがわかる」といったことを言いましたが、ここではそのことについて解説していきます。
$A_k$は単調増加なので$A_{i-1}< A_j< A_{i+1}$ならば$A_j=A_i$が成り立つことを利用すると次のようにして
$$\cdots=c_2=c_1=c_0=c_{-1}=c_{-2}=\cdots$$
すなわちこれは$N$進法($N=c_0$)であることが言えます。
$c_{l-1}=c_{-1}$が成り立つとする($l=0$のときは明らか)。
このとき
$$A_k=A_{-1}A_{l+1}=\frac{c_lc_{l-1}}{c_{-1}}A_{l-1}=c_lA_{l-1}$$
なる$k$を取ると、$A_{-1}<1< c_l$より$A_{l-1}< A_k< A_{l+1}$つまり
$$A_k=A_l=c_{l-1}A_{l-1}$$
でなければならないので$c_l=c_{l-1}=c_{-1}$を得る。
$c_{-l}=c_0$が成り立つとする($l=0$のときは明らか)。
このとき
$$A_k=A_1A_{-(l+1)}=\frac{c_0}{c_{-l-1}c_{-l}}A_{-(l-1)}=\frac{A_{-l+1}}{c_{-l-1}}$$
なる$k$を取ると、$\farc1{c_{-l-1}}<1< A_1$より$A_{-l-1}< A_k< A_{-l+1}$つまり
$$A_k=A_{-l}=\farc{A_{-l+1}}{c_{-l}}$$
でなければならないので$c_{-l-1}=c_{-l}=c_0$を得る。
さて数学的帰納法により$A_k=N^k$がわかりましたが、これは前提として$A_iA_j=A_{k_{i,j}}$という関係式において$i,j$が負の値を取ることを許しています。
では$i,j$が非負のときのみを考えるとどうなるでしょうか。
$$\{c_0,c_1,c_2,\ldots\}=\{49,7,7,7,\ldots\}$$
つまり$A_k=7^{k+1}\;(k\geq1)$とおくと
$$A_iA_j=A_{i+j+1}\quad(i,j\geq1)$$
が成り立つ。
結論から言うと以下のような命題が成り立ちます。
$i,j\geq0$に対しある$k_{i,j}$が存在し$A_iA_j=A_{k_{i,j}}$が成り立つことと、以下の二条件が成り立つことは同値である。
このように結局$N$進法に類似した記数法となるわけです。
ちなみにこのような$A_k$に対して集合
$$M=\{e_k\mid k\in\Z_{\geq0}\}$$
は$e_i+e_j=e_{k_{i,j}}\in M$と和について閉じており、また$e_0=0\in M$と加法単位元も持っているのでこれはモノイドと呼ばれる集合の一つとなります。特に非負整数$\Z_{\geq0}$の部分モノイドであるので自然数モノイド(numerical monoid)と呼ばれます。詳しくは
英語版Wikipedia
を見てください。
また先に示したように$k,i,j$が負のときにも$A_k=N^{e_k}$(ただし$k<0$ならば$e_k<0$)が成り立ち、$e_i+e_j=e_{k_{i,j}}$という関係があるならば$e_k=e_1k$が成り立つのでしたが、これは有理整数環$\Z$の(加法についての)部分モノイドで負の数と正の数を同時に含むようなもの$I=\{e_k\mid k\in\Z\}$は$\Z$の(単項)イデアルであるということを示唆しています。
$k_0=0,\;k_{l+1}=k_{1,k_l}$とおく。このとき
$$A_{k_l}=A_1A_{k_{l-1}}=A_1^lA_{k_0}=c_0^l$$
や
\begin{align}
k_{l+2}-k_{l+1}
&=k_{1,k_{l+1}}-k_{1,k_l}\\
&=\sum^{k_{l+1}-1}_{k=k_l}(k_{1,k+1}-k_{1,k})\\
&\geq\sum^{k_{l+1}-1}_{k=k_l}1=k_{l+1}-k_l\quad\cdots(*)
\end{align}
が成り立つことに注意する。
いま$A_{k_{l+1}}=c_0A_{k_l}$から
$$c_0=\prod^{k_{l+1}-1}_{k=k_l}c_k$$
が成り立つので$c_0=\prod_{p|c_0}p^{e_p}$と素因数分解すると
$$k_{l+1}-k_l\leq\sum_{p|c_0}e_p$$
と有界であり、したがって$k_{l+1}-k_l$はある$L$から先$l\geq L$で一定とならなければならない。
また$(*)$の等号成立条件から$k\geq k_L$において
$$k_{1,k+1}-k_{1,k}=1$$
が成り立つこともわかる。
いま$l\geq L,k\geq k_L$において
$$k_l=al+b,\quad k_{1,k}=k+a$$
とおくと$A_{k+a}=A_1A_k$や$c_{k+a}=c_k$が成り立つ。特に
$$c_{k_l+s}\quad(s=0,1,\ldots a-1)$$
は$l$に依らず一定となるのでその値を$C_s$とおく。
ここで$A_{k_l}=c_0^l$より$A_{k_l}^2=A_{k_{2l}}$となることに注意すると、ある$k'_s$が存在して
\begin{align}
A_{k'_s}
&=A_{k_l+1}A_{k_l-s}\\
&=C_0A_{k_l}\c\frac{A_{k_l}}{\prod^s_{k=1}C_{a-k}}\\
&=C_0\c\frac{A_{k_{2l}}}{\prod^s_{k=1}C_{a-k}}\\
&=C_0A_{k_{2l}-s}
\end{align}
が成り立つ。このとき$k'_s=k_{2l}-s+1$とすると($s=0$のときは明らか)
$$A_{k'_{s+1}}=C_0A_{k_{2l}-s-1}=\frac{C_0A_{k_{2l}-s}}{C_{a-s-1}}=\frac{A_{k_{2l}-s+1}}{C_{a-s-1}}$$
より
$$A_{k_{2l}-s-1}< A_{k'_{s+1}}< A_{k_{2l}-s+1}$$
つまり$k'_{s+1}=k_{2l}-s$となることがわかるので、数学的帰納法により
$$A_{k_{2l}-s+1}=C_0A_{k_{2l}-s}$$
を得る。
特に
$$C_0=C_1=\cdots=C_{a-1}$$
が成り立つのでこれを$N$とおくとある$K$より先$k\geq K$において
$$A_{k+1}=NA_k$$
が成り立つことがわかり、また任意の$k$および$k'\geq K$に対し$k_{k,k'}=k'+e$とおくと
$$A_kA_{k'}=A_{k'+e}=N^e A_{k'}$$
が成り立つので
$$A_k=N^{e_k}$$
と表せることが示された。
我ながらこんな証明よく考えたなーと思います。
まあとにかく$N$進法ってよくできてるんだなーって思いました。
\begin{eqnarray} 1_{(!)}&=&1 \\11_{(!)}&=&3 \\111_{(!)}&=&9=3^2 \\1111_{(!)}&=&33=3\c11 \\11111_{(!)}&=&153=3^2\c17 \\111111_{(!)}&=&873=3^2\c97 \\1111111_{(!)}&=&5913=3^4\c73 \\11111111_{(!)}&=&46233=3^2\c11\c467 \\111111111_{(!)}&=&409113=3^2\c131\c347 \\1111111111_{(!)}&=&4037913=3^2\c11\c40787 \\11111111111_{(!)}&=&43954713=3^2\c11\c443987 \\111111111111_{(!)}&=&522956313=3^2\c11^2\c23\c20879 \\1111111111111_{(!)}&=&6749977113=3^2\c11\c821\c83047 \\11111111111111_{(!)}&=&93928268313=3^2\c11\c2789\c340183 \\111111111111111_{(!)}&=&1401602636313=3^2\c11\c107\c509\c259949 \\1111111111111111_{(!)}&=&22324392524313=3^2\c11\c225498914387 \\11111111111111111_{(!)}&=&387011820620313=3^2\c11\c163\c20143\c1162943 \\111111111111111111_{(!)}&=&6780385526348313=3^2\c11\c19727\c3471827581 \\1111111111111111111_{(!)}&=&128425485935180313=3^2\c11\c29\c43\c1621\c641751001 \\11111111111111111111_{(!)}&=&2561327494111820313=3^2\c11^2\c53\c67\c662348503367 \end{eqnarray}
何かありそうと思いましたが特に何もなさそうでした。$N$進数のレピュニットが
$$\sum^n_{k=0}x^k=\frac{x^k-1}{x-1}$$
に$x=N$を代入したものだったのに対して階乗進数のレピュニットは
$$\sum^n_{k=1}x^{\ol{k}}=x+x(x+1)+x(x+1)(x+2)+\cdots$$
に$x=1$を代入したものとみなせます($x^{\ol k}$は上昇階乗)。
\begin{eqnarray}
\sum^1_{k=1}x^{\ol k}&=&x
\\\sum^2_{k=1}x^{\ol k}&=&x(x+2)
\\\sum^3_{k=1}x^{\ol k}&=&x(x+2)^2
\\\sum^4_{k=1}x^{\ol k}&=&x(x+2)\Big(x+2+(x+1)(x+3)\Big)
\\&=&x(x+2)(x^2+5x+5)
\\\sum^5_{k=1}x^{\ol k}&=&x(x+2)\Big(x+2+(x+1)(x+3)(x+5)\Big)
\\&=&x(x+2)(x^3+9x^2+24x+17)
\\\sum^6_{k=1}x^{\ol k}&=&x(x+2)\Big(x+2+(x+1)(x+3)(x+5)^2\Big)
\\&=&x(x+2)(x^4+14x^3+68x^2+131x+77)
\\\sum^7_{k=1}x^{\ol k}&=&x(x+2)\Big(x+2+(x+1)(x+3)(x+5)\Big(x+5+(x+4)(x+6)\big)\Big)
\\&=&x(x+2)(x^5+20x^4+151x^3+529x^2+833x+437)
\\\sum^8_{k=1}x^{\ol k}&=&x(x+2)\Big(x+2+(x+1)(x+3)(x+5)\Big(x+5+(x+4)(x+6)(x+8)\Big)\Big)
\\&=&x(x^6+27x^5+290x^4+1571x^3+4458x^2+6107x+2957)
\\\sum^9_{k=1}x^{\ol k}&=&x(x+2)\Big(x+2+(x+1)(x+3)(x+5)\Big(x+5+(x+4)(x+6)(x+8)^2\Big)\Big)
\\&=&x(x+2)(x^7+35x^6+505x^5+3870x^4+16860x^3+41164x^2+50819x+23117)
\\\sum^{10}_{k=1}x^{\ol k}&=&\Big(x+2+(x+1)(x+3)(x+5)\Big(x+5+(x+4)(x+6)(x+8)\Big(x+8+(x+7)(x+9)\Big)\Big)\Big)
\\&=&x(x+2)(x^8+44x^7+819x^6+8387x^5+51379x^4+191167x^3+416230x^2+473387x+204557)
\end{eqnarray}
うーん。