RPGツクールと数学のブログ

RPGツクールと数学についてのブログです。

羊を9000兆匹数えるのに何年掛かるか

羊が一匹、羊が二匹、羊が三匹、……と続けていって、9000兆匹数えるまで何年掛かるか??という問題を考えます(出処はyahoo知恵袋です)。

一匹数えるのに掛かる時間を9000兆倍すれば求まりそうですが、より正確に求めようと思ったら、徐々に1匹を数える時間が遅くなっていくことを考慮すべきです。例えば「羊が一匹」と「羊が九千九百九十九匹」では、後者の方が読むのに時間が掛かりますよね。なので、正確に求めようと思ったら羊の数ではなく、読み上げ文字数を使って求めるのが良いでしょう。そこで、9000兆匹読み上げるまでの総字数を計算することにします。

数の読み字数関数f, gを定義する

例えば123は、「ひゃくにじゅうさん」で7音だから、f(123)=7となるような、数の読み字数関数fを考えます。すると、「ひつじがxひき」は (f(x)+6)字 になります。

数の読み方には濁りがありますが、以下のとおり字数は変わらないので、濁りは気にしないものとします。

「ひき」「びき」「ぴき」→ いずれも2字
「いっぴき」「いちひき」→ いずれも4字

まずは便宜上、f(0)=0と定義します(「ぜろ」は対象外とする)。次に、以下は定数として与えておくことにします。

f(1)=2(「いち」)
f(2)=1(「に」)
f(3)=2(「さん」)
f(4)=2(「よん」)
f(5)=1(「ご」)
f(6)=2(「ろく」)
f(7)=2(「なな」)
f(8)=2(「はち」)
f(9)=2(「きゅう」)

次に、桁用の読み字数を、別の関数g(x)で定義します。こんな感じです。

g(10)=2(「じゅう」)
g(100)=2(「ひゃく」)
g(1000)=2(「せん」)
g(10000)=2(「まん」)
g(100000000)=2(「おく」)
g(1000000000000)=2(「ちょう」)

実際は「垓(がい)」まで2が続くので、今回考える範囲では、常にg(x)=2と考えてよいことになります。

なんでfとgで関数を分けるかというと、日本語の数の読み方の都合です。

例えば「じゅう」は「いちじゅう」とは読まないけど、「まん」は「いちまん」と読みますよね。「十百千」と「万億兆京…」とで読み方が違います。f関数と一緒にすると不便なので、桁を表す「十百千」と「万億兆京…」の部分だけをg関数で表せるようにします。

f(1000)=g(1000)=2(「せん」)
f(10000)=f(1)+g(10000)=2+2=4(「いちまん」)

一万未満の読み字数を求める

それではf(x)を求めていきましょう。10≦x<100のときは、次のようにします:

f(34)=f(3)+g(10)+f(4)=2+2+2=6(「さんじゅうよん」)

間に「じゅう」を入れて前後分けるのです。ただし特別に、十の位が1の場合は読まないので、f(12)=g(10)+f(2) のように、f(1)を挿入しないものとします。

100≦x<1000のときは、次のようにします:

f(234)=f(2)+g(100)+f(34)

百の位だけを先頭に取り出すのです。こうすれば、後は再帰的に求まります。

f(34)=f(3)+g(10)+f(4)=6 であったから
f(234)=f(2)+g(100)+6=9
(「にひゃくさんじゅうよん」)

1000≦x<10000のときも同じです:

f(5678)=f(5)+g(1000)+f(678)
f(678)=f(6)+g(100)+f(78)
f(78)=f(7)+g(10)+f(8)
f(78)=6 から再帰的に
f(678)=f(6)+g(100)+6=10
f(5678)=f(5)+g(1000)+10=13 が得られる
(「ごせんろっぴゃくななじゅうはち」)

間の桁に数がない場合も、f(0)=0と定義したおかげで同様に求められます。

f(3040)=f(3)+g(1000)+f(40)
f(40)=f(4)+g(10)+f(0)=4 から
f(3040)=f(3)+g(1000)+4=8
(「さんぜんよんじゅう」)

この方法で、0≦x<10000の範囲のf(x)を求められるようになります。

