株式会社タフス

折り紙を何回折ったら月まで届く?

先日、 「折り紙を何回折ったら月まで届くか」子供に聞かれました。(学校の宿題らしい)

​月までは 384,400Km で、「1回折ったら2倍、2回折ったら4倍だから、、、」

2の階乗(回) 折った厚さが答えというところまで考えたのですが、結局は Google で調べました。

紙の厚さを 0.1mm としたとき 答えは、42回 だそうで、直感的には「そんなに少ないの??」という感じがしたので、実際に確かめました。


高さ: H 、折る回数: y、 紙の厚さ: X としたとき、高さを求める式は、

H = 2^yX

両辺をXで割って対数を取ると
frac{H}{X} = 2^y log_2frac{H}{X} = log_22^y log_2H – log_2X = y

折る回数を求める式は 以下となります。

y = log_2H – log_2X

Python で確かめると

import math

def origami(h: int, x: float) -> float:
    # メートルをミリメートルに変換
    h_mm = h * 100 * 10
    # 折る回数 = log2高さmm - log2紙の厚さ
    return  math.log2(h_mm) - math.log2(x)

def check_answer(ori_count: float, x: float):
    # 確かめ算(折り紙の高さ = 2**折る回数*紙の厚さ ) 単位:メートル
    ori_height = 2**math.ceil(ori_count)*x / 10 / 100
    print(f"計算した答え:折り紙を {ori_count:.2f} 回 折ると その高さまでいける")  
    print(f"確認した答え:折り紙を {math.ceil(ori_count)} 回 折ったら 高さは {ori_height:,.0f}メートル")

# 月: 3,844,000 km (384,400,000 m) 折り紙: 0.1 mm
h=384400000
x=0.1
ori_count = origami(h, x)
check_answer(ori_count, x)

実行結果は以下となり、やっぱり 42回となりました。

計算した答え:折り紙を 41.81 回 折ると その高さまでいける
確認した答え:折り紙を 42 回 折ったら 高さは 439,804,651メートル

以下のサイトを参考にさせてもらいました。ありがとうございました。

https://qiita.com/uichi/items/1002745259893326ccfd