为什么身份证最后一位可能出现 X(shí)?
公众号原标题:【数学科普】为什么身份证最后一位可能出现 X(shí)?
为什么身份证最后一位可能出现 X(shí)?
有些身份证号最后一位是 X。这里的 不读“叉”,而读“十”,表示数值 。
身份证最后一位是校验码。它由前 17 位计算得到,用来发现常见录入错误,例如某一位输错、相邻两位输反等。
身份证校验的核心可以概括为一句话:
先选用模 11 作为校验环境,再用 的幂作为位置权重。
也就是把身份证号写成一个“广义二进制”加权和:
再要求:
等价地:
这套设计解释了两个问题:
为什么要用模 11,为什么又偏偏用 作为权重。
1. 先确定模数:为什么是 11?
校验码的目的不是“算出一个好看的数字”,而是尽量发现录入错误。
最常见的错误有两类:
例如:
以及:
例如:
要检测这些错误,模数的选择很关键。
2. 小于 10 的模数不够用
若模数 ,数字之间可能相差 。
例如使用 mod 9 时:
数字差为:
于是:
无论这一位的权重是什么,都有:
也就是说,这类单个数字错误无法被发现。
所以,若希望稳定检测单个数字错误,模数至少不能小于 10。
3. mod 10 看似方便,但有硬伤
mod 10 的余数正好是:
如果用 mod 10,校验码可以全部写成数字,不会出现 。
但 mod 10 不是质数:
在模 10 下,存在非零数相乘后等于 0 的情况:
这会影响检错能力。
若某一位权重为 ,数字错差为 ,例如:
加权和变化量为:
错误发生了,校验结果却不变。
4. 重新设计 mod 10 权重也难以兼顾换位错误
也许可以不用权重 ,重新设计一组 mod 10 权重。
但若要检测所有单个数字错误,每个权重 都必须与 10 互素。
否则存在非零数字差 ,使得:
与 10 互素的余数只有:
它们全是奇数。
再看相邻两位交换。设相邻权重为 ,相邻数字为 。交换造成的变化量是:
如果 都是奇数,那么:
一定是偶数。
取一组相邻数字,使得:
则:
必为 10 的倍数,于是:
这类相邻交换无法检测。
因此,mod 10 很难同时保证:
和:
5. mod 11 是最小的合适选择
11 有两个优点。
第一,11 是质数。
在模 11 下,两个非零数相乘仍然非零。
第二,11 只比 10 多一个余数:
十进制字符只能表示:
多出来的这个数值 ,只需要用一个额外符号表示。身份证中采用:
若使用更大的模数,例如 mod 13,则需要额外表示:
至少要引入三个非数字字符。
所以,mod 11 是一个折中:
比 mod 10 更可靠,又只多付出一个 的字符成本。
6. 模数确定后,为什么不用十进制权重?
身份证号本身是十进制数字,最自然的想法是直接把它看成十进制数:
然后做 mod 11 校验。
但十进制权重在 mod 11 下会退化。
因为:
所以:
于是:
在 mod 11 下只剩:
也就是说,权重只有两种:
这种校验本质上只区分奇数位和偶数位,位置信息保留得太少。
比如相隔两位的位置权重相同:
如果第 位和第 位交换,变化量是:
而:
所以这类交换不会改变校验结果。
因此,在已经选定 mod 11 的前提下,直接使用十进制权重并不理想。
7. 为什么选择 :2 是 mod 11 的原根
身份证校验使用:
关键原因是:
是模 11 的原根。
“原根”可以简单理解为:
用它不断乘下去,在模 11 下可以生成所有非零余数。
具体看:
依次为:
这正好是模 11 下的全部 10 个非零余数。
直到:
才开始循环。
所以,在模 11 下的周期是 10。
这说明 作为权重时,可以让不同位置尽量拥有丰富的非零权重。
对比十进制权重:
周期只有 2。
而二进制权重:
周期为 10。
这就是为什么在 mod 11 校验中,不直接采用十进制权重,而采用 权重。
8. “转成二进制”是什么意思
这里说的“二进制”,不是把身份证号变成一串 和 。
普通二进制数形如:
其中每个 只能取 或 。
身份证校验中使用的是:
每个 仍然是十进制数字,校验位还允许 。
所以更准确地说,它是一个“广义二进制”加权和:
使用二进制的权重 ,但每一位的数字不局限于 。
9. 身份证校验公式
将身份证号从左到右写成:
其中 是最后一位校验码。
若最后一位是 ,规定:
构造:
即:
身份证号码有效时满足:
也可以写成:
10. 常见权重表从哪里来
实际书写身份证号时,通常从左到右写 18 位。
最右边的校验位 权重是:
前 17 位从左到右对应权重为:
对 11 取余后得到:
这就是身份证校验中常见的权重序列。
若前 17 位从左到右记为:
对应权重为:
则:
校验码记为 ,完整校验条件是:
因此:
11. X 从哪里来
模 11 的余数共有 11 种:
但单个十进制字符只有 10 个:
当校验码需要取数值 时,就要用一个额外符号表示。
身份证中规定:
若:
则:
对应关系如下:
所以,身份证最后一位出现 ,只是因为校验码需要表示数值 。
12. 为什么能检测单个数字错误
假设某一位由 错输为 ,且:
这一位的权重为 。
加权和变化量是:
因为 都是十进制数字,所以:
在 mod 11 下,这些数都不是 0。
同时:
而:
又因为 11 是质数,模 11 下两个非零数相乘仍非零:
因此,任意一位数字输错,校验结果都会改变。
13. 为什么能检测相邻两位交换
设相邻两位原来是:
对应权重为:
交换前贡献为:
交换后贡献为:
变化量为:
整理得:
即:
若 ,则:
在 mod 11 下非零。
同时:
所以:
因此,相邻两个不同数字交换,校验结果一定改变。
14. 小结
身份证校验的设计顺序可以这样理解:
为了检测单个数字错误,模数不能小于 10; mod 10 虽然不用 ,但不是质数,难以兼顾单错和相邻交换; mod 11 是最小的可用质数,只比十进制多一个余数; 余数 用 表示; 确定 mod 11 后,十进制权重 会退化为 交替; 2 是 mod 11 的原根,能生成全部非零余数; 因此身份证采用广义二进制加权和:
并用:
进行校验。
身份证最后一位的 ,不是多余的复杂设计,而是用一个额外字符,换取更可靠的错误检测能力。




留言
解法、疑问、勘误都可以说。公式用 LaTeX:行内
$…$,整行$$…$$。留言区还没开。想聊这道题,可以点上面的「在公众号查看原文」,到公众号那边留言。