一万以上の読み字数も求める

日本語の数詞は、「千百十」「億」「千百十」「万」「千百十」のように、桁の位取りが入れ子になっています。4桁区切りで「億」「万」などを間に入れ、さらにそれぞれの4桁を「千」「百」「十」で区切るような仕組みです。*1

だからf(x)も、x≧10000の場合は手続きを分ける必要があります。

やることは同じで、今度は4桁区切りにするだけです。

f(12345678)=f(1234)+g(10000)+f(5678)
4桁以下の場合はさっきまでの方法で読めるから
f(1234)=11
f(10000)=2
f(5678)=13
を使ってf(12345678)=26

「せん」と「いちまん」の違いがありますが、手続きを分けたことで解決します。

f(1000)=g(1000)=2 … 4桁以下の処理ではf(1)省略
f(10000)=f(1)+g(10000)+f(0)=4 … f(1)はそのまま

以上のことをまとめると、f(x)は以下で求められることになるます:

f(0)~f(9)は定数から得る それ以外の場合は
x≧10000なら、y=10000^[log(x)/4]、z=f([x/y])
10≦x<10000なら、y=10^[log(x)]、z=0([x/y]=1), f([x/y])([x/y]≠1) として
f(x)=z+g(y)+f(x mod y) とする
([・]は小数点以下切り捨て)

例えばf(315)は、上の式に当てはめると次のようになります。

y=10^[log(315)]=100、z=f([x/y])=f(3) として
f(315)=f(3)+g(100)+f(15) となり
f(15)は
y=10^[log(15)]=10、z=0([x/y]=1のため)として
f(15)=g(10)+f(5) となるので あとは定数を代入して
f(15)=2+1=3、f(315)=2+2+3=7 と求まる

(「さんびゃくじゅうご」)

これで任意のf(x)を計算できるようになりました。たとえば「羊が12345匹」を数えようと思ったら、f(12345)=16 なので、「羊が12345匹」はf(12345)+6=22字です。もし1秒4字で読めるとすれば、5.5秒かかることになります。

羊を9999匹まで数える

羊を9000兆匹まで数えると何文字になるかというと、「羊がx匹」のときに(f(x)+6)字なのですから、

(f(1)+6)+(f(2)+6)+(f(3)+6)+…+(f(9000兆)+6)

になるはずです。任意のf(x)が求められるようになったので、後は足していくだけですが、少し工夫が必要です。

まずは簡単のため、以下を求める方法を考えます。

f(0)+f(1)+f(2)+…+f(9)=16
f(0)+f(1)+f(2)+…+f(99)=480
f(0)+f(1)+f(2)+…+f(999)=8000
f(0)+f(1)+f(2)+…+f(9999)=112000

f(0)+f(1)+f(2)+…+f(9)=16 は、定義からすぐ求められます。

次に f(0)+f(1)+f(2)+…+f(99) を考えます。この範囲のf(x)は項が最大3つなので、
以下のとおり順番に第1項、第2項、第3項、と呼ぶことにします。

f(34)=f(3)+g(10)+f(4) だから
第1項=f(3)、第2項=g(10)、第3項=f(4)
10未満なら第3項のみで、第1, 2項は0

それぞれが現れる回数をカウントしましょう。

第3項は一の位に相当するから、f(0)+f(1)+…+f(9)が10回現れることになります。第2項は10~99の範囲でだけ現れるので、90回。第1項は、f(1)は省略するから、f(2)+…+f(9)が10回現れるものと考えます。(ちょっと難しいね…)

よって、f(0)+f(1)+f(2)+…+f(99)は次のようになります:

第1項の和=10(f(2)+…+f(9))=140
第2項の和=90g(10)=180
第3項の和=10(f(0)+f(1)+…+f(9))=160
以上の和なので、f(0)+f(1)+f(2)+…+f(99)=480となる

同様にして、f(0)+f(1)+f(2)+…+f(999)は次のようになります:

第1項の和=100(f(2)+…+f(9))=1400
第2項の和=900g(100)=1800
第3項の和=10(f(0)+f(1)+…+f(99))=4800
以上の和なので、f(0)+f(1)+f(2)+…+f(999)=8000

