本文へ移動
目次へ
データのまちがいは、どうやって見つけるの?:内容をイメージした挿絵
コンピューター

データのまちがいは、どうやって見つけるの?

0と1が一つ入れ替わっても、見張り役の数字があれば気づける? 偶数の約束と、たてよこの手がかりを試してみよう。

まず、ひとことで

元のデータに確認用の情報を足すと、約束が崩れた場所を探せる。ただし、見つけられるまちがいには条件と限界があるよ。

数字が届いても、正しいとは限らない

友だちから「明日は三時」という手紙が来たとする。でも途中で数字が変わって「明日は八時」になっていたら、文章として読めても困るよね。コンピューターでも、データが保存されたり運ばれたりする途中で、値が変わることがある。

ここではデータを、0か1が書かれたカードの列で考えよう。この一つ分の情報をビットというよ。送った列が1011なのに、受け取った列が1001だったら、一か所が変わっている。どちらも0と1だけでできているので、見ただけでは間違いと分からないね。

そこで、もとの情報とは別に、確認用の情報を足す。「どんな列でもよい」から「決めた約束を満たす列だけが正しい」へ変えるんだ。受け取った列が約束から外れていたら、途中に何かあったと気づけるよ。

1の数を、偶数にそろえよう

試しに、確認用のビットを最後に一つ付けて、列全体の1の数を偶数にすると決めよう。偶数は二つずつ組にして余らない数で、0、2、4、6などだよ。0個も偶数として扱うんだ。

データが1011なら、1は三つある。確認用に1を足して10111にすれば、1は四つになる。データが1001なら、1は二つなので、確認用は0でよい。こうして付ける見張り役を「パリティビット」というよ。

10111のうち一つだけ値が反転すると、1の数は必ず一つ増えるか減る。偶数が奇数になるので、約束が崩れたと分かるんだ。最後の確認用ビット自体が反転した場合でも、一つだけの反転なら同じように気づけるよ。

データ1011へ確認用1を足し、一か所が反転すると1の数が四個から三個へ変わる図
偶数の約束が、崩れたよ

最後の黄色い数字が確認用ビット。どこか一つだけ0と1が反転する例だよ。1の数が奇数になったことは分かるけれど、この列だけでは場所を決められない。

出典資料に基づきEggplanetが作成した模式図

気づけることと、直せることは別

受け取った列の1が奇数だったら、何かが変わったと考えられる。でも、どのカードを戻すべきかな。一つ直せば偶数になる場所は、いくつもある。確認用ビットが一つだけでは、間違いの場所までは決められないんだ。

間違いが起きたことを見つけるのが「誤り検出」。正しいデータへ直すのが「誤り訂正」だよ。検出できる仕組みが、いつも訂正までできるとは限らない。分からないときに適当に直すと、新しい間違いを作ってしまう。

別の方法として、送り手にもう一度送ってもらうことも考えられるね。ただし、再送に時間がかかったり、元の情報を送り直せなかったりする場面もある。どんな間違いを想定し、やり取りに何ができるかで、必要な仕組みが変わるよ。

たてとよこ、二つの見張りを合わせる

今度はカードを四角く並べよう。各行の右端に一枚ずつ足して、行ごとの1の数を偶数にする。次に各列の下にも一枚ずつ足して、列ごとの1の数も偶数にする。右下のカードまで含めて、全部の行と列をそろえるんだ。

この表の一枚だけを反転させると、そのカードのある行と列だけが奇数になる。変になった行を横に、変になった列を縦にたどってみよう。二本が交わる場所が、反転したカードだよ。一枚だけ変わったという条件があるので、場所を決められるんだ。

地図で道の名前を二つ聞くと、交差点が分かることに似ているね。ただし本物のデータは道を歩いているわけではない。複数の確認結果を組み合わせ、候補を一つに絞るというところが、このたとえの共通点だよ。

右下の確認用カードも忘れないでね。一番下の行を偶数にする値と、一番右の列を偶数にする値は一致する。内側の1を、行から数えても列から数えても総数は同じだからだよ。確認用の端まで含めると、端の一枚が変わった場合も交差点で探せるんだ。

