私たちが普段使う「10進法」は、数の表し方の1つにすぎません。
コンピュータは2進法、色を表すときは16進法。n進法の原理を理解すれば、どんな底の記数法も自在に扱えます。
私たちが普段「345」と書くとき、実はこう考えています。
$$345 = 3 \times 10^2 + 4 \times 10^1 + 5 \times 10^0$$各位の数字に $10$ のべき乗を掛けて足し合わせる。これが10進法の仕組みです。 「10」を底(基数)と呼びます。 各位の数字は $0$ 以上 $9$ 以下($= 10 - 1$ 以下)の整数です。
では、底を $10$ 以外の数にしたらどうなるでしょうか。 $n$ を2以上の整数とするとき、$n$ ずつまとめて位を繰り上げる方法をn進法といいます。 n進法で表された数をn進数といい、右下に底を添えて $231_{(5)}$ のように表記します。
n進法の本質は位取り記数法の原理にあります。 n進数 $a_k a_{k-1} \cdots a_1 a_0{}_{(n)}$ は、次の値を表しています。
$$a_k \times n^k + a_{k-1} \times n^{k-1} + \cdots + a_1 \times n^1 + a_0 \times n^0$$
つまり、右から $i$ 番目の位($0$ から数える)の数字 $a_i$ は、「$n^i$ が $a_i$ 個ある」ことを意味します。
10進法も2進法も16進法も、すべてこの原理で動いています。 底 $n$ が変わっても、「各位 $\times$ 底のべき乗」を足すという仕組みは同じです。
n進数を10進数に直すには、上の定義をそのまま計算するだけです。
例1:$231_{(5)}$ を10進数に変換する。
$$231_{(5)} = 2 \times 5^2 + 3 \times 5^1 + 1 \times 5^0 = 50 + 15 + 1 = 66$$
例2:$1101_{(2)}$ を10進数に変換する。
$$1101_{(2)} = 1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 = 8 + 4 + 0 + 1 = 13$$
例3:$2\text{A}3_{(16)}$ を10進数に変換する($\text{A} = 10$)。
$$2\text{A}3_{(16)} = 2 \times 16^2 + 10 \times 16^1 + 3 \times 16^0 = 512 + 160 + 3 = 675$$
✕ 誤:$352_{(5)}$ は5進数として正しい
○ 正:5進法で使える数字は $0, 1, 2, 3, 4$ の5種類。 「5」は使えないので $352_{(5)}$ は正しい5進数ですが、$358_{(5)}$ のように $8$ が現れたら、それは5進数ではありません。
一般に、n進法の各位の数字は $0, 1, 2, \ldots, n-1$ の $n$ 種類です。 $n$ 以上の数字が現れることはありません。
n進法でも小数を表せます。小数点以下の位は $n^{-1}, n^{-2}, \ldots$ に対応します。
$$0.a_1 a_2 a_3{}_{(n)} = a_1 \times n^{-1} + a_2 \times n^{-2} + a_3 \times n^{-3}$$たとえば $0.11_{(2)} = 1 \times 2^{-1} + 1 \times 2^{-2} = \dfrac{1}{2} + \dfrac{1}{4} = \dfrac{3}{4} = 0.75$(10進法)です。
人間の指が10本あることが、10進法の起源と考えられています。 実際、古代バビロニアでは60進法が使われており、その名残は現在の「60秒 = 1分」「60分 = 1時間」「360度」に残っています。
数学的には底が何であっても表現力は同じです。 つまり、どんな正の整数も任意のn進法で表すことができます。 底の選び方は「便利さ」で決まります。
n進数を10進数に直すのは「定義どおりに計算するだけ」でした。 では逆に、10進数をn進数に直すにはどうすればよいでしょうか。
答えはnで繰り返し割って、余りを記録することです。 なぜこの方法でうまくいくのか、原理から考えてみましょう。
10進数 $N$ をn進法で表したとき、一の位の数字は何でしょうか。
$N = a_k n^k + a_{k-1} n^{k-1} + \cdots + a_1 n + a_0$ と表されるとき、 $N$ を $n$ で割ると
$$N = n \times (a_k n^{k-1} + \cdots + a_1) + a_0$$
つまり、$N \div n$ の余りが一の位 $a_0$、商が上位の桁をまとめたものです。
この商をさらに $n$ で割れば、次の余りが $n$ の位 $a_1$ になります。 これを繰り返せば、すべての位の数字が下の桁から順に求まります。
手順:10進数 $N$ を $n$ で割り、余りを記録する。商をさらに $n$ で割る。商が $0$ になるまで繰り返す。
記録した余りを最後に出た余りから順に並べる(逆順に読む)。
$66 \div 5 = 13$ 余り $\mathbf{1}$(一の位)
$13 \div 5 = 2$ 余り $\mathbf{3}$($5$ の位)
$2 \div 5 = 0$ 余り $\mathbf{2}$($5^2$ の位)
商が $0$ になったので終了。余りを下から上へ読むと:$231_{(5)}$
検算:$2 \times 25 + 3 \times 5 + 1 = 50 + 15 + 1 = 66$ ✓
✕ 誤:余りを上から下へ(出た順に)並べて $132_{(5)}$ としてしまう
○ 正:余りを下から上へ(逆順に)並べて $231_{(5)}$ が正解
最初に出る余りが一の位(最下位の桁)、最後に出る余りが最上位の桁です。 割り算で最初に出た余りは、n進表記では一番右(最後)に来ると覚えましょう。
不安なときは必ず検算(n進数 → 10進数に戻して元の数と一致するか確認)をしてください。
10進法の小数をn進法に変換するには、整数部分と小数部分を分けて処理します。 小数部分は $n$ を繰り返し掛けて、整数部分を順に取り出します。
$0.625 \times 2 = \mathbf{1}.25$(整数部分 $1$ を取る → 小数第1位)
$0.25 \times 2 = \mathbf{0}.5$(整数部分 $0$ を取る → 小数第2位)
$0.5 \times 2 = \mathbf{1}.0$(整数部分 $1$ を取る → 小数第3位)
小数部分が $0$ になったので終了。整数部分を上から下へ読む:$0.101_{(2)}$
検算:$1 \times \dfrac{1}{2} + 0 \times \dfrac{1}{4} + 1 \times \dfrac{1}{8} = 0.5 + 0 + 0.125 = 0.625$ ✓
整数部分の変換:余りを下から上へ読む(逆順)
小数部分の変換:整数部分を上から下へ読む(出た順)
方向が逆なので混同しやすいポイントです。 整数部分は「一の位から順に求まる」、小数部分は「小数第1位から順に求まる」と理解すれば混乱しません。
10進数をn進数に変換するアルゴリズムは、プログラミングの基本です。
Python なら divmod(N, n) を繰り返すだけで実装できます。
実はこのアルゴリズムはユークリッドの互除法と同じ構造をしています。 どちらも「割って余りを取り、商で続ける」という再帰的な手順です。 数学の多くのアルゴリズムが、この「余りを利用する」パターンに基づいています。
10進法での筆算を思い出してください。 一の位どうしを足して $10$ 以上になったら繰り上がりますね。 n進法でも原理は同じで、$n$ 以上になったら繰り上がるだけです。
10進法では各位の和が $10$ 以上で繰り上がります。 n進法では各位の和が$n$ 以上で繰り上がります。
引き算では、10進法で上の位から $10$ を借りてきますが、 n進法では$n$ を借りてくるのです。
掛け算・割り算も同様に、「10」の役割を「$n$」に置き換えるだけです。 四則演算の原理は底によらず同じだということです。
$243_{(5)} + 134_{(5)}$ を計算してみましょう。
一の位:$3 + 4 = 7$。$7 = 1 \times 5 + 2$ なので、$2$ を書いて $1$ 繰り上がり。
$5$ の位:$4 + 3 + 1 = 8$。$8 = 1 \times 5 + 3$ なので、$3$ を書いて $1$ 繰り上がり。
$5^2$ の位:$2 + 1 + 1 = 4$。$4 < 5$ なのでそのまま $4$。
結果:$243_{(5)} + 134_{(5)} = 432_{(5)}$
検算:$243_{(5)} = 73$、$134_{(5)} = 44$、$73 + 44 = 117$。$432_{(5)} = 4 \times 25 + 3 \times 5 + 2 = 117$ ✓
$432_{(5)} - 243_{(5)}$ を計算します。
一の位:$2 - 3$。引けないので上の位から $5$ を借りる。$7 - 3 = 4$。
$5$ の位:(借りたので $3 - 1 = 2$)$2 - 4$。引けないので上の位から $5$ を借りる。$7 - 4 = 3$。
$5^2$ の位:$4 - 1 = 3$、借りたので $3 - 2 = 1$。
結果:$432_{(5)} - 243_{(5)} = 134_{(5)}$
$23_{(5)} \times 4_{(5)}$ を計算します。
一の位:$3 \times 4 = 12$。$12 = 2 \times 5 + 2$ なので、$2$ を書いて $2$ 繰り上がり。
$5$ の位:$2 \times 4 + 2 = 10$。$10 = 2 \times 5 + 0$ なので、$0$ を書いて $2$ 繰り上がり。
$5^2$ の位:繰り上がりの $2$。
結果:$23_{(5)} \times 4_{(5)} = 202_{(5)}$
検算:$23_{(5)} = 13$、$4_{(5)} = 4$、$13 \times 4 = 52$。$202_{(5)} = 2 \times 25 + 0 + 2 = 52$ ✓
✕ 誤:5進法の計算で $3 + 4 = 7$ をそのまま「7」と書いてしまう
○ 正:5進法では $5$ 以上で繰り上がるので、$7 = 1 \times 5 + 2$ → 「$2$ を書いて $1$ 繰り上がり」
慣れないうちは、各位の計算結果を10進法で求めてから、nで割って商(繰り上がり)と余り(その位の数字)に分けると間違いにくいです。
コンピュータの内部では、すべてのデータが2進法で表されています。 なぜ10進法ではなく2進法なのでしょうか?
理由は単純で、コンピュータの回路は電気のON/OFFの2つの状態しか持てないからです。 ON を「1」、OFF を「0」に対応させれば、自然に2進法になります。 この「0」か「1」の1桁をビット(bit)と呼びます。
2進法の桁数と10進法の桁数の関係をつかむのに、$2^{10} = 1024 \approx 1000 = 10^3$ が役立ちます。
たとえば、2進法で10桁あれば $0$ 〜 $1023$ の数が表せます。 これは10進法で約3桁分です。 一般に、2進法の桁数はおよそ10進法の3.3倍($\log_{2}10 \approx 3.32$)になります。
2進法は桁数が多くなるため、人間にとっては読みにくいという欠点があります。 そこで16進法がよく使われます。 $16 = 2^4$ なので、2進法の4桁がちょうど16進法の1桁に対応します。
16進法では $0$ 〜 $9$ に加えて $\text{A} = 10$, $\text{B} = 11$, $\text{C} = 12$, $\text{D} = 13$, $\text{E} = 14$, $\text{F} = 15$ を使います。
| 10進 | 2進 | 16進 | 10進 | 2進 | 16進 |
|---|---|---|---|---|---|
| 0 | 0000 | 0 | 8 | 1000 | 8 |
| 1 | 0001 | 1 | 9 | 1001 | 9 |
| 2 | 0010 | 2 | 10 | 1010 | A |
| 3 | 0011 | 3 | 11 | 1011 | B |
| 4 | 0100 | 4 | 12 | 1100 | C |
| 5 | 0101 | 5 | 13 | 1101 | D |
| 6 | 0110 | 6 | 14 | 1110 | E |
| 7 | 0111 | 7 | 15 | 1111 | F |
2進数を16進数に直すには、右から4桁ずつ区切って各グループを16進1桁に変換します。 逆に、16進数を2進数に直すには、各桁を4桁の2進数に展開するだけです。
例:$10101100_{(2)}$ を16進数に直す。
右から4桁ずつ区切る:$\underbrace{1010}_{}\;\underbrace{1100}_{}$
$1010_{(2)} = \text{A}_{(16)}$、$1100_{(2)} = \text{C}_{(16)}$
よって $10101100_{(2)} = \text{AC}_{(16)}$
検算:$\text{A} \times 16 + \text{C} = 10 \times 16 + 12 = 172$。$10101100_{(2)} = 128 + 32 + 8 + 4 = 172$ ✓
Webページの色指定で見る #FF5733 のような表記は、16進法です。
FF = 赤の強さ($255$)、57 = 緑の強さ($87$)、33 = 青の強さ($51$)を表します。
各色は $00$($= 0$)から $\text{FF}$($= 255$)の範囲、つまり $2^8 = 256$ 段階で指定されます。 これは8ビット($= 2$ 桁の16進数)に対応しています。 色の表現にも、n進法の知識が直結しているのです。
一般に、n進法からm進法への直接変換は複雑です。 そのため、n進数 → 10進数 → m進数と、10進法を経由して変換するのが確実な方法です。
ただし、$2$ 進法と $8$ 進法($8 = 2^3$)、$2$ 進法と $16$ 進法($16 = 2^4$)のように、 一方の底が他方のべき乗になっている場合は、桁のグループ化で直接変換できます。
n進法は「数の表し方」の問題ですが、整数の性質の多くの概念と深くつながっています。 全体像を整理しましょう。
| パターン | 問題の特徴 | 解法のポイント |
|---|---|---|
| A:n進 → 10進 | n進数が与えられ、10進数を求める | 各位 $\times n^k$ を計算して足す |
| B:10進 → n進 | 10進数が与えられ、n進数を求める | nで繰り返し割り、余りを逆順に並べる |
| C:n進の演算 | n進数のまま四則演算する | 繰り上がりの基準をnにする |
| D:n進 ↔ m進 | 異なる底どうしの変換 | 10進法を経由する(べき乗関係なら直接変換) |
| E:n進の性質 | n進表記の桁数・各位の和など | $n^k$ の不等式、$n$ で割った余りとの関係 |
Q1. $342_{(5)}$ を10進数に変換してください。
Q2. 10進数 $100$ を3進数に変換してください。
Q3. $1011_{(2)} + 110_{(2)}$ を2進法で計算してください。
Q4. 16進数 $\text{B}2_{(16)}$ を10進数に変換してください。
Q5. n進法の各位の数字は、何以上何以下の整数ですか?
この記事で学んだ内容を、入試形式の問題で確認しましょう。
次のn進数を10進数に変換せよ。
(1) $2134_{(5)}$
(2) $110110_{(2)}$
(1) $294$ (2) $54$
方針:各位 $\times n^k$ を計算して足す。
(1) $2134_{(5)} = 2 \times 5^3 + 1 \times 5^2 + 3 \times 5^1 + 4 \times 5^0 = 250 + 25 + 15 + 4 = 294$
(2) $110110_{(2)} = 1 \times 2^5 + 1 \times 2^4 + 0 \times 2^3 + 1 \times 2^2 + 1 \times 2^1 + 0 \times 2^0 = 32 + 16 + 4 + 2 = 54$
10進数 $200$ を次の進法で表せ。
(1) 7進法
(2) 2進法
(1) $404_{(7)}$ (2) $11001000_{(2)}$
方針:nで繰り返し割り、余りを下から上へ読む。
(1) $200 \div 7 = 28$ 余り $4$、$28 \div 7 = 4$ 余り $0$、$4 \div 7 = 0$ 余り $4$。下から読んで $404_{(7)}$。
検算:$4 \times 49 + 0 \times 7 + 4 = 196 + 4 = 200$ ✓
(2) $200 \div 2 = 100$ 余り $0$、$100 \div 2 = 50$ 余り $0$、$50 \div 2 = 25$ 余り $0$、$25 \div 2 = 12$ 余り $1$、$12 \div 2 = 6$ 余り $0$、$6 \div 2 = 3$ 余り $0$、$3 \div 2 = 1$ 余り $1$、$1 \div 2 = 0$ 余り $1$。下から読んで $11001000_{(2)}$。
検算:$128 + 64 + 8 = 200$ ✓
5進法で表された2つの数 $A = 1342_{(5)}$, $B = 243_{(5)}$ について、次を求めよ。
(1) $A + B$ を5進法で表せ。
(2) $A - B$ を5進法で表せ。
(3) $A \times 3_{(5)}$ を5進法で表せ。
(1) $2140_{(5)}$ (2) $1044_{(5)}$ (3) $10131_{(5)}$
方針:5進法のまま筆算する。繰り上がり・繰り下がりの基準は5。
(1) 一の位:$2 + 3 = 5 = 1 \times 5 + 0$。$0$ を書いて $1$ 繰り上がり。$5$ の位:$4 + 4 + 1 = 9 = 1 \times 5 + 4$。$4$ を書いて $1$ 繰り上がり。$25$ の位:$3 + 2 + 1 = 6 = 1 \times 5 + 1$。$1$ を書いて $1$ 繰り上がり。$125$ の位:$1 + 0 + 1 = 2$。答え:$2140_{(5)}$。
検算:$A = 222$, $B = 73$, $A + B = 295$。$2140_{(5)} = 2 \times 125 + 1 \times 25 + 4 \times 5 + 0 = 295$ ✓
(2) 一の位:$2 - 3$。引けないので上の位から $5$ を借りる。$7 - 3 = 4$。$5$ の位:$(4-1) - 4 = 3 - 4$。引けないので借りる。$8 - 4 = 4$。$25$ の位:$(3-1) - 2 = 0$。$125$ の位:$1$。答え:$1044_{(5)}$。
検算:$222 - 73 = 149$。$1044_{(5)} = 125 + 0 + 20 + 4 = 149$ ✓
(3) 一の位:$2 \times 3 = 6 = 1 \times 5 + 1$。$1$ を書いて $1$ 繰り上がり。$5$ の位:$4 \times 3 + 1 = 13 = 2 \times 5 + 3$。$3$ を書いて $2$ 繰り上がり。$25$ の位:$3 \times 3 + 2 = 11 = 2 \times 5 + 1$。$1$ を書いて $2$ 繰り上がり。$125$ の位:$1 \times 3 + 2 = 5 = 1 \times 5 + 0$。$0$ を書いて $1$ 繰り上がり。答え:$10131_{(5)}$。
検算:$222 \times 3 = 666$。$10131_{(5)} = 625 + 0 + 25 + 15 + 1 = 666$ ✓
$n$ を2以上の整数とする。正の整数 $N$ をn進法で表したときの桁数を $d$ とする。$d$ を $N$ と $n$ を用いて表せ。
また、$2^{100}$ を10進法で表したときの桁数を求めよ。ただし $\log_{10} 2 = 0.3010$ とする。
$d = \lfloor \log_n N \rfloor + 1$
$2^{100}$ の桁数:$31$ 桁
方針:n進法で $d$ 桁の数は $n^{d-1} \leq N < n^d$ を満たす。
n進法で $d$ 桁の最小の数は $10\underbrace{0\cdots0}_{d-1}{}_{(n)} = n^{d-1}$、$d$ 桁の最大の数は $(n-1)\underbrace{(n-1)\cdots(n-1)}_{d}{}_{(n)} = n^d - 1$。
よって $n^{d-1} \leq N \leq n^d - 1$、すなわち $n^{d-1} \leq N < n^d$。
各辺の $n$ を底とする対数を取ると:$d - 1 \leq \log_n N < d$
これは $d - 1 = \lfloor \log_n N \rfloor$ を意味するので、$d = \lfloor \log_n N \rfloor + 1$。
$2^{100}$ の10進法での桁数は $\lfloor \log_{10} 2^{100} \rfloor + 1 = \lfloor 100 \times 0.3010 \rfloor + 1 = \lfloor 30.10 \rfloor + 1 = 30 + 1 = 31$ 桁。