f(0)+f(1)+f(2)+…+f(9999)はこうです。だんだん法則が見えてくるはずです:

第1項の和=1000(f(2)+…+f(9))=14000
第2項の和=9000g(100)=18000
第3項の和=10(f(0)+f(1)+…+f(999))=80000
以上の和なので、f(0)+f(1)+f(2)+…+f(9999)=112000

10000匹以上数える

4桁区切りで手続きが違うので、4桁区切りでパターンが一新されます。f(0)+f(1)+f(2)+…+f(99999) は以下です:

第1項の和=10000(f(1)+f(2)+…+f(9))=160000
第2項の和=90000g(10000)=180000
第3項の和=10(f(0)+f(1)+…+f(9999))=1120000
以上の和なので、f(0)+f(1)+f(2)+…+f(99999)=1460000

f(0)+f(1)+f(2)+…+f(999999)は以下:

第1項の和=10000(f(0)+f(1)+…+f(99))=4800000
第2項の和=990000g(10000)=1980000
第3項の和=100(f(0)+f(1)+…+f(9999))=11200000
以上の和なので、f(0)+f(1)+f(2)+…+f(999999)=17980000

f(0)+f(1)+f(2)+…+f(9999999)は以下:

第1項の和=10000(f(0)+f(1)+…+f(999))=80000000
第2項の和=9990000g(10000)=19980000
第3項の和=1000(f(0)+f(1)+…+f(9999))=112000000
以上の和なので、f(0)+f(1)+f(2)+…+f(9999999)=211980000

f(0)+f(1)+f(2)+…+f(99999999)は以下:

第1項の和=10000(f(0)+f(1)+…+f(9999))=1120000000
第2項の和=99990000g(10000)=199980000
第3項の和=10000(f(0)+f(1)+…+f(9999))=1120000000
以上の和なので、f(0)+f(1)+f(2)+…+f(99999999)=2439980000

f(0)+f(1)+f(2)+…+f(999999999)は以下:

第1項の和=100000000(f(0)+f(1)+…+f(9))=1600000000
第2項の和=900000000g(100000000)=1800000000
第3項の和=10(f(0)+f(1)+…+f(99999999))=24399800000
以上の和なので、f(0)+f(1)+f(2)+…+f(999999999)=27799800000

こんな調子で9999兆まで求めてると以下になります:

第1項の和=1000000000000(f(0)+f(1)+…+f(9999))=112000000000000000
第2項の和=9999000000000000g(1000000000000)=19998000000000000
第3項の和=10000(f(0)+f(1)+…+f(999999999999))=375996000000000000
以上の和なので、f(0)+f(1)+f(2)+…+f(999999999999)=507994000000000000

9がいっぱいでゲシュタルト崩壊してきそうです。求めたいのは9000兆なので、類似の方法でf(0)~f(8999999999999999)の和を求めます:

第1項の和=1000000000000(f(0)+f(1)+…+f(8999))=100000000000000000
第2項の和=8999000000000000g(1000000000000)=17998000000000000
第3項の和=9000(f(0)+f(1)+…+f(999999999999))=338396400000000000
よって f(0)+f(1)+f(2)+…+f(8999999999999999)=456394400000000000

f(9000兆)=6 なので、上記に6を足して、

f(0)+f(1)+f(2)+…+f(9000000000000000)=456394400000000006

として求められました。以上から、9000兆匹数えたときの読み字数は、

(456394400000000006+6×9000兆)字
510394400000000006字

となります。

1秒4字のペースで読んでいたら、35兆時間≒40億年掛かる計算ですね。よって、羊を9000兆匹数えるまでに掛かる時間は40億年となります。想像以上に長い時間です……

地球は太陽と共に死ぬと言われています。太陽の寿命はあと50億年程だそうですから、地球もあと50億年程で死ぬのでしょう。そうすると、羊を9000兆匹数えたとしても、あと10億年は余ります。だから、そこは安心して数えられそうですね(????)

というか、そういうことより、元の質問者さんが何故こんな質問をしたのかの方がずっと気になります……

*1:こういう桁区切りの仕方を中数といいます。