このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

ホッピングボール:エキゾチック二進小数

ホッピングボール・マシンを記述したり解析したりするときに、エキゾチックな二進小数が役に立ちます。それで、エキゾチック二進小数の説明をします。とはいっても、今回はホッピングボール・マシン自体は全然出てこないので、完全に独立した話として読めます。

内容:

  1. エキゾチック二進小数とは何か
  2. エキゾチック二進小数の足し算
  3. エキゾチックな循環小数
  4. エキゾチック二進小数の掛け算
  5. エキゾチック二進小数と0以上2以下の実数との違い
  6. エキゾチック二進小数の計算法則
  7. 言い残したこと

●エキゾチック二進小数とは何か

エキゾチック二進小数とは、ほぼ、0以上2以下の実装を二進小数で表現したものです。「ほぼ」と言ったのは、厳密にはわずかに異なるからです。でも、気にするほどのことはありません。とりあえず、0≦ x ≦2 の実数がエキゾチック二進小数の実体だと思ってください。(「ほぼ」の正確な記述は最後にあります。)

エキゾチックとは、足し算と掛け算が普通の算数と異なるってことです。エキゾチックな算数の例はマスロフ式算数熱帯式算数で既に出てきました。エキゾチック二進小数も似たような計算体系になります。

0≦ x ≦2 である実数xを二進数で書くと、1桁目は0か1です。_(アンダスコア)は0か1が入る場所を表すとして、0.____(_が何個か)の形、または 1.___(_が何個か)の形です。十進の2.0は1.1111...(無限に1が続く)で表します。これは、十進で 2.0 = 1.9999... となるのと同じです。ちょっと不思議ですが、今は詮索しません。

最初の桁の次にいつでも小数点が置かれるので、この小数点は省略してしまいましょう。つまり、0.1011 なら 01011、1.1111...(無限に1が続く)なら 11111...(無限に1が続く)です。要するに、0, 1から構成される有限列または無限列ってことになります。有限列は0が無限に続いているところを省略していると考えれば、すべてのエキゾチック二進小数は無限列だと考えていいでしょう。

●エキゾチック二進小数の足し算

エキゾチック二進小数がエキゾチックである理由は、その計算が普通とは違うからです。まずは足し算。一桁の足し算は次のルールに従います。

  1. 0 + 0 = 0
  2. 1 + 0 = 1
  3. 0 + 1 = 1
  4. 1 + 1 = 1

最後のルールに注意してください。「イチ足すイチはイチ!」です。桁がたくさんあるときも、一桁の足し算を桁ごとにするだけです。繰り上がりはありません。筆算をやってみます。


01011
+ 10001011
-----------
11010100

2つの小数の桁は左側で揃えます。必要なら0を補って考えます。簡単ですね。無限小数でも、無限に続く部分が想像できるなら計算できます。


01011
+ 11111...(無限に1が続く)
-----------
11111...(無限に1が続く)


01011
+ 01010101...(無限に0と1が交互に現れる)
-----------
01011101... (以下、無限に0と1が交互に現れる)

●エキゾチックな循環小数

11111...(無限に1が続く)とか、01011101... (以下、無限に0と1が交互に現れる)とかの無限の繰り返しパターンが登場しました。これは、十進小数の場合の循環小数と同じです。ある繰り返しパターンに従うエキゾチック二進小数のことを、エキゾチック二進循環小数と呼びましょう。混乱の恐れがなければ、単に循環小数とも呼びます。

十進小数の場合、繰り返し部分(循環節と呼ぶようです)を識別するために桁の上に点を打ちますが、ここでは単純に繰り返し部分を括弧で囲むことにします。11111...(無限に1が続く)は (1) です。01011101...(以下、無限に0と1が交互に現れる)なら 010111(01) です。有限小数 01011 も、01011(0) と循環小数として書けます。

繰り返し部分は一意的に決まるわけではありません。(1) = 1(1) = 11(1) = (11) = 11(111) など。子供の頃、「おまえ、カバ、カバ、カバ、…」が「バカ、バカ、バカ、…」になるなんて、どうでもいい言い合いをしてましたが、これは、

  • おまえ(カバ) = おまえカ(バカ) = おまえ(カバかバカば)

なんですね。もちろん、循環しない部分と循環部分が一番短くなる書き方を見つけられますが、循環部分を適当にずらすことができるって事実も重要です。例えば、その事実を使って次のことを示せます。

●エキゾチック二進小数の掛け算

さて、エキゾチックな掛け算ですが、ゴチャゴチャ説明するより、筆算のやり方を例示した方が速いでしょう。


01011×10101

01011
× 10101
-----------
01011
00000
01011
00000
01011
------------
010111111

十進のときの筆算と同じです。桁をずらしながら1桁の数(0または1)との掛け算を何度か行い、最後に桁ごとに縦に足します。足し算の繰り上がりがないので簡単です。縦の列をみて、1がひとつでもあれば総和は1、0ばっかりなら総和は0です。

以上の掛け算の筆算アルゴリズム循環小数の知識をもとに、次にことも示せますよ(やや面倒ですが)。

●エキゾチック二進小数と0以上2以下の実数との違い

0≦ x ≦2 である実数xを二進小数で表した場合は、1.0 = 0.1111...(無限に1が続く)のような等式が成り立ちます。0.1111... は (1/2) + (1/4) + (1/8) + ... ですが、この和と1との差はいくらでも縮まり、結局は1.0に等しいのです。

しかし、エキゾチック二進小数ではこのような等式は考えません。1 と 0(1) は別物とみなします。要するに、まったく同じ列は同じ、ちょっとでも違う列は違う、ってことです。1 と 01111...(無限に1が続く)は、エキゾチック二進小数としては違います。

別な言い方をすると、エキゾチック二進小数では、対応する実数値は問題ではなくて、0, 1の並びパターン(モノクロ模様)だけを問題にしているのです。とはいっても、1 と 01111... は同じか違うかというのは、思ったほどの決定的な違いではなくて、「エキゾチック二進小数は0以上2以下の実数のようなものだ」と思っていてもかまいません。

●エキゾチック二進小数の計算法則

エキゾチック二進小数の計算は、普通の数の計算と同じ法則に従います。

  1. (x + y) + z = x + (y + z)
  2. x + 0 = 0 + x = x
  3. x + y = y + x
  4. (x×y)×z = x×(y×z)
  5. x×1 = 1×x = x
  6. x×y = y×x
  7. x×(y + z) = x×y + x×z

ここで、0は(0) = 0000... のこと、1は1(0) = 1000... のことです。

唯一、普通の数の計算と違っているのは、次の法則が成立することです。

  • x + x = x

これは、足し算の定義に戻って考えればわかるでしょう。1 + 1 = 1 で繰り上がりもないのでした。1 + 1 = 1 なので、1 + x = 0 となるxを探すことができず、負の数を考えることもできません。それでもまー、エキゾチック二進小数内で普通の算術計算はたいていできます。

●言い残したこと

エキゾチック二進小数は、ここで述べた以外の表現を持ちます。別な表現を使ったほうが都合がいいときもあります。が、二進小数として導入するのが一番わかりやすい気がします。

ホッピングボール・マシンとの関係を論じるときは、エキゾチック二進小数の別な表現が必要になりますので、別な表現(実は自然数の部分集合)を取り上げる機会もあるでしょう。