無限10進数展開について 〜2乗して元に戻る数を例に〜

この記事は、[Supershipグループ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/supership) の1日目の記事になります。

今回は無限$10$進数展開について書きたいと思います。
予備知識は特にないのでそういうのもあるんだと気軽に読んで頂ければ幸いです。

## 問題
いきなりですが問題です。

**問題　『2乗しても下1桁が変わらない数はどういう数があるでしょうか？』**

少し考えると分かるように 
$$
\begin{array}{ll}
 0 \times 0 = 0 \\\\ 
 1 \times 1 = 1 \\\\
 5 \times 5 = 25 \\\\ 
 6\times 6 = 36 
 \end{array}$$
 
なので答えは**0と1と5と6**です。

では次の問題です。
**問題　『2乗しても下2桁が変わらない数はどういう数があるでしょうか？』**
これはちょっと面倒なのでプログラムで解きましょう。

```python
for i in range(1,100):
    if i**2 % 100 == i:
        print(i)
```

というコードを実行すると **25, 76**という答えを得ます（0,1は自明なのでもう今後は省略していきます）。
実際に計算してみると
$$
\begin{array}{ll}
25 \times 25 = 625 \\\\
76 \times 76 = 5776
 \end{array}
$$
なので確かに2乗しても下2桁が一致しています。


さて下３桁、下４桁、下N桁での解は？と続けていくとこんな数列を得ます。
$$
\begin{array}{ll}
5 & 6 \\\\
25 & 76 \\\\
625 & 376 \\\\
0625 & 9376 \\\\
90625 & 09376 \\\\
890625 & 109376 \\\\
2890625 & 7109376 \\\\
12890625 & 87109376 \\\\
\vdots & \vdots
\end{array}
$$

## 考察
これらの数のペアについてそれぞれ足し算、掛け算を計算してみましょう。

$$
\begin{array}{ll}
5 + 6 = 11 & 5 \times 6 = 30 \\\\
25 + 76 = 101 & 25 \times 76 = 1900 \\\\
625 + 376 = 1001 & 625 \times 376 = 235000 \\\\
625 + 9376 = 10001 & 625 \times 9376 = 5860000 \\\\
90625 + 9376 = 100001 & 90625 \times 9376 = 849700000 \\\\
890625 + 109376 = 1000001 & 890625 \times 109376 = 97413000000 \\\\
2890625 + 7109376 = 10000001 & 2890625 \times 7109376 = 20550540000000 \\\\
12890625 + 87109376 = 100000001 & 12890625 \times 87109376 = 1122894300000000 \\
\end{array}
$$

なんか面白いことになってきましたね。

これらの数の下N桁だけを見ると、以下のことがわかります。

 - 足し算の方だと $\ldots$00001 という感じになりそう。
 - 掛け算の方だと $\ldots$00000 という感じになりそう。
 - 下N桁だけを見つめると $\ldots00001 = 1$ と捉えられるし、 $\ldots00000 = 0$ とも捉えられる。
 - となると0でない2つの数の掛け算が0になっている？

ここで当初の問題を非常にざっくり考えてみましょう。
2乗しても下N桁が変わらないということを（不正確に）書くと $$x^2 = x$$ と思うことにします。
これを中学生の問題として考えると、方程式の解は
$$ x(x-1) = 0 $$より $x = 0,1$を得ます。
また、ここで解と係数の関係を思い出してみると、 $$x^2 - x = 0$$の2解 $\alpha, \beta$について
$$
\alpha + \beta = 1 \\\\
\alpha  \beta = 0
$$
を満たします。
今回は $\alpha = 0, \beta=1$だったので解と係数の関係を満たすことは明らかです。

さて、我々が考えた問題は $$x^2 = x$$ が下N桁で成立するという問題でした。
この場合に0,1以外の解（25とか76とか）が出てくることは上で見たとおりですが、こちらの解も、下N桁を見ると解と係数の関係を満たしていそうです。

なんかよく分からないところから0,1以外の解が出てきました。
これらは一体なんなのでしょうか

## 数学的背景
これらの解の正体は無限 $m$ 進数と呼ばれるものです。
通常の10進数は我々が普段使っている数ですが、無限 $m$ 進数では
$$
11 \\\\
101 \\\\
1001 \\\\
10001 \\\\
100001 \\\\
\vdots
$$
のように無限に続いていく「数列」を一つの「数」とみなします（この場合は下N桁を見て1とみなす）。
少し詳しく書くと、

$$
a_1 = 11 \text{の下1桁} = 1 = 1\\\\
a_2 = 101 \text{の下2桁} = 01 = 1\\\\
a_3 = 1001 \text{の下3桁} = 001 = 1 \\\\
a_4 = 10001 \text{の下4桁} = 0001 = 1 \\\\
a_5 = 100001 \text{の下5桁} = 00001 = 1 \\\\
\vdots
$$
という数列を一つの「数」と考えます。
各 $a_N$ は整数を $10^N$ で割った余りの世界に住んでいます。
下 $N$ 桁を取る操作というのは $10^N$ で割った余りを取る操作に対応していたわけですね。

このような数列を考えることで左側に無限に伸びていく数というものを正当化できるようになります。
別の例だと途中で出てきた数列
$$
\begin{array}{ll}
5  \\\\
25 　　\\\\
625  \\\\
0625 \\\\
90625 \\\\
890625 \\\\
2890625  \\\\
12890625  \\\\
\vdots 
\end{array}
$$
なども、数列を「数」と捉えることで、左側に無限に続く一つの「数」として取り扱うことが可能になります。
この「数」は $x^2 = x$　を満たす「数」になっています。
これらの数を無限10進数と呼びます。
10で割った余りを取る操作を、 $m$ で割った余りを取ると一般化すれば無限 $m$ 進数の定義も可能です。

また、『無限10進数の世界で2次方程式を考えると、解が2つになるとは限らない』という事実が $x^2 -x = 0$ を考えて解が4つ出てきたことの背景です。
これは10という数が $2\times5$ と因数分解できることが原因です。
10で割った余りの世界では $2\times5 = 0$ と0でない2つの数をかけて0になってしまいます。
本質的には10という数が素数ではないということから起因していました。


というわけで10で割った余りではなく素数 $p$ で割った余りの世界で同様に数列を一つの数と捉えるとどうなるだろうかと考えたくなります。
こちらが $p$ 進数と呼ばれるもので、整数論では非常に基本的な概念として現れます。
$p$ 進数、面白いですよ。

以下専門家向け：
今回は逆極限 $\varprojlim_n \mathbb{Z} / 10^n\mathbb{Z}$ の元を無限10進数と定義しました。
この逆極限を係数とする2次方程式は解が2つではなかったですが、これは整域ではないことに由来します。
一般に整域 $R$ 係数の$n$次方程式はたかだか $n$ 個の解を $R$ に持つことが知られています。
$p$進数は整域なので今回のように2次方程式の解が4つ出てくることはありません。嬉しいですね。

## 最後に
Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership株式会社 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。

## 参考文献
天に向かって続く数, 加藤文元, 中井保行, 日本評論社

僕がざっくり書いた話はここで丁寧に証明や他の例も述べられています。
高校生の頃にこういう本を読みたかった。