科普 系列:数学科普

为什么身份证最后一位可能出现 X(shí)?

公众号原标题:【数学科普】为什么身份证最后一位可能出现 X(shí)?(显示标题做过精简)

正文文字 1943 字约 6 分钟公式 136 处

为什么身份证最后一位可能出现 X(shí)?

有些身份证号最后一位是 X。这里的 𝑋不读“叉”,而读“十”,表示数值 10。

身份证最后一位是校验码。它由前 17 位计算得到,用来发现常见录入错误,例如某一位输错、相邻两位输反等。

身份证校验的核心可以概括为一句话:

先选用模 11 作为校验环境,再用 2的幂作为位置权重。

也就是把身份证号写成一个“广义二进制”加权和:

𝑁=∑_(𝑘=0)^(17)2^(𝑘)𝑎_(𝑘)

再要求:

𝑁≡1(mod11)

等价地:

𝑁−1≡0(mod11)

这套设计解释了两个问题:
为什么要用模 11,为什么又偏偏用 2^(𝑘)作为权重。



1. 先确定模数:为什么是 11?

校验码的目的不是“算出一个好看的数字”,而是尽量发现录入错误。

最常见的错误有两类:

单个数字输错

例如:

3→8

以及:

相邻两位输反

例如:

37→73

要检测这些错误,模数的选择很关键。



2. 小于 10 的模数不够用

若模数 𝑚<10,数字之间可能相差 𝑚。

例如使用 mod 9 时:

0→9

数字差为:

9

于是:

9≡0(mod9)

无论这一位的权重是什么,都有:

𝑤⋅9≡0(mod9)

也就是说,这类单个数字错误无法被发现。

所以,若希望稳定检测单个数字错误,模数至少不能小于 10。



3. mod 10 看似方便,但有硬伤

mod 10 的余数正好是:

0,1,2,⋯,9

如果用 mod 10,校验码可以全部写成数字,不会出现 𝑋。

但 mod 10 不是质数:

10=2⋅5

在模 10 下,存在非零数相乘后等于 0 的情况:

2⋅5≡0(mod10)

这会影响检错能力。

若某一位权重为 2,数字错差为 5,例如:

1→6

加权和变化量为:

2⋅5=10≡0(mod10)

错误发生了,校验结果却不变。



4. 重新设计 mod 10 权重也难以兼顾换位错误

也许可以不用权重 2,重新设计一组 mod 10 权重。

但若要检测所有单个数字错误,每个权重 𝑤_(𝑖)都必须与 10 互素。
否则存在非零数字差 𝑑,使得:

𝑤_(𝑖)𝑑≡0(mod10)

与 10 互素的余数只有:

1,3,7,9

它们全是奇数。

再看相邻两位交换。设相邻权重为 𝑤_(𝑖),𝑤_(𝑖+1),相邻数字为 𝑥,𝑦。交换造成的变化量是:

(𝑤_(𝑖)−𝑤_(𝑖+1))(𝑦−𝑥)

如果 𝑤_(𝑖),𝑤_(𝑖+1)都是奇数,那么:

𝑤_(𝑖)−𝑤_(𝑖+1)

一定是偶数。

取一组相邻数字,使得:

𝑦−𝑥=5

则:

(𝑤_(𝑖)−𝑤_(𝑖+1))(𝑦−𝑥)

必为 10 的倍数,于是:

(𝑤_(𝑖)−𝑤_(𝑖+1))(𝑦−𝑥)≡0(mod10)

这类相邻交换无法检测。

因此,mod 10 很难同时保证:

所有单个数字错误可检测

和:

所有相邻不同数字交换可检测


5. mod 11 是最小的合适选择

11 有两个优点。

第一,11 是质数。
在模 11 下,两个非零数相乘仍然非零。

第二,11 只比 10 多一个余数:

10

十进制字符只能表示:

0,1,⋯,9

多出来的这个数值 10,只需要用一个额外符号表示。身份证中采用:

𝑋=10

若使用更大的模数,例如 mod 13,则需要额外表示:

10,11,12

至少要引入三个非数字字符。

所以,mod 11 是一个折中:
比 mod 10 更可靠,又只多付出一个 𝑋的字符成本。



6. 模数确定后,为什么不用十进制权重?

身份证号本身是十进制数字,最自然的想法是直接把它看成十进制数:

𝑀=∑_(𝑘=0)^(17)10^(𝑘)𝑎_(𝑘)

然后做 mod 11 校验。

但十进制权重在 mod 11 下会退化。

因为:

10≡−1(mod11)

所以:

10^(𝑘)≡(−1)^(𝑘)(mod11)

于是:

𝑀=∑_(𝑘=0)^(17)10^(𝑘)𝑎_(𝑘)

在 mod 11 下只剩:

𝑀≡𝑎_(0)−𝑎_(1)+𝑎_(2)−𝑎_(3)+⋯+(−1)^(17)𝑎_(17)(mod11)

也就是说,权重只有两种:

1,−1,1,−1,⋯

这种校验本质上只区分奇数位和偶数位,位置信息保留得太少。

比如相隔两位的位置权重相同:

10^(𝑘)≡10^(𝑘+2)(mod11)

如果第 𝑘位和第 𝑘+2位交换,变化量是:

(10^(𝑘)−10^(𝑘+2))(𝑦−𝑥)

