---
title: "チェックディジットとは？重み付き計算とmodによる検査文字の求め方【基本情報技術者試験】"
description: "チェックディジットを、各桁に係数を掛けて合計し、modで余りを求める検査文字として整理し、パリティビット・CRC・ハッシュ値との違いを解説します。"
last_modified_at: "2026-08-02"
canonical_url: "https://stemtazoo.github.io/fe/check-digit/"
section: "fe"
---

## まず結論

チェックディジットとは、**元の番号から一定の規則で求めた検査用の数字や文字**です。

番号の末尾などへ付加し、入力ミスや転記ミスを検出するために使います。

基本情報技術者試験では、次の流れで計算します。

```text
1. 各桁へ係数を割り当てる
2. 各桁と係数を掛ける
3. 積をすべて足す
4. 指定された数で割った余りを求める
5. 余りを検査文字にする
```

覚える一文はこれです。

> **各桁×係数を合計し、指定された数で割った余りを検査文字にする。**

## 直感的な説明

チェックディジットは、番号に付ける「簡単な確認印」のようなものです。

例えば、元の番号が次の4桁だったとします。

```text
2 1 3 1
```

各桁に、先頭から次の係数を掛けます。

```text
4 3 2 1
```

表にすると、次のようになります。

| 桁 | 2 | 1 | 3 | 1 |
|---|---:|---:|---:|---:|
| 係数 | 4 | 3 | 2 | 1 |
| 積 | 8 | 3 | 6 | 1 |

積を合計すると、

```text
8 + 3 + 6 + 1 = 18
```

これを11で割ると、

```text
18 ÷ 11 = 1 余り 7
```

したがって、検査文字は `7` です。

計算自体は難しくありません。

大切なのは、**各桁と係数の対応をずらさないこと**です。

## 定義・仕組み

チェックディジットは、識別番号や管理番号に誤りがないかを確認するための仕組みです。

英語では、check digitと呼ばれます。

数字だけでなく、規則によっては `X` などの文字を使うこともあります。

### 基本的な流れ

送信側や登録側では、元データから検査文字を求めます。

```text
元データ
↓
一定の規則で計算
↓
検査文字を付加
```

確認する側では、同じ規則で再計算します。

```text
受け取ったデータ
↓
同じ規則で計算
↓
付加された検査文字と照合
```

一致しなければ、入力ミスや転記ミスの可能性があります。

### 重み付き計算

各桁に掛ける係数は、重みとも呼ばれます。

```text
桁の値 × 重み
```

を各桁について求め、合計します。

例として、

```text
データ：2131
重み：4, 3, 2, 1
```

なら、

```text
2×4 + 1×3 + 3×2 + 1×1
= 8 + 3 + 6 + 1
= 18
```

です。

### modとは

`mod` は、割り算の余りを求める演算です。

```text
18 mod 11 = 7
```

は、

```text
18を11で割った余りは7
```

という意味です。

プログラミング言語では、`%` で表すことがあります。

```python
18 % 11  # 7
```

### 余りが10のとき

規則によっては、余りが10になった場合に、1文字で表すため `X` を使います。

```text
余り 0〜9
→ その数字を使う

余り 10
→ Xを使う
```

ただし、すべてのチェックディジットがこの規則を使うわけではありません。

問題文に書かれた規則を優先します。

このテーマは、基本情報技術者試験の基礎理論や誤り検出に関係する内容です。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html) から確認できます。

## 科目Aでどう出る？

科目Aでは、与えられた番号と計算規則から、検査文字を求める問題として出題されます。

### 解く順番

次の順番を崩さないことが重要です。

```text
各桁に係数を対応させる
↓
一つずつ掛ける
↓
積を足す
↓
modで余りを求める
↓
必要なら数字を文字へ置き換える
```

### 表を使う

暗算だけで進めると、係数のずれや足し忘れが起こりやすくなります。

次のように表を作ると安全です。

| 項目 | 1桁目 | 2桁目 | 3桁目 | 4桁目 |
|---|---:|---:|---:|---:|
| データ | 2 | 1 | 3 | 1 |
| 係数 | 4 | 3 | 2 | 1 |
| 積 | 8 | 3 | 6 | 1 |

最後に、

```text
8 + 3 + 6 + 1 = 18
18 mod 11 = 7
```

