シリーズ「コンピュータの誤り訂正のしくみ」 第3回
回路が「突き止める」とは?
気づくを、組み合わせる
ここまでの 2 回を、振り返っておこう。
第1回は、4 桁の知らせに、1 の数を偶数にそろえる検査の桁を 1 つ足した。 これだけで、どの 1 桁が化けても、受け取った側のランプが必ず光った。 けれど、どこが化けたかは分からなかった。
前回は、同じ 4 桁を 3 回送り、縦に並んだ 3 つごとに多数決をとった。 これで、1 か所の化けなら直せるようになった。 けれど、送る桁は 12。足した桁は 8 つで、パリティの 8 倍かかった。
そして、前回の終わりに、こう問いかけた。
気づくを組み合わせて、どこが化けたかまで分からないか。
第1回のパリティは、なぜ場所が分からなかったのだろう。 5 桁全部を、1 つのランプで見ていたからだ。 どの桁が反転しても、同じ 1 つのランプが、同じように光る。 光り方が 1 通りしかなければ、場所を言い分けようがない。
それなら、ランプを増やせばいい。 全部の桁をまとめて見るのではなく、桁の組ごとにパリティをかけて、組ごとにランプを付ける。 どのランプが光ったかで、場所が絞りこめるかもしれない。
問題は、組の作り方である。
並べて、縦と横
4 桁の知らせを、2 行 2 列に並べてみる。
1011 なら、1 行目が 1 0、2 行目が 1 1 だ。
こうすると、組が 2 通りの向きで作れる。 横に並んだ 2 つ(行)と、縦に並んだ 2 つ(列)だ。
そこで、それぞれにパリティをかける。
- 行ごとに、1 の数を偶数にそろえる桁を、行の右端に足す(横の検査の桁)
- 列ごとに、1 の数を偶数にそろえる桁を、列の下に足す(縦の検査の桁)
1011 で決めてみよう。
- 1 行目は
1 0。1 は 1 個で奇数だから、横の検査の桁は1 - 2 行目は
1 1。1 は 2 個で偶数だから、横の検査の桁は0 - 1 列目は
1 1。1 は 2 個で偶数だから、縦の検査の桁は0 - 2 列目は
0 1。1 は 1 個で奇数だから、縦の検査の桁は1
どの行も、どの列も、1 の数が偶数になった。 右下の角は、空けておく。
送るのは、知らせの 4 桁と、検査の桁 4 つで、8 桁になる。
受け取った側は、届いた 8 桁を同じ形に並べ直す。 そして、行ごと、列ごとに、1 の数が偶数かどうかを確かめる。 奇数なら、その行(列)のランプを光らせる。
ランプは、行の右端に 2 つ、列の下に 2 つ。 右のランプを横のランプ、下のランプを縦のランプと呼ぶことにする。 どのランプも、第1回のパリティの検査そのものだ。 ただ、見ている桁が、全部ではなく、1 つの行か 1 つの列だけになっている。
押して、確かめる
まずは、ランプが光るところまでを見よう。 直すのは、もう少しあとにする。
縦横のパリティ シミュレータ
知らせを決めてから、⚡ でどれか 1 桁を化かしてみてください
送る側
右の紫=その行(横)の 1 の数を偶数にそろえる桁
下の紫=その列(縦)の 1 の数を偶数にそろえる桁
↓ 8 桁を送る。通り道(⚡ を押した桁が反転する)
↓ 化けた桁:0 か所
受け取る側
右のランプ=その行(横)の 1 の数が奇数なら光る
下のランプ=その列(縦)の 1 の数が奇数なら光る
受け取った側の回路は、送った知らせを知らない
ランプは 1 つも光っていない。どの行も、どの列も、1 の数は偶数だ。
知らせを好きに決めてから、⚡ で空色の知らせの桁を 1 つ化かしてほしい。
横のランプが 1 つと、縦のランプが 1 つ、光る。 光ったランプの行と列には、薄い帯を敷いた。 帯が十字に重なって、濃くなっているマスがあるはずだ。
別の桁を化かしてみる。 光るランプの組み合わせが変わり、十字の重なるところも動く。
ここでも、いつもの確認をしておこう。 受け取った側の回路は、送った知らせを知らない。 赤い枠は、画面の前のあなたにだけ見えている。 回路に分かるのは、4 つのランプのどれが光ったか、それだけだ。
交わるところ
なぜ、十字の重なるところが、化けた桁と一致するのだろう。
1 行 2 列の桁が化けたとする。 この桁は、2 つの検査に見られている。 1 行目の横の検査と、2 列目の縦の検査だ。 だから、その 2 つのランプが光る。
ほかのランプは光らない。 2 行目の横の検査も、1 列目の縦の検査も、この桁を見ていないからだ。
では、逆に考えてみる。 横の 1 行目と、縦の 2 列目のランプが光った。 この 2 つの検査が両方とも見ている桁は、どれか。
1 行目の横の検査が見ているのは、1 行目の桁。 2 列目の縦の検査が見ているのは、2 列目の桁。 両方に入っているのは、1 行 2 列の桁、ただ 1 つしかない。
光った横のランプから行が決まり、縦のランプから列が決まる。 行と列が決まれば、マスは 1 つに決まる。
チェスの盤も、同じ考え方でマスを呼ぶ。 縦の列に a から h、横の段に 1 から 8 の名前を付けて、「e4」のように、列と段の名前を 1 つずつ言う。 それだけで、64 マスのどれなのかが決まる。
数字を並べた表を、縦に足した合計と横に足した合計で確かめる検算にも、似ている。 表のどこかに書き間違いがあると、そのマスの行の合計と、列の合計が、両方とも合わなくなる。 合わない行と、合わない列の交わるところを見に行けばいい。
このシリーズでは、このやり方を縦横のパリティと呼ぶ。 情報処理の教科書では、「水平垂直パリティ」という名前で出てくることが多い。
場所が分かれば、直せる
化けた場所が分かった。 では、どう直せばいいだろう。
答えは、拍子抜けするほど簡単だ。 その桁を、反転すればいい。
化けた桁は、いま間違った値を持っている。 0 と 1 しかないのだから、間違っているなら、正しいのはもう片方しかありえない。 1 なら 0 に、0 なら 1 に戻せば、それが送られた値だ。
今度のシミュレータは、受け取った側が、ランプの光り方から 1 桁を反転する。
縦横で直す シミュレータ
⚡ で化かした桁を、受け取った側が見つけて直せるか見てください
送る側
右の紫=その行(横)の 1 の数を偶数にそろえる桁
下の紫=その列(縦)の 1 の数を偶数にそろえる桁
↓ 8 桁を送る。通り道(⚡ を押した桁が反転する)
↓ 化けた桁:0 か所
受け取る側
右のランプ=その行(横)の 1 の数が奇数なら光る
下のランプ=その列(縦)の 1 の数が奇数なら光る
受け取った側の回路は、送った知らせを知らない
受け取った側が直した 8 桁
受け取った知らせ:1011
緑の ✓ = 回路が反転した桁(回路にも分かる)
✗ = 送ったのと違う(あなたにだけ見える)
ランプは 1 つも光っていない。そのまま受け取る。
知らせの桁を 1 つ化かしてほしい。 「受け取った側が直した 8 桁」で、交わるところのマスに緑の ✓ が付き、値が元に戻る。 受け取った知らせは、送ったとおりだ。
これは、0 と 1 しかない世界だからできることである。
もし 1 つの桁が、0 から 9 までの 10 通りの値をとるとしたらどうだろう。 「このマスが間違っている」と分かっても、正しい値の候補は、いま入っている値を除いて、まだ 9 通り残る。 場所のほかに、「どれだけずれたか」という手がかりが、もう 1 つ要る。
0 と 1 なら、候補は 1 つしか残らない。 場所が分かった時点で、答えも分かっている。
前回の多数決は、同じ桁を 3 つ比べて、多いほうを選んだ。 この回路は、同じ桁の写しを持っていない。 それでも直せるのは、場所を突き止めたからだ。
0 と 1 しかない世界では、化けた場所さえ分かれば、反転するだけで直せる。場所は、縦と横の検査が交わるところにある。
検査の桁も、化ける
化けるのは、知らせの桁だけではない。 検査の桁も、同じ通り道を通ってくるのだから、同じように化ける。
上のシミュレータで、今度は紫の検査の桁を化かしてほしい。 たとえば、1 行目の右端の、横の検査の桁。
横の 1 行目のランプだけが光る。縦のランプは、どれも光らない。
横の検査の桁は、その行の横の検査にしか見られていない。 どの列の縦の検査にも入っていないからだ。
受け取った側は、こう考える。 横のランプが 1 つ光ったのに、交わる縦のランプが無い。 知らせの桁が化けたなら、縦のランプも光るはずだ。 だから、化けたのは、その行の横の検査の桁そのものだ、と。
縦の検査の桁が化けたときも同じで、縦のランプだけが 1 つ光る。
受け取った側の決め方をまとめると、こうなる。
- 横のランプ 1 つと、縦のランプ 1 つが光った → 交わるところの知らせの桁を反転する
- 横のランプだけが 1 つ光った → その行の、横の検査の桁を反転する
- 縦のランプだけが 1 つ光った → その列の、縦の検査の桁を反転する
8 か所のどこが化けても、光り方はすべて違う。
| 化けた桁 | 光るランプ |
|---|---|
| 知らせ 1 行 1 列 | 横の 1 行目 + 縦の 1 列目 |
| 知らせ 1 行 2 列 | 横の 1 行目 + 縦の 2 列目 |
| 知らせ 2 行 1 列 | 横の 2 行目 + 縦の 1 列目 |
| 知らせ 2 行 2 列 | 横の 2 行目 + 縦の 2 列目 |
| 横の検査 1 行目 | 横の 1 行目だけ |
| 横の検査 2 行目 | 横の 2 行目だけ |
| 縦の検査 1 列目 | 縦の 1 列目だけ |
| 縦の検査 2 列目 | 縦の 2 列目だけ |
だから、どの 1 か所が化けても、場所を突き止めて直せる。 検査の桁が化けたときは、知らせはもともと無事だったことになる。
気の早い人は、もう 2 か所を化かしてみたかもしれない。 光り方によっては、回路は「直せない」と言う。 光り方によっては、化けていない桁を反転して、自信満々に間違える。 2 か所は、この回路の手には余る。 この話は、もう少し先の回まで取っておこう。
桁を数える
物差しの表に、1 行足そう。
| やり方 | 送る桁数 | 1 か所化けたら | 2 か所化けたら |
|---|---|---|---|
| そのまま | 4 | 気づかない | 気づかない |
| パリティ | 5 | 気づく | 気づかない |
| 3 回送る | 12 | 直す | 別の桁なら直る。同じ桁の 2 回なら、間違った値に直す |
| 縦横のパリティ | 8 | 直す | 気づくことが多いが、間違って直すこともある |
3 回送るやり方は、足した桁が 8 つだった。 縦横のパリティは、4 つ。 同じ「1 か所なら直す」が、半分の桁でできた。
知らせが長くなると、差はもっと開く。 知らせを大きな正方形に並べれば、足す桁は、行の数と列の数の分だけで済むからだ。
| 知らせの桁 | 並べ方 | 縦横のパリティで足す桁 | 3 回送るなら足す桁 |
|---|---|---|---|
| 4 | 2×2 | 4 | 8 |
| 16 | 4×4 | 8 | 32 |
| 64 | 8×8 | 16 | 128 |
64 桁の知らせなら、3 回送るやり方は 128 桁も足すのに、縦横のパリティは 16 桁で済む。 ただし、直せるのは、表全体で 1 か所までだ。
表の形に並べて、縦と横の両方から確かめるという考え方は、実際の機械にも使われてきた。 1960 年代の IBM の磁気テープ装置を見てみよう。
テープには、長さの方向に、9 本の筋(トラック)が走っている。 1 文字は、テープの幅の方向に並んだ 9 か所に、いっぺんに書く。 次の文字は、その隣に書く。 だから、テープの上では、1 文字が縦の 1 列になり、文字が横に並んでいく。
- 文字の桁(1 文字に 8 か所)
- いちばん下の段:文字ごと(列ごと)に 1 の数をそろえる桁。この回の縦の検査の桁と同じ役
- 右端の 1 文字:筋ごと(行ごと)に 1 の数をそろえる桁。この回の横の検査の桁と同じ役
説明のために描き直した図。実物では、検査の筋は 9 本の真ん中あたりにある。
また、「終わりの 1 文字」の手前にある、もう 1 つの検査の文字は省いた
9 か所のうち 1 か所(図のいちばん下の段)は、その文字の 1 の数をそろえる桁だ。 列ごとの検査だから、この回の縦の検査の桁と同じ役になる。
そして、ひとまとまりの文字を書き終えたところに、筋ごとの 1 の数をそろえる文字を 1 つ書く(図の右端)。 こちらは行ごとの検査で、横の検査の桁と同じ役だ。
テープの上に、この回のシミュレータと同じ向きの表が、ずっと長く引き伸ばされて描かれていたわけだ。 (実際に 1 か所を直すのには、もっと手の込んだ、別の検査の文字も使っていた。)
ランプの使い道
最後に、ランプのほうを数えてみよう。
ランプは 4 つ。 どれも、光るか消えているかの 2 通りだから、光り方は 2 × 2 × 2 × 2 = 16 通りある。
そのうち、受け取った側の決め方で使っているのは、何通りだろう。
- 1 つも光らない(無事)… 1 通り
- 知らせの桁のどれかが化けた … 4 通り
- 検査の桁のどれかが化けた … 4 通り
合わせて、9 通りだけだ。
表を開いた状態のシミュレータを置いておく。 ⚡ を押して、いまの光り方が表のどこに落ちるか、見てほしい。
縦横で直す シミュレータ
⚡ で化かした桁を、受け取った側が見つけて直せるか見てください
送る側
右の紫=その行(横)の 1 の数を偶数にそろえる桁
下の紫=その列(縦)の 1 の数を偶数にそろえる桁
↓ 8 桁を送る。通り道(⚡ を押した桁が反転する)
↓ 化けた桁:0 か所
受け取る側
右のランプ=その行(横)の 1 の数が奇数なら光る
下のランプ=その列(縦)の 1 の数が奇数なら光る
受け取った側の回路は、送った知らせを知らない
受け取った側が直した 8 桁
受け取った知らせ:1011
緑の ✓ = 回路が反転した桁(回路にも分かる)
✗ = 送ったのと違う(あなたにだけ見える)
ランプは 1 つも光っていない。そのまま受け取る。
左の見出し=横のランプ(右の 2 つ)の光り方
上の見出し=縦のランプ(下の 2 つ)の光り方
| 横\縦 | ||||
|---|---|---|---|---|
| 無事 | — | |||
| — | ||||
| — | ||||
| — | — | — | — |
小さな図=回路が「化けた」と考える桁
— = 1 か所の化けでは、こう光らない(直せない)
使うのは 9 通り(無事 1 + 1 か所 8)、空きは 7 通り
表の「—」のマスは、横のランプが 2 つとも光るか、縦のランプが 2 つとも光る光り方だ。 1 か所の化けでは、こう光ることはない。 16 通りのうち 7 通りは、使わずに空いている。
ランプを 4 つ置いたのに、光り方の半分近くを遊ばせている。 なんだか、もったいない。
ランプを減らしても、化けた場所を言い当てられないか。 ランプが減れば、検査の桁も減る。送る桁数は、もっと少なくなるかもしれない。
次回は、ランプを 3 つに減らしてみよう。
参考文献
- 松下俊介 著. 基礎からわかる論理回路. 第2版, 森北出版, 2021.7. 978-4-627-82842-1. https://ndlsearch.ndl.go.jp/books/R100000002-I031573740
- 今井秀樹 著. 符号理論, 電子情報通信学会, 1990.3. 4-88552-090-8. https://ndlsearch.ndl.go.jp/books/R100000002-I000002038659
- IBM. "IBM 2400-Series Magnetic Tape Units: Original Equipment Manufacturers' Information". Form A22-6862-4, 5th ed., IBM. https://bitsavers.org/pdf/ibm/2400/A22-6862-4_2400_Series_Magnetic_Tape_Units_OEM.pdf, (参照 2026-9-28).