而:

10^(𝑘)−10^(𝑘+2)≡0(mod11)

所以这类交换不会改变校验结果。

因此,在已经选定 mod 11 的前提下,直接使用十进制权重并不理想。



7. 为什么选择 2^(𝑘):2 是 mod 11 的原根

身份证校验使用:

𝑁=∑_(𝑘=0)^(17)2^(𝑘)𝑎_(𝑘)

关键原因是:

2

是模 11 的原根。

“原根”可以简单理解为:
用它不断乘下去,在模 11 下可以生成所有非零余数。

具体看:

2^(0),2^(1),2^(2),⋯,2^(9)(mod11)

依次为:

1,2,4,8,5,10,9,7,3,6

这正好是模 11 下的全部 10 个非零余数。

直到:

2^(10)≡1(mod11)

才开始循环。

所以,2在模 11 下的周期是 10。
这说明 2^(𝑘)作为权重时,可以让不同位置尽量拥有丰富的非零权重。

对比十进制权重:

10^(𝑘)(mod11)=1,−1,1,−1,⋯

周期只有 2。

而二进制权重:

2^(𝑘)(mod11)

周期为 10。

这就是为什么在 mod 11 校验中,不直接采用十进制权重,而采用 2^(𝑘)权重。



8. “转成二进制”是什么意思

这里说的“二进制”,不是把身份证号变成一串 0和 1。

普通二进制数形如:

∑_(𝑘=0)^(𝑛)2^(𝑘)𝑏_(𝑘)

其中每个 𝑏_(𝑘)只能取 0或 1。

身份证校验中使用的是:

𝑁=∑_(𝑘=0)^(17)2^(𝑘)𝑎_(𝑘)

每个 𝑎_(𝑘)仍然是十进制数字,校验位还允许 𝑋=10。

所以更准确地说,它是一个“广义二进制”加权和:
使用二进制的权重 2^(𝑘),但每一位的数字不局限于 0,1。



9. 身份证校验公式

将身份证号从左到右写成:

𝑎_(17)𝑎_(16)⋯𝑎_(1)𝑎_(0)

其中 𝑎_(0)是最后一位校验码。

若最后一位是 𝑋,规定:

𝑋=10

构造:

𝑁=𝑎_(0)+2𝑎_(1)+2^(2)𝑎_(2)+⋯+2^(17)𝑎_(17)

即:

𝑁=∑_(𝑘=0)^(17)2^(𝑘)𝑎_(𝑘)

身份证号码有效时满足:

𝑁≡1(mod11)

也可以写成:

𝑁−1≡0(mod11)


10. 常见权重表从哪里来

实际书写身份证号时,通常从左到右写 18 位。

最右边的校验位 𝑎_(0)权重是:

2^(0)=1

前 17 位从左到右对应权重为:

2^(17),2^(16),⋯,2^(1)

对 11 取余后得到:

7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2

这就是身份证校验中常见的权重序列。

若前 17 位从左到右记为:

𝑏_(1),𝑏_(2),⋯,𝑏_(17)

对应权重为:

𝑤_(1),𝑤_(2),⋯,𝑤_(17)

则:

𝑆=∑_(𝑖=1)^(17)𝑏_(𝑖)𝑤_(𝑖)

校验码记为 𝑐,完整校验条件是:

𝑆+𝑐≡1(mod11)

因此:

𝑐≡1−𝑆(mod11)


11. X 从哪里来

模 11 的余数共有 11 种:

0,1,2,⋯,10

但单个十进制字符只有 10 个:

0,1,2,⋯,9

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

身份证中规定:

𝑋=10

若:

𝑆mod11=𝑟

则:

𝑐≡1−𝑟(mod11)

对应关系如下:

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

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



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

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

𝑎≠𝑏

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

𝑤(𝑏−𝑎)

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

𝑏−𝑎∈{±1,±2,⋯,±9}

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

同时:

𝑤=2^(𝑘)

而:

2^(𝑘)≢0(mod11)

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

𝑤(𝑏−𝑎)≢0(mod11)

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



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

设相邻两位原来是:

𝑥,𝑦

对应权重为:

2^(𝑘+1),2^(𝑘)

交换前贡献为:

2^(𝑘+1)𝑥+2^(𝑘)𝑦

交换后贡献为:

2^(𝑘+1)𝑦+2^(𝑘)𝑥

变化量为:

2^(𝑘+1)𝑦+2^(𝑘)𝑥−(2^(𝑘+1)𝑥+2^(𝑘)𝑦)

整理得:

(2^(𝑘+1)−2^(𝑘))(𝑦−𝑥)

即:

2^(𝑘)(𝑦−𝑥)

若 𝑥≠𝑦,则:

𝑦−𝑥∈{±1,±2,⋯,±9}

在 mod 11 下非零。

同时:

2^(𝑘)≢0(mod11)

所以:

2^(𝑘)(𝑦−𝑥)≢0(mod11)

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



14. 小结

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

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

并用:

∑_(𝑘=0)^(17)2^(𝑘)𝑎_(𝑘)≡1(mod11)

进行校验。

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


留言

正常留言提交后可直接显示,无需人工审核;仍会经过防刷与垃圾内容过滤。请不要留下手机号等私人信息。解法、疑问都可以说;公式用 LaTeX:行内 $…$,整行 $$…$$。