トップQs
タイムライン
チャット
視点

Dammアルゴリズム

ウィキペディアから

Remove ads

Dammアルゴリズムは、誤り検出の一種であるチェックディジットアルゴリズムであり、全ての1桁入力誤りと全ての隣り合う2桁の入れ替え誤りを検出することができる。2004年にH. Michael Dammによって発表された[1]

利点と欠点

Dammアルゴリズムは、Verhoeffアルゴリズムと同様に、最も頻繁に起こる2種類の誤り、すなわち1桁の入力誤りと、(末尾に付け足されたチェックディジットとその直前の数字の入れ値替えを含む)隣り合う2桁の入れ違えの、2種類の誤りを検出できる[1][2]。しかしDammアルゴリズムは、Verhoeffアルゴリズムと異なり、実行に際し、専用に構成された置換表と位置に応じた冪乗表を必要としない。さらに、逆元の表も演算表の主対角成分が0の時は必要ない。

Dammアルゴリズムは10種を超えるチェックディジットを出力しないため、(ISBN10のチェックディジットにおける'X'のような)数字以外の文字をチェックディジットとして用意する必要がない。

チェック対象の数字列の先頭に0をいくつ付け加えても、チェックディジットには影響しない[1]

英語の聞き取り間違いによる入力間違い (13←→30, 14←→40, …, 19←→90) を全て検出できる全反対称準群 (totally anti-symmetric quasigroups) が存在する。後述の例においてはそのような性質を満たす表のうちの1つを用いている。

このように、類似のチェックディジットアルゴリズムが利用される場面においてより優れた特徴があるにもかかわらず、Dammアルゴリズムは広く知られてはおらず、また利用例もほとんどない。

Remove ads

デザイン

Dammアルゴリズムの根幹をなすものは位数10の準群 (quasigroup)(例: 10×10のラテン方格乗積表として用いる)である。この準群は弱い全反対称性 (weakly totally anti-symmetric) という特徴を持つ[3][4][i][ii][iii]。Dammは位数10の全反対称性準群を作成するいくつかの方法を発見し、いくつかの作成例を彼の博士論文に示した[3][i]。また、これにより位数10の全反対称準群は存在しないとする論に対する反例を示した[5]

準群 (Q, *) は全ての c, x, y ∈ Q において、以下の2つの性質を満たす時全反対称と呼ばれる[4]

  1. (cx) ∗ y = (cy) ∗ xx = y
  2. xy = yxx = y,

また、上記の内1.だけの性質を満たす時は弱い全反対称と呼ばれる。Dammは位数nにおいて弱い全反対称準群が存在することと、同じ位数nに全反対称準群が存在することが同値であることを証明した。Dammアルゴリズムの検査式 (…((0 ∗ xm) ∗ xm−1) ∗ …) ∗ x0 = 0 を満たすために、使用する弱い全反対称準群は x * x = 0 の性質を満たす必要がある。このような準群は任意の全反対称準群から、0が主対角線上に並ぶように列を入れ替えることで作成できる。また逆に、任意の弱い全反対称準群から、最初の行が自然順になるように列を入れ替える事で全反対称準群を作成できる[3]

Remove ads

アルゴリズム

チェックディジットを含む数字列の正当性は準群の上で定義される。Dammの博士論文(98, 106, 111ページ)に、利用可能な準群の表が用意されている[3]。チェックディジットの計算を簡潔にするため、主対角線に位置する要素が0であると良い[1]

チェックディジットを含む場合の正当性検査

  1. 仮変数を用意し、0で初期化する。
  2. 数字列を順に1桁ずつ処理していく: 処理中の数字を列番号、仮変数を行番号とした時の表の要素を新しい仮変数の値として置き換える。
  3. 数字列を全て処理し終えた時、仮変数が0である時のみ数字列は正当である[1]

チェックディジットの計算方法

前提条件: 表の主対角要素のエントリは全て0である

  1. 仮変数を用意し、0で初期化する。
  2. 数字列を順に1桁ずつ処理していく: 処理中の数字を列番号、仮変数を行番号とした時の表の要素を新しい仮変数の値として置き換える。
  3. 数字列を全て処理し終えた時の仮変数の値がチェックディジットなので、数字列の最後に付け加える[1]

以下に示す表を使用する[1]。これはDammの博士論文の111ページにある全反対称準群[3]の列を入れ替え、対応する要素を変更したものである。

0 1 2 3 4 5 6 7 8 9
0 0317598642
1 7092154863
2 4206871359
3 1750983426
4 6123045978
5 3674209581
6 5869720134
7 8945362017
8 9438617205
9 2581436790

数字列として 572 を例に取る。

チェックディジットの計算

さらに見る 処理される数字 → 列番号, 元の仮変数 → 行番号 ...

結果として仮変数の値 4 が得られる。これが計算されたチェックディジットである。これを最後に付け加えて数字列 5724 を得る。

チェックディジットを含む数字列の正当性を検査する

さらに見る 処理される数字 → 列番号, 元の仮変数 → 行番号 ...

結果、仮変数値は 0 となった。よってこの数字列は正当である。

図解

以下は上記のチェックディジット(青い破線)を計算する方法の詳細と、数字列 572 にチェックディジットを加えた数列の正当性検査を図解したものである。

Thumb

Remove ads

参考文献

外部リンク

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads