a1+3*a2+a3+3*a4+a5+3*a6+a7+3*a8+a9+3*a10+a11+3*a12+a13=0 … (1)
1つ飛びに3倍していきます. ただし,かけ算,たし算は10 で割った余りの世界で行います.(1) 式は
a1+a3+a5+a7+a9+a11+a13+3*(a2+a4+a6+a8+a10+a12)=0 … (2)
と書くことができます.すなわち,偶数番の和の3倍に a1 以外の奇数番の和を足したものが -a1 になります.これがエラーチェックの定義です.
なぜ10 で割った余りの世界か
前節で10 で割った余りの世界では1次方程式が一意な解をもたないので「まずい」と言いました.
でも,10 で割った余りの世界でも1次方程式が一意な解をもつことがあります.
ax=b
の場合,
a が 10 と互いに素な数 (a = 1,3,7,9)であれば,O.K. です.
a = 0,2,4,5,6,8 の場合は一意な解を持たなかったり,解が存在しなかったりします.
このために 3 倍を用います.7 倍や 9 倍を用いても同じです.
定義式 (1) で1つ飛びに3倍しているのは隣り合う数を交換すると別な値になるようにするためです.
しかし,この定義では奇数番同士,
あるいは偶数番同士を入れ換えて読み込んでもエラーの検出はできません.
11 を使った ISBN では検出できました.ISBN よりエラー検出の精度が悪いと言えます.
でも,1つ飛んで読み間違えることはほとんどなく,
この程度の精度の悪さには目をつむろうというのです.
10 で割るのは簡単ですし,何よりケタ数が何ケタでもこの方法は使えます.
もう少し対称性を少なくさせるのなら,7 とか 9 も使って
a1+3*(a2+a5+a8+a11)+7*(a3+a6+a9+a12)+9*(a4+a7+a10+a13)=0 … (3)
のような定義にすることもできます.あるいは
a1+a5+a9+a13+3*(a2+a6+a10)+9*(a3+a7+a11)+7*(a4+a8+a12)=0 … (4)
なども可能です.でも (2) はとてもシンプルです.
注2.偶数番の和の3倍か,奇数番の和の3倍かは混乱しそうです.
こんな時は偶数,奇数に関係なく,エラーチェックの隣から3倍していくと考えればよいでしょう.
そうすれば自然に (2) 式は出てきます.
エラーチェックを求めることを考えればそれ自身は3倍しない方が便利ですから.