Verhoeff算法的正确置换周期

时间:2010-05-20 10:15:21

标签: algorithm permutation check-digit

我正在为支票数字方案实施Verhoeff算法,但在网络资源中似乎存在一些分歧,即哪个排列周期应构成排列表的基础。

Wikipedia使用:(36)(01589427)

while apparently,Numerical Recipies使用不同的循环,this book使用:(0)(14)(23)(56789),引自Winters 1990年的一篇文章。它还指出,Verhoeff使用了维基百科的一个引用。

现在,我的数论有点生疏,但维基百科周期显然会在第8次权力之后重复,而第一本书将需要10,尽管它说s ^ 8 = s。表2.14(b)在2个周期中有其他错误,所以无论如何这都是可疑的。

不幸的是,我没有原始文章的副本(并且太过于支付/厌恶40年前的知识仍被出版商勒索赎金),也没有数字食谱的副本要检查(和我不愿意安装他们的偏执狂诱导的版权保护插件来在线查看。

所有人都知道哪个是正确的?它们都是正确的吗?

2 个答案:

答案 0 :(得分:2)

有一个旧版本的Numerical Recipes可用here作为PDF。 Verhoeff算法在第20.3节中描述。它使用与维基百科文章相同的排列。

答案 1 :(得分:1)

置换(0)(14)(23)(56789)优于置换(36)(01589427)。这是因为,(36)(01589427)只能检测88.89%的单个转置错误,而(0)(14)(23)(56789)可以检测到所有这些错误。如果使用(36)(01589427),则考虑将数字代码716赋予0作为校验位。即,代码将是7160.但是,如果数字1和6被转置,则该校验位方案不会给出错误,因为校验和为零。 (0)(14)(23)(56789)不是这种情况。