と計算します。

### 問題文の規則をそのまま使う

チェックディジットの方式には複数あります。

次のような違いがあります。

- 係数の並び方
- 割る数
- 余りをそのまま使うか
- 割る数から余りを引くか
- 10や11を文字へ置き換えるか

そのため、知っている方式を当てはめるのではなく、**問題文に示された規則をそのまま使う**ことが大切です。

## 科目Bでどう使う？

科目Bでは、配列、繰返し処理、剰余演算を使う問題につながります。

例えば、各桁と係数の積を合計する処理は、次のように考えられます。

```text
合計を0にする

各桁について繰り返す
    合計に「桁 × 係数」を加える

合計 mod 11 を求める
```

Pythonで表すと、次のようになります。

```python
digits = [2, 1, 3, 1]
weights = [4, 3, 2, 1]

total = 0

for digit, weight in zip(digits, weights):
    total += digit * weight

check_digit = total % 11

print(check_digit)  # 7
```

科目Bでは、次の処理を読み取れると対応しやすくなります。

```text
配列から順番に値を取り出す
各要素へ係数を掛ける
合計を更新する
最後に余りを求める
```

## どんな場面で使う？

チェックディジットは、番号の入力ミスを見つけたい場面で使われます。

代表例は次のとおりです。

- 商品コード
- ISBN
- 会員番号
- 口座番号
- 管理番号
- 伝票番号

例えば、1桁だけ入力を間違えた場合、再計算した結果と付加されたチェックディジットが一致しないことがあります。

```text
正しい番号
→ 検査結果が一致

入力ミスのある番号
→ 検査結果が不一致
```

ただし、すべての誤りを必ず検出できるわけではありません。

検出できる誤りの種類は、採用している計算方式によって異なります。

## よくある誤解・混同

### チェックディジットは暗号化

違います。

チェックディジットは、番号の誤りを検出するためのものです。

内容を読めなくする暗号化とは目的が異なります。

```text
入力・転記ミスを検出
→ チェックディジット

内容を第三者に読まれにくくする
→ 暗号化
```

### チェックディジットで改ざんを完全に防げる

防止ではなく、主に誤りを検出する仕組みです。

意図的な改ざんへ強く対応するには、ハッシュ値や電子署名などが使われます。

### パリティビットと同じ

似ていますが、対象と計算方法が異なります。

| 比較 | チェックディジット | パリティビット |
|---|---|---|
| 主な対象 | 番号やコード | ビット列 |
| 主な方法 | 各桁へ重みを掛けるなど | 1の個数を奇数・偶数へそろえる |
| 主な目的 | 入力・転記ミスの検出 | 通信や記憶での簡易的な誤り検出 |

### CRCと同じ

CRCは、通信データなどの誤り検出で使われます。

多項式を使った除算によって検査値を求めます。

```text
番号の末尾に検査用の数字
→ チェックディジット

通信データへ多項式計算
→ CRC
```

### ハッシュ値と同じ

ハッシュ値は、データ全体から固定長の値を生成します。

ファイルやメッセージの変化を確認する目的で使われます。

```text
短い番号の入力ミス
→ チェックディジット

データ全体の変化や改ざん確認
→ ハッシュ値
```

### 余りではなく商を使う

問題文が余りを検査文字にすると指定している場合は、商ではなく余りを使います。

```text
18 ÷ 11 = 1 余り7

商：1
余り：7
→ 検査文字は7
```

### 係数を逆に掛ける

先頭から `4, 3, 2, 1` と書かれている場合、左端の桁から順に対応させます。

```text
データ：2 1 3 1
係数　：4 3 2 1
```

対応をずらさないように、表を使うのが安全です。

## まとめ（試験直前用）

- チェックディジットは、番号の誤りを検出する検査用の数字・文字
- 各桁へ係数を割り当てる
- 各桁と係数を掛け、すべて足す
- `mod` は割り算の余り
- 問題文の規則をそのまま使う
- 余り10を `X` にする方式もある
- チェックディジットは暗号化ではない
- パリティビットはビット列、CRCは通信データ、ハッシュ値はデータ全体の確認に使う
- 計算は表にするとミスを防ぎやすい

> **各桁×係数を足し、最後にmodで余りを求める。**
