解決済み

チェックディジットに(検査数字)ついて質問です。


チェックディジットにはmodulus 10 weight 10-2や、modulus 10 weight 3,1など様々なものがあるようですが、なぜweightをかける必要があるのでしょうか。


10進数で数字を表す際は、すべての位の数の和の一の位(modulus 10 weight 1)で、その数字列に間違いがないか、もしくは数字列中の欠けた一桁を算出するには、事足りると思います。


modulus 10 weight 10-2などを用いることで、複数桁欠けていてもチェックディジットによって算出できるというわけでもなさそうです。


どなたかご解答お願いします。


補足

チェックディジットの計算法の例は以下のサイトにあります。

https://ja.wikipedia.org/wiki/ISBN

ベストアンサー

ベストアンサー

人間が書籍番号を入力して,データベース上の書籍情報にアクセスしようとしている状況を考えます。データベースへのアクセスにはそれなりのコストがかかる(一般にサーバとの通信が必要で,タイムラグが生じるかも知れない)ので,入力文字列に入力ミスがあるときはそれを検知して,無駄な通信をおこなうまえに入力者に訂正をうながせると良いです。


注目したいのは,入力文字列がランダムなものではなく,人間の手で入力されたものだということです。


人間の入力ミスには一定の傾向があると考えられます。たとえば,1234512345 と打つべきところで,過って 5˙4˙3˙2˙1˙\dot{5}\dot{4}\dot{3}\dot{2}\dot{1} と打ち間違える人がいるとはなかなか考えられません。よくありそうなミスは


(1) 11 文字だけの打ち間違い

1234512345 と打つべきところを 12346˙1234\dot{6} としてしまうなど)


(2) 隣接する 22 文字が転倒する打ち間違い

1234512345 と打つべきところを 124˙3˙512\dot{4}\dot{3}5 としてしまうなど)


あたりだと思われます。


modulus 1010 weight 11 の方式では,(1) の打ち間違いは必ず検知できますが,(2) の打ち間違いはまったく検知できません。


modulus 1111 weight 1010-22 や,modulus 1010 weight 3,13,1 の方式では,(1) の打ち間違いは必ず検知でき,(2) の打ち間違いも大部分(前者の方式なら 100%100\% の精度で,後者なら 90%90\% の精度で)検知できます。


それなので,いま仮定しているような状況では,weight 無しより weight 有りの方がより多くのミスを検出できると期待されます。


もしも入力文字列がランダムなら,weight 無しでも,有りでも,検出できる量の期待値にちがいは生まれません。ISBN などで weight 有りの方式が採用されている理由は,人間の手入力を仮定しているからではないかと思います。


質問者からのお礼コメント

質問者からのお礼コメント

ご丁寧な回答有難うございます。

そのほかの回答(0件)