科普 1943 字 约 6 分钟 系列:数学科普

为什么身份证最后一位可能出现 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 个:

当校验码需要取数值 时,就要用一个额外符号表示。

身份证中规定:

若:

则:

对应关系如下:

校验码
0
1
1
0
2
X
3
9
4
8
5
7
6
6
7
5
8
4
9
3
10
2

所以,身份证最后一位出现 ,只是因为校验码需要表示数值 。



12. 为什么能检测单个数字错误

假设某一位由 错输为 ,且:

这一位的权重为 。
加权和变化量是:

因为 都是十进制数字,所以:

在 mod 11 下,这些数都不是 0。

同时:

而:

又因为 11 是质数,模 11 下两个非零数相乘仍非零:

因此,任意一位数字输错,校验结果都会改变。



13. 为什么能检测相邻两位交换

设相邻两位原来是:

对应权重为:

交换前贡献为:

交换后贡献为:

变化量为:

整理得:

即:

若 ,则:

在 mod 11 下非零。

同时:

所以:

因此,相邻两个不同数字交换,校验结果一定改变。



14. 小结

身份证校验的设计顺序可以这样理解:

  1. 为了检测单个数字错误,模数不能小于 10;
  2. mod 10 虽然不用 ,但不是质数,难以兼顾单错和相邻交换;
  3. mod 11 是最小的可用质数,只比十进制多一个余数;
  4. 余数 用 表示;
  5. 确定 mod 11 后,十进制权重 会退化为 交替;
  6. 2 是 mod 11 的原根,能生成全部非零余数;
  7. 因此身份证采用广义二进制加权和:

并用:

进行校验。

身份证最后一位的 ,不是多余的复杂设计,而是用一个额外字符,换取更可靠的错误检测能力。


留言

解法、疑问、勘误都可以说。公式用 LaTeX:行内 $…$,整行 $$…$$。

留言区还没开。想聊这道题,可以点上面的「在公众号查看原文」,到公众号那边留言。