光は東方より−西洋では悪魔の数え方 インド,中国,日本の合理的な数え方

J言語研究会資料 2002/03/16
光は東方より−西洋では悪魔の数え方
インド,中国,日本の合理的な数え方
西川 利男
0.はじめに
上のような言い方などしたら, 国 際 的 に は と ん で も な い,不 穏 当 だ,ときつい
クレームがつきそうである.しかし,あとになってよく考えると,なるほどと
納得されるはずである.
このようなタイトルをつけたもうひとつのねらいは次のことにある.実はわ
たくし,昨年7月から東京,お台場に新しく開館した日本科学未来館で,
「情報
科学技術と社会」という部門のボランティアを行っている.それとは違う部門
で「実験工房」というのがある.例えばおもちゃロボットを組み立てたり,超
伝導の磁気浮上の実験を行ったりという体験コーナーである.
そこで,情報科学に関連した一種のものづくり実験の場として「コンピュー
タ・プログラミング工房」というのが出来たら良いとかねて提言している.そ
のプログラミング環境としてJ言語を用い,広く一般の人にJ言語を知っても
らい,併せてプログラミングの楽しさを体験してもらうよう,働きかけている.
まず,手始めとして去る2月3日(日)に内部のスタッフ向けにSWS セミ
ナーとして「J言語の紹介とその利用」という題で一時間程度の講演・デモを
行った.まだ,一般向けのセミナーの企画まで至ってはいないが,それをねら
うためのは,多少ショッキングなタイトル付けが必要になる.
一応,次のようなテーマを考えているが,諸兄姉のご意見をいただきたいと
思う.
第1話「お風呂の中の算数」 1,2,3,..100 と数えるところからはじめよう
第2話「お買い物は安くて,良いものを」 スーパーの値段調べから統計数学
へ
第3話「いろいろな国のあいさつと数え方−西洋の数と東洋の数」コンピュ
ータ翻訳への入り口
第4話「図形で楽しむコンピュータ」 3次元グラフィックス,立体視,フラ
クタル,カオス
1
1.いろいろな国のことばで数える
まずは日本語,中国語,英語,ドイツ語,フランス語,スペイン語,エスペ
ラント語で100までの数の数え方から始めよう.
日本語
いわずもがなだが,あらためて非常に.
中国語
合理的であることがわかる
英語
11, 12, .. 20 までが少々ややこしいがまだ許せる.
ドイツ語
20, 21, .. は合理性をたっとぶドイツにしては変だ.
フランス語
まさに悪魔の数え方である.これでは高尚な数学の理論は
こねられても,お店のオバサンはさぞや困っているだろう.
スペイン語
英語と同程度で標準的ヨーロッパ流の数え方である.
エスペラント語 さすがだ.日本語,中国語と同様合理的である.
フランス語について,そのややこしさを示す.
1 un
2 deux
3 trois
4 quatre
5 cinq
6 six
7 sept
8 huit
9 neuf
10 dix
11 onze
12 douze
13 treize
14 quatorze 15 quinze
16 seize
17 dix-sept 18 dix-huit 19 dix-neuf
つづいて
20 vingt
21 vingt et un
22 vingt-deux
23 vingt-trois
30 trente
31 trente et un
32 trente-deux
40 quarante 41 quarante et un
50 cinquante 51 cinquante et un
60 soixante 61 soixante et un
69 soixante-neuf
これからが,ややこしくなる
70 soixante-dix
71 soixante et onze
79 soixante-dix-neuf
80 quatre-vingts
81 quatre-vingt-deux
89 quatre-vingt-neuf
90 quatre-vingt-dix 92 quatre-vingt-onze
99 quatre-vingt-dix-neuf
で,100 cent となる.
100までの任意の数を通常の数字で入力し,これを各言語の数え方に直し
て表示するプログラムをJで作った.プログラム・リストは最後に示す.フラ
ンス語だけは特別の関数を作ったが,悪魔の数え方の名に恥じない中々の複雑
なアルゴリズムである.
実行例を示す.
run ''
お好きな数(<100)を入れてください
8
日本語:
はち
中国語:
八 パー
2
英語:
eight
ドイツ語:
acht
フランス語:
huit
スペイン語:
ocho
エスペラント語: ok
*** 何語がよいですか? ***
run ''
お好きな数(<100)を入れてください
41
日本語:
よんじゅういち
中国語:
四十一 スーシーイー
英語:
forty one
ドイツ語:
einundvierzig
フランス語:
quarante et un
スペイン語:
cuarenta y uno
エスペラント語: kvardek unu
*** 何語がよいですか? ***
run ''
お好きな数(<100)を入れてください
72
日本語:
ななじゅうに
中国語:
七十二 チーシーアル
英語:
seventy two
ドイツ語:
zweiundsiebzig
フランス語:
soixante-douze
スペイン語:
setenta y dos
エスペラント語: sepdek du
*** 何語がよいですか? ***
run ''
お好きな数(<100)を入れてください
95
日本語:
きゅうじゅうご
中国語:
九十五 チューシー ウー
英語:
ninty five
ドイツ語:
fuenfundneunzig
フランス語:
quatre-vingt-quinze
スペイン語:
noventa y cinco
エスペラント語: nawdek kvin
*** 何語がよいですか? ***
3
2.古代ローマの計算は大変だった
次に西洋の源泉である古代ローマに始まり中世を通じて使われたローマ数字
(時計数字)を扱ってみよう .
通常の数表記−とくに空位の桁 ’ 0’ を考慮した表記法はインドに始まると
いわれるが,これはアラビアに伝わり(日本ではアラビア数字といわれるが),
現代の数表記となった.
一方,ローマ数字は空位の’ 0’がないのは,中国,日本と同じだが,次のよう
な(人間的といえばそれまでだが),表し方をする.
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
10: X
さらに続いて 100 は C,1000 は M と別の文字を使う.これを空位の桁をあけ
ずに続け書きする.
パリの大学や寺院の入り口の壁に創立の年などがローマ数字で記されている
とそれなりにカッコいいが,これを判読するには理屈はわかっていてもちょっ
と見ただけでは読めたものではない.
以下のJのプログラムを作った.
通常数→ローマ数 rom
ローマ数→通常数 drom
実行例は次のようである.
rom 2313
MMCCCXIII
rom 2303
MMCCCIII
rom 1998
MCMXCVIII
drom 'MMCCCXIII'
2313
drom 'MMCCCIII'
2303
drom 'MCMXCVIII'
1998
アルゴリズムの詳細はプログラム・リストを見ていただくとして,これは基
底変換などというよりは一種の機械翻訳である.とくに空位の桁に ’0’ をつけ
ずベッタリ書いたローマ数字表記から J のボックスを用いて区切る処理はまさ
に Persing でかなり複雑なプログラムになる.
4
3.おわりに
古代ローマ時代では筆算というより計算にはソロバンを用いたというが,よ
くこれでローマ帝国の経済から凱旋門やコロッシウムなど土 木,建築の計算が
できたものとふしぎにさえ思える.それに引き替え,インドの数表記,’0’ の
採用,また10進法に徹した中国,日本の数表記の合理性−「これぞ光は東方
より来たれり」,といっても良い.最近の元気を喪失した日本のありさまをみる
につけても,自らにも聞かせつつ「もう少し自信を持って」,将来を考えたいと
思う.
付録 プログラム・リスト
(1) いろいろな言語での数の読み方
NB. Multi-lingual Numbering
NB.
by T. Nishikawa 2002 -1-27
rd =: 1!:1
wr =: 1!:2&2
run =: 3 : 0
wr 'お好きな数(<100)を入れてください'
N =. rd 1
wr '日本語:
','J' numb0 ".N
wr '中国語:
','C' numb0 ".N
wr '英語:
','A' numb1 ".N
wr 'ドイツ語:
','G' numb1 ".N
wr 'フランス語:
','F' numb2 ".N
wr 'スペイン語:
','S' numb1 ".N
wr 'エスペラント語: ','E' numb0 ".N
'*** 何語がよいですか? ***'
)
DA_J=: 'れい';'い ち';'に';'さ ん';'よん';'ご';'ろ く';'な な';'はち';'き
ゅう';'じゅう';'ひゃく'
DA_C=: ' 零 リン';'一 イー';'二 アル';'三 サン';'四 スー';'五 ウー';'六
リュー';'七 チー';'八 パー';'九 チュー';'十 シー';'百 バイ'
DA_E=:'nulo';'unu';'du';'tri';'kvar';'kvin';'ses';'sep';'ok';'naw';'de
k';'cent'
5
DA_A=:'zero';'one';'two';'three';'four';'five';'six';'seven';'eight';'
nine';'ten';'eleven';'twelve';'thirteen';'fourteen';'fifteen';'sixteen
';'seventeen';'eighteen';'ninteen';'twenty';'thirty';'forty';'fifty';'
sixty';'seventy';'eighty';'ninty';'hundred'
DA_G=:'Zero';'ein';'zwei';'drei';'vier';'fuenf';'sechs';'sieben';'acht
';'neun';'zehn';'elf';'zwoelf';'dreizehn';'vierzehn';'fuenfzehn';'schz
ehn';'siebzehn';'actzehn';'neunzehn';'zwanzig';'dreiszig';'vierzig';'f
uenfzig';'sechzig';'siebzig';'achtzig';'neunzig';'hundert'
DA_F=:'zero';'un';'deux';'trois';'quatre';'cinq';'six';'sept';'huit';'
neaf';'dix';'onze';'douze';'treize';'quatorze';'quinze';'seize';'dix-s
ept';'dix-huit';'dix -neuf';'vingt';'trente';'quarante';'cinq uante';'so
ixante';'soixante-dix';'quatre-vingt';'quatre -vingt-dix';'cent'
DA_S=:'cero';'uno';'dos';'tres';'cuatro';'cinco';'seis';'siete';'ocho'
;'nueve';'diez';'once';'doce';'trece';'catorce';'quince';'dieciseis';'
diesiete';'dieciocho';'diecinueve';'veinte ';'treinta';'cuarenta';'cinc
uenta';'sesenta';'setenta';'ochenta';'noventa';'ciento'
num =: 3 : 0
:
y. { ".'DA_', x.
)
NB. for Japanese, Chinese, Esperanto
numb0 =: 3 : 0
:
if. (x. = 'A') +. (x. = 'G') +. (x. = 'S') do. 'Error - use function numb1'
return. end.
if. (x. = 'F') do. 'Error - use function numb2' return. end.
if. y. = 100 do. ; x. num 11 return. end.
if. y. > 10
do. y1 =. <. y.%10 [ y0 =. 10 │ y.
R =. (x. num y1) , (x. num 10), (x. num y0)
if. y1 < 2 do. R =. (x. num 10), (x. num y0) end.
if. y0 = 0 do. R =. }: R end.
if. x. = 'E' do.
if. y1 > 1
do.
(;x. num y1), (;x. num 10), ' ', (;x. num y0)
else. (;x. num 10), ' ', (;x. num y0)
end.
6
return. end.
if. x. = 'C'
do. (,> 2 {. each R),' ',(,> 3 }. each R)
return. end.
; R
return.
end.
; x. num y.
)
NB. for English, German, Spanish
numb1 =: 3 : 0
:
if. (x. = 'J') +. (x. = 'C') +. (x. = 'E')
do. 'Error - use function numb0' return. end.
if. x. = 'F' do. 'Error - use function numb2' return. end.
if. y. = 100 do. ; x. num 28 return. end.
if. y. > 20
do. y1 =. 18 + y1 =. <. y.%10 [ y0 =. 10 │ y.
('D1';'D0') =. (x. num y1), (x. num y0)
if. y0 = 0 do. (;D1) return. end.
if. x. = 'A' do. (;D1), ' ', (;D0) return. end.
if. x. = 'G' do. (;D0), 'und', (;D1) return. end.
if. x. = 'S' do. (;D1), ' y ', (;D0) return. end.
if. x. = 'F' do.
if. y. < 70 do. 'No' end.
if. y0 : 1 do. (;D1), '-', (;D0)
else. (;D1), ' et ', (;D0)
end.
return. end.
D1, D0
return.
end.
D =. x. num y.
if. (x. = 'G') *. (y. = 1) do. (; D),'s' return. end.
; D
)
7
NB. for French only
numb2 =: 3 : 0
:
if. x. : 'F' do. 'Error - French only' return. end.
if. y. = 100 do. ; x. num 28 return. end.
if. y. < 20 do. ;x. num y. return.
elseif. y. < 71 do. y1 =. 18 + <. y.%10 [ y0 =. 10 │ y.
elseif. y. < 80 do. y1 =. 24 [ y0 =. y. - 60
elseif. '' do. y1 =. 26 [ y0 =. y. - 80
end.
('D1';'D0') =. (x. num y1), (x. num y0)
if. y0 = 0
do. (;D1)
if. y. = 80 do. (;D1),'s' end.
return.
end.
if. y. > 80 do. (;D1), '-', (;D0) return. end.
if. (y0 = 1) +. (y0 = 11)
do. (;D1), ' et ', (;D0)
else. (;D1), '-', (;D0)
end.
)
(2) ローマ数字と通常の数との変換
NB. Roman Number System
NB. Convert Ordinary/Roman Number
NB.
by T. Nishikawa 2002/2/25
wr=: 1!:2&2
R0 =: ' ';(,'I');'II';'III';'IV';(,'V');'VI';'VII';'VIII';'IX'
R1 =: ' ';(,'X');'XX';'XXX';'XL';(,'L');'LX';'LXX';'LXXX';'XC'
R2 =: ' ';(,'C');'CC';'CCC';'CD';(,'D');'DC';'DCC';'DCCC';'CM'
R3 =: ' ';(,'M');'MM';'MMM';'MY';(,'Y');'YM';'YMM';'YMMM';'MZ'
RR =: R3, R2, R1,: R0
NB. 5000 = 'Y', 10000 = 'Z'
NB. Ordinary Number converted to Roman Number
NB.
rom 3906 => MMMCMVI
8
rom =: 3 : 0
select. y.
case.
1 do. 'I' return.
case.
10 do. 'X' return.
case. 100 do. 'C' return.
case. 1000 do. 'M' return.
end.
dt =. >.10&^.y.
cf =. (dt#10) #: y.
R =. (-dt) {. 4 10$R3,R2,R1,R 0
RM =.(,. cf) {"(1) R
(; RM) -. ' '
)
NB.
NB.
NB.
NB.
NB.
No. of digits
takeout digits
Roman numbers
encode to Roman
ravel & remove space
NB. DeRomanize into Ordinary Number
NB.
drom 'MMMCMVI' => 3906
drom =: 3 : 0
Y =. y.
ss =: 'MZ' E. y.
tt =: 'CM' E. y.
uu =: 'XC' E. y.
vv =: 'IX' E. y.
NINE =: (+/ss),(+/tt),(+/uu),(+/vv)
if. 0 = +/NINE do. N =. drom08 y. return. end.
if. 1 = (+/s =. 'MZ' E. Y) do. Y =. (-. +/s,: _1│.s)#Y
if. 1 = (+/t =. 'CM' E. Y) do. Y =. (-. +/t,: _1│.t)#Y
if. 1 = (+/u =. 'XC' E. Y) do. Y =. (-. +/u,: _1│.u)#Y
if. 1 = (+/v =. 'IX' E. Y) do. Y =. (-. +/v,: _1│.v)#Y
N9 =. drom08 Y
N =. N9 + +/NINE#9000, 900, 90, 9
)
drom08 =: 3 : 0
NB. exclude Roman 9(MZ, CM, XC, IX)
Y =. y.
if. 0 < IX3 =. >./ +/¥('M'=Y)+.('Y'=Y)
do.
RM =. <IX3{.Y
Y =. IX3}. Y
else. RM =. <' '
9
end.
end.
end.
end.
end.
if. 0 < IX2 =. >./ +/¥('C'=Y)+.('D'=Y)
do.
RM =. RM, <IX2{.Y
Y =. IX2}. Y
else. RM =. RM, <' '
end.
if. 0 < IX1 =. >./ +/¥('X'=Y)+.('L'=Y)
do.
RM =. RM, <IX1{.Y
Y =. IX1}. Y
else. RM =. RM, <' '
end.
if. 0 < IX0 =. >./ +/¥('I'=Y)+.('V'=Y)
do.
RM =. RM, <IX0{.Y
Y =. IX0}. Y
else. RM =. RM, <' '
end.
NN =. RR i. "(1) ,. RM
". (": , NN) -. ' '
)
10