2の256乗は10進数で何桁の数なのか知りたい。
知りたい理由
仮想通貨(例えばBitcoin)では、256bit(2^256)の乱数(つまり2^256パターンの中から)からアドレスが生成されます。
乱数からアドレスを生成すると聞くと「え、重複しないの?」という疑問がわきます。それに対する回答は、
2^256は十分に大きい数だから重複しません(但し、エントロピーが十分な場合)
という回答になるのですが、2^256がどのくらいの数字か説明に苦労します。
せめて10進数で何桁か?くらいは説明したいものです。
方針
10進数で何桁か?というのは10の何乗程度の数字なのか?を求めればよい。
例えば、125は、
1.25 \times 10^{2}
と表すことができるため、2桁であることがわかる。
今回は桁数だけわかればいいので、2^256が、
X \times 10^{n}
と表される場合のnを求めれば良い(Xの数字は不要)。
道具1
まず、利用するのは下記の関係式。10進数において以下の関係式が成り立つ。
10^{n-1} \leqq A < 10^{n} \Leftrightarrow n-1 \leqq \log_{10} A < n
つまり、
10^{n-1} \leqq 2^{256} < 10^{n} \Leftrightarrow n-1 \leqq \log_{10} (2^{256}) < n
という関係が成り立つということなので、
\log_{10} (2^{256})
が求められればおおよその桁数がわかるということになる。
解説はこことか見るといいでしょう。勉強になります。
道具2
結論から先にいえば、
\log_{10} (2^{256})
は、底の変換公式
\log_a X = \log_b X / \log_b a
により、下記のように変換できる。
\log_{10} (2^{256}) = \log_{2} (2^{256}) / \log_{2} 10
底を2の式に変換している。理由は後々計算しやすいから(特にlog2 2^256の方)。解説はここ。
また、
\log_{2} 10
は、
\log_a X = 1 / \log_x a
という関係式により、
1 / \log_{10} 2
と変換できるため、
\log_{10} (2^{256}) = \log_{2} (2^{256}) * \log_{10} 2
と表現することができる。
ここで、
\log_{2} (2^{256})
は、2をn乗した場合に2^256になる数なので、そのまま256であることがわかる。
また、
\log_{10} 2
は、常用対数表から、0.301なのがわかる。
そのため、最終的に、
\log_{10} (2^{256}) = 256 * 0.301 = 77.056
となり、桁数nは、
n-1 \leqq 77.056 < n
あたりということになる。
Googleで「2の256乗」と検索すると、1.1579209e+77と出ますね。
これは「宇宙にある陽子の数」とされるエディントン数(136 * 2^256)に近い数字であり、膨大な数だということがわかります。
現在、エディントン数はやや補正されているようです。
応用
IPアドレスの枯渇
IPアドレス(正確にはIPv4)は192.168.111.111などと、32bitで表される一意な数字である。
つまり、2^32パターンのアドレスが存在することになる。これは、10進数でどれくらいの数だろうか?
上記の関係から2^32の桁数は、
\log_{10} (2^{32}) = 32 * 0.301 = 9.623桁の数
となる。これは、実際には42.9億程度の数である。これでは、世界人口70億人が一人1台スマホを保有した場合、アドレスが割り振りきれないのがわかります。
そこで、桁数を増やしたのがIPv6。IPv6では、アドレスが128bit、つまり2^128パターンに拡張されました。
では、これは何桁くらいの数でしょか?
\log_{10} (2^{128}) = 128 * 0.301 = 38.528桁の数
となります。これは、IPv4の約43億個に43億 x 43億 x 43億を更に掛けたくらいの量となり、十分な数となる。
2の累乗
お気づきかと思いますが、2の累乗が何桁なのかは、
2^{n}が何桁か? = n * 0.301
で求めることができるということです。