今天看了永乐大帝有关身份证的科普视频,然后又回去把回形针的相关视频看了一下,感觉其中的 MOD 11-2 校验挺有意思的,今天就较为详细的讲一下它到底是怎么一回事儿。
GB11643-1999 是我国现行公民身份证号的国家标准。我们可以很容易地找到这一文件。
身份
身份证号即公民身份号码,由 18 位号码组成。身份证号码分为两部分,本体码和校验码。
本体码
身份证号的前十七为本体码(master number),排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码。这一部分较为简单,我不再赘述。
校验码
身份证号的第十八位为校验码(check number),可由前十七位通过规定的数学关系式运算得到。具体采用 MOD 11-2 校验码算法。
MOD 11-2 校验
首先身份证号码的每一位都有其固定的加权因子$Wi$,它等于 $2$ 的 $18-i$ 次方除以 $11$的余数,$i$为各个号码的位数,即:
$$ W_i = 2^{18-i}\pmod {11} $$
将前十七位号码$a_i$与其对应的加权因子$W_i$相乘再相加,可以得到数值$S$:
$$ S = \sum_{i=1}^{17}W_i×a_i $$
求出$S$除以 $11$ 的余数:
$$ S\pmod{11} $$
再用 $12$ 减去这个余数:
$$ 12-S\pmod{11} $$
最后计算出该差除以 $11$ 的余数,就得到了最终的校验码 $a_{18}$:
$$ a_{18} = (12-S\pmod{11})\pmod{11} $$
好了,我们已经知道了算法,让我们试试吧(此处以上面提到的国家标准里的附录 A 为例):
一公民的身份证号码为 11010519491231002X
我们可以求出前十七位各自的加权因子
首先举个栗子,我们求出第 5 位的加权因子$W_5$:
$$ 2^{18-5} = 2^{13} = 8192 $$
$W_5$就应等于 8192 除以 11 的余数:
$$ W_5 = 8192\pmod{11} = 8 $$
同理,一通计算猛如虎,我们可以轻松得出下面这一关于$W_i$与$a_i$关系的表格:
$a_i$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$W_i$ | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
然后求出数值 $S$:
$$ S = \sum_{i=1}^{17}W_i×a_i = 7*1+9*1+10*0+5*1+8*0+4*5+2*1+1*9+6*4+3*9+7*1+9*2+10*3+5*1+8*0+4*0+2*2 = 167 $$
用 167 除以 11 商 15 余 2 :
$$ 167\pmod{11} = 2 $$
12 减去 2 的差为 10 ,10 除以 11 商 0 余 10 :
$$ (12-2)\pmod{11} = 10 $$
因此校验码$a_{18}$等于 10 ,又身份证号码限定为 18 位,故 10 用罗马数字 X 代替,此公民的身份证号码校验码为 X 。
注:本文参考以下资料:
- 中华人民共和国国家标准《 GB 11643-1999 公民身份号码》
- 维基文库《 GB 11643-1999 公民身份号码》
咳咳
第一次体验 LaTeX ,感觉不错,很容易上手。
长知识了@(吐舌)