手塚兎月の備忘録

チェス、ポケモン、数学、その他

二進数で求めてみたい

SNS

 5^n > 10^{19}となる最小のnを求めよ

が少し話題になりました。どこかの大学の入試問題らしいです。
明らかにn>19なので、元の問題は
5^a>2^{19}となる最小のaを求めよに言い換えられ、
n=a+19が答えになります。

さて、5^a>2^{19}を解いてみましょう。
ここで二進数を使ってみます。
理由は元の投稿者が\logを使わずに5の累乗の計算をしていました。
もっとシンプルに\logを使わずに解けないか、と考え、2の累乗があったので2進数を利用する方法を思いつきました。

2^{19}=(1000...00)_2
2^{19}は2進数では1の後に0が19個付く20桁の数として表現出来ます。
5=(101)_2は二進数でこう書けます。
注目すべきは桁の変動です。
つまり二進数の世界では、
5の累乗に5を掛けても高々2桁3桁*1しか変化しないことが予測できます。
なので、5の二乗なら高々4桁6桁しか変化しないことが予測できます。

というわけで、計算してみると
 
5^1 = (101)_2\\
5^2 = (11001)_2\\
5^4 = (1001110001 )_2\\
5^8=(1011111010111100001 )_2

5^8は二進数世界で19桁が分かりました。
これに5を掛けると高々2桁3桁の変動が起きるので、
5^9は二進数世界で20桁を超えるのが分かりました。
よってn=28

pythonで確かめてるので、大丈夫。

n =0
while 5**n<10**19:
    n+=1
print(n)

for i in range(2,10,2):
    a = 5**i
    binary_num = bin(a)
    print(binary_num ,len(binary_num)-2,i)
    if a>=2**19:
        print("n="+str(i))
        break

*1:筆算のイメージがあれば簡単にわかる。