Bluepostech

プログラムとかはこっち

九九を覚えるだけで全ての小数のかけ算ができる理由

はじめに

九九は小学校2年生で学ぶ算数最初の難関である。誰もが何度も暗唱したり、紙に書いたり、はたまた歌に合わせたり、苦労して九九を覚える。10以上の数や小数のかけ算になると、九九ほど何かを覚えるわけでもなく、筆算やらそろばんで任意の小数のかけ算ができるようになる。人力では手に負えない計算も電卓がやってくれるし、膨大な回数のかけ算と足し算をコンピュータがやって現代社会は回っている。

ところで、ふと疑問に思ったことはないだろうか。

たった9\times9=81個の計算を覚えるだけで、どうして無限にある小数のかけ算が可能になるのだろうか。

思えば、義務教育では「筆算のやり方」は教わるけれども、その根拠はあまりはっきり教えてもらえない。0.001から1億くらいまでのかけ算は教わるけども、その範囲を外れてかけ算ができるのかはわからない。でも九九とその他諸々を覚えれば計算はできるし社会はそうして回っている。なぜなのだろうか。

注:この記事では「有限小数で表すことのできる数」を小数と呼び、その範囲で話をします。つまり分数や無理数の話はしません。

そもそも「小数」って何よ

かけ算の話をするには、まず「数字って何」という話をしなければならない。

数とは我々が勝手に考えた概念だが、「何を満たせば数だ」と決めることができるだろうか。数の具体例を挙げて考えてみよう。 1、77、269、3.14、8.10、11.4514、... といくつか考えてみたが、どうやら以下のことが言えれば小数と言えそうである。 「0、1、2、3、4、5、6、7、8、9の9つの記号を並べたものである。」 この「並べる」というところをもう少し見てみよう。77は  7\times 10+7\times 10^{0}だ。3.14は高校で学ぶ負の指数 0.1=10^{-1}を用いれば 3\times 10^{0}+1\times 10^{-1}+4\times 10^{-2}だ。この「10」というものの中身には立ち入らないことにして、次のように決めればすべての小数を表現できそうだ。

定義1
小数とは、次のように表現できる数のことを言う。
{ \displaystyle
x=a_0 \times 10^0 + a_1 \times 10^1 + a_{-1} \times 10^{-1} +\cdots \\\\
=\sum a_i \times 10^{i}}

ただしa_iは0から9までのいずれかの数字である。二行目は高校数学で出てくる総和の記号だが、簡単に言うと「何かの数字を10の何乗かして足して、を繰り返したもの」ということだ。

このような xの集まりを大学以上の数学の言葉で言うと、集合\{0,1,2,3,4,5,6,7,8,9\}上で集合 \{10^{i} \} を基底とするベクトル空間といい*1、ベクトル空間に属するものをベクトルと呼ぶ。高校数学ではベクトルと言えば矢印だが、それは厳密には幾何ベクトルというものでベクトルの一種である。

ここでは「 \times」という記号を使っているが、今は「数字と10^{i}を結びつける記号」という意味しかない。

10進法では九九だけ覚えればよい

ここで、数321=3\times 10^{2} +2\times 10+ 14857=4\times 10^{3} +8 \times 10^{2} + 5\times 10 + 7のかけ算を考えてみよう。

ベクトルは「ベクトル空間の公理」というものを満たす。公理というと何やら難しそうだが、言ってることは実はざっくり言えば「小学校で学ぶ交換法則、結合法則、分配法則が成り立つ」ということと「0、1に相当するものがある」といったものだ。

ベクトル同士のかけ算は内積というのだが、ここではかけ算のことである。内積についても分配法則は成り立つ。321と4857のかけ算を計算してみよう。

 321 \cdot 4857 = (3\times 10^{2} +2\times 10+ 1\times 10^{0})\cdot (4\times 10^{3} +8 \times 10^{2} + 5\times 10 + 7\times 10^{0}) \\
=(3\times 10^{2})\cdot (4\times 10^{3}) + \cdots +(1\times 10^{0}) \cdot (7\times 10^{0}) \\
=(3\cdot 4) \times ( 10^{2}\cdot 10^{3}) + \cdots + (1\cdot 7) \times (10^{0} \cdot 10^{0})

ここで交換法則と分配法則、結合法則を用いている。

これを x=a_0 \times 10^{0} + a_1 \times 10^{1} + a_{-1} \times 10^{-1} +\cdots の形に書き直せれば、定義1を使って計算を終えることができる。そこでこれと最後の行の式を見比べてみると

  • 3\cdot 4, 1\cdot 7, \cdotsのように数字同士のかけ算を数字にする
  • 10^{3} \cdot 10^{4}, \cdots のように10^{i}同士のかけ算を10^{k}にする

の二つの決まりが決まればよいということがわかる。後者は単に指数法則から 10^{i} \cdot 10^{j} = 10^{i+j} とすればよい。

ここまで来たらわかるだろう。そう、前者こそがまさに「九九」なのである*2。実際には繰り上がりがあるので足し算の九九も決める必要があるが、ここに足し算、かけ算の九九と指数法則があれば任意の小数のかけ算は実行可能であることが示された。

ところで:なんで「九九」なのか

ここまで10進数の話をしてきた。世の中には10以外の進法もある。

たとえば、コンピュータは2進数を使っている。この場合は小数の表し方はこうなる。

{ \displaystyle
x=a_0 \times 2^{0} + a_1 \times 2^{1} + a_{-1} \times 2^{-1} +\cdots \\
=\sum a_i \times 2^{i}}

ここではa_i\{0,1\}の2つしかない。つまり足し算とかけ算のそれぞれで(0\cdot 0),    (0\cdot1), (1\cdot 0), (1\cdot 1)の4通りの結果を覚えればよい。九九を覚えるのが嫌な小学生はコンピュータになればいいのかも知れない。

一般にn進法ではn^{2}通りの結果を覚えればよい。我々の祖先が10進法を採用したことはラッキーなのかも知れないし、アンラッキーなのかも知れない。10というのは人間の演算能力が決めたのだろうか。

追記:冷静に考えたら「人間の手の指が合わせて10本だから」だった。つまり人類の手の指の本数によっては8進数や12進数になっていた可能性もある。

補足:スカラー倍と内積について

厳密には、ベクトルでかけ算に相当するものは「スカラー倍」と「内積」がある。

ベクトル空間では足し算とスカラー倍について交換法則や分配法則が成り立つと定義していて内積が存在するかは触れていない。一方、内積とは、ベクトル同士の二項演算で交換法則、双線形性などを満たすものとして定義される。

つまりスカラー倍と内積は別の概念で、この記事ではスカラー倍に該当するものを\times内積に該当するものを\cdotと一応使い分けている。この記事でスカラーの集合に対応するものは\{0,1,2,3,4,5,6,7,8,9\}で、基底が \{10^{i} \}である。

*1:線形空間」などともいいます。

*2:正確には九九に0の段を足したもの。