海上コンテナには、一つひとつ管理番号が付けられているということを、以前、紹介しました。
この写真の左下のコンテナの管理番号は、「NYKU 484074 4」です。
「NYK」は日本郵船が所有者であることを示しています。
「484074」は日本郵船がつけたコンテナ番号です。
で、一番最後の「4」がチェックデジット(しばしば、四角い枠の囲み数字になっています)。
1.チェックデジットの計算方法(ISO6346)
(1)各桁のアルファベット及び数字に対して、下表にしたがって、0〜38の数字を割り当てる。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
A | B | C | D | E | F | G | H | I | J | K | L | M |
10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 |
N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 36 | 37 | 38 |
例えば、「NYKU 484074」の場合、
N | Y | K | U | 4 | 8 | 4 | 0 | 7 | 4 |
25 | 37 | 21 | 32 | 4 | 8 | 4 | 0 | 7 | 4 |
となります。
(2)次に、各桁の数字に、それぞれ、20、21〜29を掛けます。各桁の掛け算の結果は黄色文字の通りです。
N | Y | K | U | 4 | 8 | 4 | 0 | 7 | 4 |
25 | 37 | 21 | 32 | 4 | 8 | 4 | 0 | 7 | 4 |
20=1 | 21=2 | 22=4 | 23=8 | 24=16 | 25=32 | 26=64 | 27=128 | 28=256 | 29=512 |
25 | 74 | 84 | 256 | 64 | 256 | 256 | 0 | 1792 | 2048 |
(3)各桁の掛け算の結果を足し合わせます。
25+74+84+256+64+256+256+0+1792+2048=4855
(4)足し合わせた結果を「11」で割った余りを求めます。
4855÷11=441余り4
この「余り」4がチェックデジットになります。
確かに、写真にあるように、末尾の数字は「4」です。
もし、余りが10になるときはチェックデジットを一桁で表せなくなるので、そのようなコンテナ番号は使わないことを推奨しています。ただし、禁止しているわけではないので、「0」で代用されていることがあるようです。とは言うものの11で割り切れる場合(=余り0)もチェックデジットが「0」になってしまうので誤り検出の効果が薄らいでしまいます。
ちなみに、ISBNでは余り10の場合はチェックデジットとして「X」を使うことになっています。
2.議論
2.1 アルファベットへ割り当てる数字について
各桁のアルファベットに数字を割り当てる際に、「11」「22」「33」は使われていません。これは、その桁に何を掛けても11で割り切れてしまって0になるため、その桁の情報が失われてしまうことを懸念しているようにみえます。
しかし、実際のところ数字の「0」に対しては「0」を割り当てていたりするので、あまり意味のあることには思えません。そもそも、たとえ11の倍数を使わなかったとしても、「B(=12)」を「L(=23)」や「V(=34)」のように11の倍数分ずれた文字と間違えた場合には、チェックデジットが一致してしまうため誤りを検出できないので、いずれにせよ「11」「22」「33」を使わないことの実効力は薄いように思います。
2.2 代替計算法
20、21〜29を用いることは、なにやら複雑な計算をしているように見えますが、実は、これはもっと単純化することができます。2のべき乗である1、2、4〜256、512の代わりに、それぞれを11で割った余りを用いても同じ計算結果が得られます。
N | Y | K | U | 4 | 8 | 4 | 0 | 7 | 4 |
25 | 37 | 21 | 32 | 4 | 8 | 4 | 0 | 7 | 4 |
20=1 →1 |
21=2 →2 |
22=4 →4 |
23=8 →8 |
24=16 →5 |
25=32 →10 |
26=64 →9 |
27=128 →7 |
28=256 →3 |
29=512 →6 |
25 | 74 | 84 | 256 | 20 | 80 | 36 | 0 | 21 | 24 |
25+74+84+256+20+80+36+0+21+24=620
620÷11=56余り4
このようにチェックデジットとして、ちゃんと「4」が得られます。
ちなみに、単に計算を簡単にするのであれば、 計算法(1)で割り当てた数字も11で割った余りで代替してもOKです。
N | Y | K | U | 4 | 8 | 4 | 0 | 7 | 4 |
25 →3 |
37 →4 |
21 →10 |
32 →10 |
4 →4 |
8 →8 |
4 →4 |
0 →0 |
7 →7 |
4 →4 |
20=1 →1 |
21=2 →2 |
22=4 →4 |
23=8 →8 |
24=16 →5 |
25=32 →10 |
26=64 →9 |
27=128 →7 |
28=256 →3 |
29=512 →6 |
3 | 8 | 40 | 80 | 20 | 80 | 36 | 0 | 21 | 24 |
3+8+40+80+20+80+36+0+21+24=312
312÷11=28余り4
というように、正しいチェックデジット「4」が得られます。
ということになると、計算法(1)でアルファベットに割り当てる数字は下表のようにしても同じ結果が得られることになります。
A | B | C | D | E | F | G | H | I | J | K | L | M |
10 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 1 | 2 |
N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 1 | 2 | 3 | 4 | 5 |
この表をみれば、2.1節で述べたように「B」=「L」=「V」であることが明確にわかります。同様に「G」=「Q」だったりもします。参考までに、「B」=「V」としていることは、一般的なQWERTY配列のキーボードでは、隣り合うキー同士であることに加え、非母国語圏では発音も似ているので、あまりよろしくありませんね。
2.3 原始根の活用
上記2.2節の興味深いことは、20、21〜29を11で割ったときの余りが、1、2、4、8、5、10、9、7、3、6と、1〜10までの数字がダブることなく並んでいることです。
これを、数学の整数論では、「2は法11のもとで原始根」である、といいます。この他にも、「3は法7のもとで原始根」だったりします。すなわち、31、32〜37は3、2、6、4、5、1、3となり、1〜6の数字がダブることなくすべて並びます。
このような原始根が存在するのは、法(上記計算法で割り算する時の数字)が奇数の素数であるとき、など一定の条件が整った時のみで、どんな数字でも成り立つわけではありません。このような原始根について初めて示唆したのはオイラーで、その後、1801年にガウスが明確に定義したとされています。
前述の計算方法で、各桁に「1、2、4、8、5、10、9、7、3、6」を掛けると記述するのではなく、「20、21〜29」を掛けると記述しているのは、「原始根という概念を用いているのだ」という強いメッセージ性を備えているといえます。
副次的に、「1、2、4、8、5、10、9、7、3、6」というランダムで覚えにくい数字を用いるより、「20、21〜29」という規則正しい表現を用いることでプログラミングの際などに間違える可能性を低くしているという効果も考えられます。
ちなみに、Wikipediaでは"11 is used as divisor because a container number has 11 letters and digits in total."→「11という数字が割り算に選ばれた理由は、コンテナ番号が全11文字(桁)だから」と記載されていますが、これは間違いとは言いませんが、どちらかというと逆で、「実績の多い法11を採用することを前提にすると、文字列の本体部分として11未満の異なる自然数を割り当てることが可能になるのは最大10桁であり、チェックデジットを加えて11桁とすることが最適だ」ということです。
実際のところ、各社のコンテナ番号として6桁(=100万個)も確保できるので、実用上、ほぼ十分と言えます(もし足りない場合でも、一社で複数のBICコードを取得しているようです)。
さらなる発展形はこちら