四行四列の確認表で一枚が変わり、その行と列を線で示して交差点のカードを特定する図
変わった行と列の、交差点を探す

右端と下端は確認用。元は全部の行と列で1が偶数個あり、一枚だけ反転した設定だよ。複数の間違いを必ず直せるという図ではないよ。

出典資料に基づきEggplanetが作成した模式図

二つ、四つ変わったらどうなる?

一列だけを偶数にする仕組みでは、二つのビットが反転すると、1の数が偶数のままになる。二つ増えても、二つ減っても、一つずつ増減しても偶数だね。「約束を満たしている」だけでは、絶対に正しいとまでは言えないんだ。

たてよこの確認も万能ではない。長方形の四つの角にあるカードを反転させると、それぞれの行と列では二枚ずつ変わる。どの行と列も偶数のままなので、この仕組みでは見逃してしまうよ。表の形を描くと、この限界も確かめられる。

だから、「どんな場合なら見つけられるか」を説明することが大切なんだ。複数の反転が起きたかもしれないのに、一枚だけの方法で無理に直してはいけない。実際の機器では、想定する間違いに合わせて、もっと複雑な確認の約束も使われているよ。

ここで調べたのは、カードの位置と枚数は変わらず、値だけが反転する間違いだよ。カードが一枚なくなる場合や、順番が入れ替わる場合には、別の約束も必要になる。どんな失敗に備えているかを最初に決めることも、仕組みづくりの一部なんだ。

確認のための情報は、むだなの?

元のデータが九枚で、たてよこの確認用に七枚を足したら、全部で十六枚になる。これは三行三列に一行と一列を足す、紙上の例だよ。情報を増やすので、送ったり保存したりする量は大きくなる。

でも、その余分な分のおかげで、九枚だけでは得られなかった手がかりを受け取れるね。圧縮が繰り返した説明を減らす工夫なら、誤りに備える符号化は、確かめるための情報を意図して足す工夫だと考えられる。どちらも目的のある設計なんだ。

増やす量と、見つけたり直したりできる間違いの範囲には関係がある。たくさん足せばよいと単純には決められない。使える時間や容量も考えながら、どれくらいの備えを持たせるか選ぶんだよ。確認用の情報にも、ちゃんと仕事があるね。

どっとと考えよう:見張り役になれる?

紙に三行三列の0と1を書き、右と下に確認用の数字を足して四行四列にしよう。すべての行と列で、1の数が偶数になったか確かめる。友だちには、見ていない間に一か所だけ数字を反転してもらおう。紙の上なら、何度でも安全に試せるよ。

奇数になった行と列を見つけ、交差する数字を戻してみてね。そのあと、最初の表と本当に一致したか比べよう。確認の約束だけを見る検査と、元のデータそのものを比べる検査は別なので、両方を試すと仕組みがよく分かる。

最後に、四つの角を反転する例も作ろう。見張りをすり抜けたら実験は失敗なのかな。そうではなく、どこまで使える仕組みかを発見できたんだ。「いつ成功するか」と「どんなとき失敗するか」を両方説明できたら、立派な設計者の考え方だよ。

ことばのメモ

ビット
0か1の二つの値で表す、一つ分の情報。
パリティビット
1の個数が決めた偶奇になるように付ける確認用のビット。
誤り検出
データが変わったことを、確認用の約束などで見つけること。
誤り訂正
手がかりを使って、変わったデータを元の値へ直すこと。

もとになった資料・もっと知りたい人へ

下記の資料をもとに、説明と考える問題を独自に構成しています。外部資料には英語のページもあります。どっとの画像は案内用のイラストで、観測写真や科学的な図ではありません。

分かりやすくするために、説明を短くしたり、たとえ話を使ったりしています。まちがいを見つけたらお問い合わせへお寄せください。制作方法は編集方針、いっしょに読むときのヒントは保護者・先生へで紹介しています。