整数はコンピュータにとって最も基本となるデータの一つでしょう。今回はその基本的なデータの背後にあるコンピュータの秘密について考えてみます。最後に,応用問題として公開鍵暗号方式についても触れます。

 0,1,2,3,…と続く整数は小学生のころから慣れ親しんだ数です。しかし,学校で学ぶ算数や数学に登場する整数とコンピュータが取り扱う整数には,少しだけ性質に違いがあります。整数を学ぶにあたって,まずこの違いから考えてみることにします。

 最初の違いはコンピュータの中の数は2進法で表現された2進数だということです。コンピュータを使っていて,この違いが目立つことはほとんどありませんが,ここはきちんと押さえておく必要があります。

 私たちが普段使っているのは10進法です。10進法は0から9までの10種類の数字によって表現されます。しかし,10進法が唯一の位取り法というわけではありません。例えば時間の表現は60秒が1分,60分が1時間になりますから,時間を表現する位取り法は60を単位とする60進法だといえるでしょう。同じように12インチが1フィートになる米国などの長さ表現は12進法です。

 同じように,コンピュータは0と1の2種類の数字を使う2進法に基づいています。10進数の0は2進数でも0,10進数の1も1ですが,10進数の2は繰り上がりが起きるので2進数では「10」になります。

 混乱を招かないように10進数以外では10を「イチゼロ」のように発音する慣習があります。同様に3は「11」,4は「100」となります。 コンピュータが2進法を使う理由は1と0がスイッチのオン・オフで表現できるからです。コンピュータ上の2進数の一つひとつのけたを「ビット」と呼びます。

数値を扱う方法

 数に対する基本的な操作として取り上げられるのが,足す,引く,掛ける,割るという四則演算です。プログラムの記述に使う英数記号には,掛ける「×」や割る「÷」が使えませんから,代わりに「*」と「/」を使います。以下はRubyの例です。

puts 1+1 # => 2
            puts 5-4 # => 1
            puts 2*3 # => 6
            puts 5/2 # => 2
            

 5÷2の結果が2.5ではなく,2であることに注目してください。割り算の結果はプログラミング言語によって異なります。Rubyでは整数は整数の範囲内で計算しますから,割り算は余りを切り落とした結果になります。余りを計算するためには特別な演算子「%」を使います。

puts 5%2 # => 1
            

 数に対する操作には比較もあります(表1)。四則演算と比較演算があれば簡単な計算プログラムを記述できます。階乗*1を計算するプログラムを書いてみましょう。

表1●数値に対する比較演算子
表1●数値に対する比較演算子

 階乗を帰納法で定義すると

n = 1ならば1
            n > 1ならば n*(n-1)の階乗
            

 となります。プログラム的には帰納法定義を使い,再帰手続き*2を用いる場合が多いでしょう(図1)。説明の都合上,プログラムはC言語で記述しました。プログラムの実行結果を図2に示します。

図1●C言語による階乗計算プログラム
図1●C言語による階乗計算プログラム
再帰手続きを用いた。

図2●図1のプログラムの実行結果
図2●図1のプログラムの実行結果
計算結果がおかしい。

 図2をよく見ると,なにかおかしいところがありませんか。まず,fact(13)の結果が1932053504(19億3205万3504)になっていますが,これはfact(12)=479001600に13をかけたものではありません。Rubyで確認してみましょう。

puts 1932053504/479001600 # =>4
            

 さらに,fact(14)に対する結果はfact(13)の結果よりも小さくなっています。数学で登場する整数ならばこんなことは考えられません。

 実はこれがコンピュータの整数の特徴なのです。