nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

整数を英語で表現する3(巨大な数)

前回はthousand, million, billionの次は何かという話題で終わらせました。 この3桁区切りの単位さえわかれば、無限に数を表現できることになります。 どうも、この単位を求める方法は決まっておらず、色々あるようです。 本投稿では、 The Conway-Wechsler System という方法について説明していきます。


【注意】今回の内容はThe Conway-Wechsler Systemそのものなので、 英語がわかる人は下記ページを見た方が正確です。

The Conway-Wechsler System
http://www.mrob.com/pub/math/largenum.html#conway-wechsler

Wikipediaではまた違った方法で説明しているようです。 本投稿では説明するつもりはないですが興味がある方はどうぞ。

Names of large numbers
https://en.wikipedia.org/wiki/Names_of_large_numbers


それでは単位を求めて行きます。 まずは対象となる数が、何番目の単位に該当するのかを求めます。 数が10の何乗かを求めます。 10なら1、10,000なら4になります。

求めた数から3を引きます。 1,000なら3-3=0、1,000,000,000なら9-3=6です。

引いた数を3で割り、商と余りを求めます。 もし余りが0ならoneから、1ならtenから、2ならone hundredから始まることになります。 求めた商が重要であり、解説ではNと表現されていました。

もし商Nが10未満の場合は、下記の表によって決定されます。

商N 英語
0 thousand
1 million
2 billion
3 trillion
4 quadrillion
5 quintillion
6 sextillion
7 septillion
8 octillion
9 nonillion

商Nが10以上の場合は、 商Nの一の位、十の位、百の位の数の組み合わせによって文字列を求めます。 ひとまずは商Nが10~999までの場合を考慮しましょう。 ちなみに商Nが999というのは、元の数が3000桁の場合となります。

組み合わせの表を示します。

商N 1の位 10の位 100の位
0 - - -
1 un (n) deci (nx) centi
2 duo (ms) viginti (n) ducenti
3 tre (*) (ns) triginta (ns) trecenti
4 quattuor (ns) quadraginta (ns) quadringenti
5 quin (ns) quinquaginta (ns) quingenti
6 se (sx) (n) sexaginta (n) sescenti
7 septe (mn) (n) septuaginta (n) septingenti
8 octo (mx) octoginta (mx) octingenti
9 nove (mn) nonaginta nongenti

表より商Nの一の位、十の位、百の位の文字をつなげて文字列を作ります。 ただし()が隣り合っている場合は、カッコ内の文字が等しいときにその文字を入れます。
例えば

septe(mn) + (ms)viginti = septemviginti 

この例では、(mn)(ms)でどちらにもmが含まれているため、 文字mを二つの単語の間に入れました。
他には

se(sx) + (mx)octoginta = sexoctoginta

カッコが連結しているのは一の位と十の位、あとは一の位と百の位であり、 十の位と百の位ではカッコが隣り合っていないので注意。

特別な場合として、一の位のtre(*)があります。 これは、隣り合っているカッコにsxが含まれている場合には、 文字sを入れます。
例えば

tre(*) + (mx)octingenti = tresoctingenti

この例では、(*)(mx)が隣り合っており、文字にxがあるため、 文字xではなく文字sを挿入しています。

求めた英単語の最後の母音を削除します。 母音はa,i,u,e,oであり、例えば次のようになります。

tresoctingenti → tresoctingent

英単語の最後に文字illionをつけます。 例えば下記の通り。

tresoctingent → tresoctingentillion

完成です。

例を挙げます。

英語
10の261乗 sexoctogintillion
10の2421乗 sexoctingentillion
10の309乗 duocentillion
10の603乗 ducentillion
10の312乗 trescentillion
10の903乗 trecentillion

以上で、商Nが0~999まで説明はしました。 では商Nが999が超えた場合を説明します。

まずは商Nを3桁区切りにします。 例えば求めた商Nが987654321であった場合は、

987,654,321

となります。考え方としては、

987 illi 654 illi 321 illion

のように、文字を少し変えて横に直列でつなぐことで求めます。 それぞれ3桁の単位を求めると次のようになります。

987    septemoctogintanongentillion
654    quattuorquinquagintasescentillion
321    unvigintitrecentillion

321以外の単語の最後についている「on」削除します。

987    septemoctogintanongentilli ★on削除
654    quattuorquinquagintasescentilli ★on削除
321    unvigintitrecentillion

単語をつなげます。

septemoctogintanongentilliquattuorquinquagintasescentilliunvigintitrecentllion

非常に長いが完成です。 あまりに長すぎるようにも思えますが、そもそも商Nが987654321という場合は 元々の数の桁数が2962962966であり、30億個近くも数値が連なる場合なので 単位もここまで長くなってしまうのです。

このアルゴリズムでは、単位が必ずillionで終わることが前提となっているのですが、 たった一つだけ、商Nが0の時はthousandなのでillionで終わりません。 そこでthousandではなく、nillionという表記で代用します。

例を挙げます。

1000        millinillion  (million + thousand)
1001        millimillion
1002        millibillion
1003        millitrillion
1013        millitredecillion
1234        milliquattuortrigintaducentillion
6560        sextillisexagintaquingentillion
19683       novendecillitresoctogintasescentillion
1000000     millinillinillion

以上で説明は終わりですが、注意点をいくつか。 このアルゴリズムは絶対ではなく、方言が色々あるようです。 基本的な考え方はラテン語をベースとしているようで、 ラテン語にとって自然な場合はこっちだろうということで、 人によって色んな考え方があるようです。

解説しているリンク先では詳しく説明されていますが、 例えば

The Conway-Wechsler Systemでは
    quinquadecillion, sedecillion, and novendecillion
だが、
    quindecillion, sexdecillion and novemdecillion
としてよく知られているとか、
    millinillion
ではなく
    millillion
と表現する場合があるとか、
    quinqua
より
    quin
の方が自然だろう

とかが話題として出ているので、 もし他のシステムと相違があって困った場合は確認してみてください。 例えば2の200乗の例では、sbclclispでは

one novemdecillion

で始まりますが、The Conway-Wechsler Systemでは

one novendecillion

となります。

その他にもWikipediaに載っている方法も何となく違って見えます。

Names of large numbers
https://en.wikipedia.org/wiki/Names_of_large_numbers


ここまででThe Conway-Wechsler Systemの解説は終わりですので、 最後にいくつか話題を残します。 まずは、本解説を用いて出力した2の200乗の結果を下記に示します。

one novendecillion, six hundred and six octodecillion, nine hundred and thirty-eight septendecillion, forty-four sedecillion, two hundred and fifty-eight quindecillion, nine hundred and ninety quattuordecillion, two hundred and seventy-five tredecillion, five hundred and forty-one duodecillion, nine hundred and sixty-two undecillion, ninety-two decillion, three hundred and forty-one nonillion, one hundred and sixty-two octillion, six hundred and two septillion, five hundred and twenty-two sextillion, two hundred and two quintillion, nine hundred and ninety-three quadrillion, seven hundred and eighty-two trillion, seven hundred and ninety-two billion, eight hundred and thirty-five million, three hundred and one thousand, three hundred and seventy-six

せっかくなのでgoogolについての話題もしておきます。 googolとは「10の100乗」を意味しており、 wikipediaによると検索サイトgooglegoogolの誤字がもとになっているとのこと。

The Conway-Wechsler Systemによると、10の100乗は下記のようになります。

ten duotrigintillion

あと、商Nが0から1000くらいまでならnptのテストケースに例がありますので示します。

https://github.com/nptcl/npt/blob/v0.1.1/test/case_large.txt

次の投稿では序数と負数について説明します。