3

2のn乗の数列の最上位桁の数を調べる

293
0

an:=2nからなる数列{an}n=1Nについて考えます。

例えば、N=5のとき、{an}n=15=2,4,8,16,32.です。Nがある程度大きいときの挙動を見たいので、Python言語でプログラミングをしてみましょう。

N=100のとき、

      N = 100
a = [2 ** i for i in range(1, N + 1)]
print(a)
    

というPythonプログラムを実行すれば、

      [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808, 18446744073709551616, 36893488147419103232, 73786976294838206464, 147573952589676412928, 295147905179352825856, 590295810358705651712, 1180591620717411303424, 2361183241434822606848, 4722366482869645213696, 9444732965739290427392, 18889465931478580854784, 37778931862957161709568, 75557863725914323419136, 151115727451828646838272, 302231454903657293676544, 604462909807314587353088, 1208925819614629174706176, 2417851639229258349412352, 4835703278458516698824704, 9671406556917033397649408, 19342813113834066795298816, 38685626227668133590597632, 77371252455336267181195264, 154742504910672534362390528, 309485009821345068724781056, 618970019642690137449562112, 1237940039285380274899124224, 2475880078570760549798248448, 4951760157141521099596496896, 9903520314283042199192993792, 19807040628566084398385987584, 39614081257132168796771975168, 79228162514264337593543950336, 158456325028528675187087900672, 316912650057057350374175801344, 633825300114114700748351602688, 1267650600228229401496703205376]
    

のように、{an}n=1100の値が簡単に得られます。

次に、この数列に関して、

  • 161
  • 5125
  • 20482

のような最上位桁の数が何であるのかについて、数え上げてみます。
上のプログラムに続けて

      import numpy as np
counter = np.zeros(10)

for x in a:
    index = int(str(x)[0])
    counter[index] += 1

for (i, x) in enumerate(counter):
    print(f"{i}: {x:.0f}")
    

と実行すれば、(各数字を文字列として見て、1番最初の文字を数値に変換しています。)

      0: 0
1: 30
2: 17
3: 13
4: 10
5: 7
6: 7
7: 6
8: 5
9: 5
    

のように結果が得られます。最上位の桁が1のものが一番多く、大きくなるにつれて少なくなっていることがわかります。

次に、この結果を棒グラフにしてみます。上のプログラムに続けて

      import matplotlib.pyplot as plt

plt.xlim(0, 10.0)
plt.ylim(0, 0.34)
plt.bar(np.arange(1, 10), counter[1:10]/N, tick_label=np.arange(1, 10), alpha=0.8)

plt.show()
    

と実行すれば、

とグラフが得られます。ここで、グラフの縦軸は、N全体に対する割合です。たとえば、最上位桁が1であるan (a4=16, a7=128, a64=18446744073709551616)が約3割であり、最上位桁が4であるan (a12=4096, a22=4194304, a52=4503599627370496)が約1割であることなどがわかります。

さて、上の分布は何に従っているのでしょうか。log1020.301,log101.5=log103log1020.176ですし、なんだかy=log10x+1xに近い気がするので、上の棒グラフに重ねて描画してみましょう。

      import matplotlib.pyplot as plt
import numpy as np

N = 100
a = [2 ** i for i in range(1, N + 1)]
counter = np.zeros(10)

for x in a:
    index = int(str(x)[0])
    counter[index] += 1


plt.xlim(0, 10.0)
plt.ylim(0, 0.34)
plt.bar(np.arange(1, 10), counter[1:10]/N, tick_label=np.arange(1, 10), alpha=0.8)

x = np.linspace(0.1, 10.0, 1000)
plt.plot(x, np.log10((x+1)/x), color='red', alpha=0.8)

plt.show()
    

良さそうな気がします。

また、Nを変えて実行してみると、Nが大きいほど、2つのグラフの取る値が近づいていく気もします。

N = 10 N = 10

N = 1000 N = 1000

N = 10000 N = 10000

実際、数式として次が成り立ちます。(等式の左辺が棒グラフ、右辺が曲線のグラフに対応しています。)

Sd(N):={an}n=1Nのうち、最上位桁がdのもの全体の集合
とする。このとき、
limN#Sd(N)N=log10d+1d

  1. 2nの最上位桁がd log10dnlog102nlog102<log10(d+1)

    )
    2nlog102n+1=nlog102+1桁であるから、
    (LHS)d10(nlog102+1)12n(d+1)10(nlog102+1)1log10d+nlog102nlog102<log10(d+1)+nlog102(RHS)
  2. log102は無理数である。

    )
    log102が有理数であると仮定する。このとき、log102>0より、
    log102=qp(p, qZ>0, GCD(p, q)=1)
    と書ける。このとき、
    10qp=2
    であり、両辺p乗して
    10q=2p5q2q=2p
    qZ>0より、左辺は素因数に5を持つが、右辺は素因数に5を持たず、素因数分解の一意性に反する。したがって、log102は無理数である。
  3. limN#Sd(N)N=log10(d+1)log10d

    )1., 2. Weyl's equidistribution theorem。
  4. log10(d+1)log10d=log10d+1d

    )対数の性質。

投稿日:2022820
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中