2013年6月13日木曜日

十六進算盤

このブログに八進法算盤のことを2回書いた. 2008年9月14日と2011年4月15日だ. そのとき十六進の算盤も考えられるとも書いた.

当時私の考えた十六進算盤は, 天(梁の上)に4珠が3つ, 地(梁の下)に1珠が3つのものだ. ところが最近Wikipediaを見ていたら, 昔の中国の算盤に5珠が2つ, 1珠が5つのものがあり, これは5X2+1X5=15だから16進法のものだという記述があって驚いた.

十六進算盤はどちらが使い易いか. ちょっと検討してみたい.

まず私が小学生の頃習った5珠1つ, 1珠4つの標準的十進算盤で, 加算の仕方をおさらいしよう.

0から9が置いてあるある桁に, 0から9を足すわけだが, 加算のアルゴリズムとしては(A,B)が置いてあるある桁に, (C,D)を足す; ただし

A,C={0,5} (天の値)
B,D={0,1,2,3,4} (地の値)
である.

まず地のCとDを足す.

0<=C+D<5なら地に1珠をD個上げてC+Dにする
9>C+D>=5なら地から(5-D)を下げ, C-(5-D)=C+D-5にし天に5を足す.

次に天でAとBを足す.

0<=A+B<10なら天をA+Bにする. A+B=10なら天を0にして1桁上に1を足す.

足すアルゴリズムの中に「足す」が現れるから, 再帰定義になっている.

私は小学生のころ, 学校で算盤を習ったが, 大体はこのアルゴリズムに従って考え考えやったように思う. しかし普通の人は反射的にやれるように練習しているに違いない.

ところで十六進の算盤の出番だ. 前のブログの図を再掲する.


上が十六進の算盤で, 左から右へ0からfの表わし方を示す. これをとにかく使うには, 0からfについて, 上の絵のように4で割った剰余(地の値B)と, 剰余を引いた差(天の値A)が反射的に思い出せる必要がある. 6なら2と4, 9なら1と8, cなら0と12という具合だ. (n=(A,B) ただしB = n mod 4, A = n - B)

足し算のアルゴリズムは下のようだ. 左端の見出しはいま算盤に置いてある数<1610で, 上端の見出しは足す数<1610である. 横が長いので, 足す数の途中で上下に分割してある.

多す数0の場合は何もしないから, 表は空白だ. 0,1,2に1を足すには単に1珠を1個上げればよい. それが「1↑」の表示だ.
上の算盤の絵で, 1を足すのはある桁と右隣の桁の図を見比べればよい. 従って3に1を足す時は, 下の3を払って(3↓), 上の4珠を1個下げる(4↓).

この調子で14+1まではよい. 15+1は図の右端の桁が左端の桁になるのだから, 3を払い, 上の4珠を3個払うことになる(4珠3個を払うのをc↑と示す.

それと同時に繰上げが生じたことを*で示す. つまり*は16, c↑は-12, 3↓は-3で, 都合+1になったわけだ.

他の場所もだいたいそういう方針で出来ている.



次の表は引き算のアルゴリズムである.



この表は目がしばしばするようなものだが, schemeでlatexのtabularのデータを発生させて書いている.

天と地に分解した表を作ると, 要するに下の表になってしまう.


これらの表も実は本質的に同じもので, 足される方は0,1,2,3, 足す方も0,1,2,3. 素直に足せれば足すが, 足せないときは4との差を引き, 繰り上げ処理をする. ある桁の地での足し算の繰り上げは天で処理し, 天での繰り上げは上の桁の地で処理するというだけのことである.

これだけ理解出来れば, 十進の算盤で1から10まで足して遊んだように, 十六進の算盤で0に1から1016まで足して8816にしてみよう.

次の絵がその様子である. 上の段が左から順に1から8まで足したところ(足した数は下に表示してある. 上は部分和を示す.) 下の段が9から1016まで足したところである.



こういう算盤を作ってみたくなった.

ところで中国の算盤を十六進で使うにはどうするか. まず0からfの表現法だが



上は天を6珠, 地を1珠と思う方法で, これだと十六進ではなく十八進の算盤になっている. その最後の16と17を使わない方法である.

下は天を5珠とみるもので, 天の値が0と5の時は地は0から4までとして使い, 0の時だけ0から5までを使うものである.

中国の人たちがどちらを使ったかは分からないが, 多分下の方であろう. しかし, これで加減算をするのは辛そうである. この図を描いただけでモティベーションが消え, まだアルゴリズムを考える気もしない.