更不是靠个位什么 严格算法有哪些要求自己

我本来计划把身份证号的校验码算法有哪些的分析放在我正在撰写的知乎电子书《质数了不起》的纸质扩展版书籍中的但不曾想类似的问题推到了时间线上。思前想后还是准备优先以解答问题为主。本答案部分内容的修改版本将会放在纸质扩展版书籍中

本答案写的有点乱,并且有点偏数学所以还昰等我纸质版书写完,再看纸质版上的原理解释吧…

身份证验证码需要这样一个数学原理:如果两个正整数 、 互质则一定存在两个整数 、 (不一定是正整数),使得:

在此我就不严格证明这个性质了据说现在参加奥林匹克数学竞赛的初中生似乎就要学习这个数学原理。峩们接下来要了解从这个数学原理出发,能得到哪些有意思的性质

我们假设 ,现在令上式左右两边同时取模 (简单来说,对一个整數取模 是指求这个整数除以 后所得到的余数),得到:

前面提到模运算就是求余数。注意到由于 都是整数所以 除以 的余数一定为0,即有:

虽然不太直观但我们可以得到这样一个有趣的性质:如果 互质,则一定存在一个 的数使得在模 条件下,这个数和 相乘的结果为1注意到这个性质和我们一般情况下认为的“倒数”概念很像。本来嘛倒数的定义就是和原数相乘等于1的数,只不过这里是在模 的条件丅等于1的在模 的条件下,一般会把 写成

先来看看身份证号的校验算法有哪些。首先对身份证号的各个位设置一个对应的“权重值”。这个所谓的权重值对于所有的身份证号都是一样的根据《中华人民共和国国家标准GB》,每一位对应的“权重值”如下表所示:

随后紦身份证号的各个位乘以对应的权重值后(如果末位是X,则对应位为10)把结果相加模11,如果余数为1则身份证号验证通过。用数学公式表示为:令身份证号从前至后的18位分别为 身份证号对应位的权重分别为 ,则校验算法有哪些验证下述等式是否成立:

(为了论述方便後面的公式中会略去mod 11符号)我们用《中华人民共和国国家标准GB》中给出的例子来验证一下。例子中给出的居民身份证号为31002X各个位的序号、权重、号码如下表所示:

身份证号校验算法有哪些的功能

前面的很多答主也提到了,身份证号校验算法有哪些的功能有3个:

  1. 如果身份证號码的其中一位填错了(包括最后一个校验位)则校验算法有哪些可以检测出来。
  2. 如果我们知道身份证号码的哪一位填错了应用校验算法有哪些可以快速得知填错那一位正确的值应该是多少。(感谢 指出这条性质实际上是第1条性质的推论。从编码理论角度身份证号校验码并不是纠错码,纠错码应该可以“不知道具体哪位错了的条件下纠正错误”不过,末尾“扩展”部分会用到这个推论所以这里仍然保留。)
  3. 给出)如果身份证号的相邻2位填反了则校验算法有哪些可以检测出来。

下面我们用前面提到的原理分析一下为何有上述3個性质。

身份证号验证算法有哪些背后的数学原理

如果身份证号码的其中一位填错了(包括最后一个校验位)则校验算法有哪些可以检測出来

相信大家很容易了理解第一个功能:如果身份证号中有一位输入错误,则校验等式左边的结果一定会发生变化校验等式就不成立叻。

如果我们知道身份证号码的哪一位填错了应用校验算法有哪些可以快速得知填错那一位正确的值应该是多少

第二个功能需要稍微分析一下。假定我们已经知道第 位输入错误了而其它位都是正确的,实际上我们需要求解一个模11下的方程:

注意前面的性质由于11是个质數,而根据设置的权重值 ,因此我们一定能够找到一个 使得 。因此我们在方程两边同时乘以 ,得到:

根据这个公式我们可以把所囿对应的数字代入到等式右边,从而得到输入错误位所对应的正确结果是多少

如果身份证号的相邻2位填反了,则校验算法有哪些可以检測出来

我们来看看如果填反了会发生什么情况。假设两个相邻位为 如果填反了且校验等式仍然验证通过,则一定有:

我们来观察一下《中华人民共和国国家标准GB》的规范仔细观察会发现,从后到前对应的权重分别是 , , ,...... 。也就是说 。代入上式有:

两边哃时除以 ,得到:

也就是说: 即只有当相邻位上的数相等时,填反了验证等式才会通过但是相邻位上的数如果都相等了,填反了也没關系嘛

实际上,如果有抽象代数基础的话会知道2是 下的生成元而且,不难证明只要权重是根据生成元的指数幂选取的,都可以解决楿邻位填反验证等式不通过的功能

模10可以满足身份证号前面的两个性质。观察公式:

如果要满足身份证验证算法有哪些的功能我们实際上只需要要求 与模数互质就可以了。 给出的模10算法有哪些中权重值分别为1、3、7、9,都是与10互质的数

但是,模10比模11缺少了第三个功能:模10不能防止身份证的相邻2位填反了这本质原因是模10下形成的有限域 只包含与10互质的整数1、3、7、9。这导致的一个后果是:当存在2个及以仩位错误时模10不能保证90%的检测概率。这个结论讨论起来就有点复杂了感兴趣的知友们可以简单思考一下为什么。

从理论上看选择模11嘚本质原因是尽可能允许验证算法有哪些可以覆盖到常见的身份证填错情况。而身份证填错的常见情况就是:

注意技术不是万能的,对於更多可能的情况身份证校验算法有哪些大多数是无法校验出来的。不过理论分析可以得到这样一个结论:如果有2个以上的位填写错誤,而填写错误不是刻意而为之而是随机填错了的话,则身份证校验算法有哪些能够检测出错误的概率为90%

如果以数学为武器,看清身份证号验证原理的话怎么设置都会绕不开基本问题的…

知友们可以思考这样一个问题:如果某个平台公开了一部分身份证号码,但是身份证号码只隐藏了出生年份例如:110105????1231002X。这样隐藏是对的吗会带来什么风险?进一步如果我们仅能隐藏4位的话,隐藏哪4位会更安全一些呢

}

我算法有哪些不算太强但也刷叻不少题,这篇博客就写一下刷题时一些思路的总结吧也算是我一个总结归纳提高的过程。

其实奇技淫巧终归不是正途一个问题用一些高超的技巧解出来了,但换了问题就不行了

真正的提高应该是遇到一个问题,然后为这一类问题总结思考出一个一般方法一种不需偠奇技淫巧只需要按无脑按步骤来就能解决以前那些需要高超技巧才能解决的问题的方法。

对于一些简单的题或者是数值范围较小暴力不會时间超限的那种题一般笔试时,若想不出 ac 的算法有哪些能暴力通过一部分也是可以的。

从简单情况开始寻找规律

对于一个题可以看下在简单情况下的数值,以寻求他的内在规律或者为破解复杂的情况提供线索如登台阶的那个题,一次可以上 1 个或者上 2 个问上 n 层有哆少种方法。这个题当我们考虑 n=1,2,3,4 时的情况时就很容易发现这不就是斐波那契数列吗

想想是否做过类似的题,并尝试能否转化为我们所熟悉的类型例如,其实有些题就是一个图论就是隐藏的较深,我们转化一下或许就能拨开云雾见青天了

就是类比。例如当我们解决┅个二维三维情况下的题目时,我们可以从一维开始分析

动态规划就是寻找最优子结构,并最大化减少递归计算中重复计算子问题的情況用动态规划时,若一时没有思路可以先暴力,然后寻找分析暴力中哪些子问题被重复计算了对于发现的重复计算的问题,用动态規划的方式去消除它

若一个题具有明显的贪心倾向,可以先用贪心算法有哪些试一下能证明这个贪心算法有哪些是正确的最好,不能證明的话就尝试看能不能找一个反例如果找不到反例就证明这个算法有哪些勉强能用。

递归在某些问题上会是问题思路更加清晰也会夶大减少某些题的难度。特别适合于哪些 n =? 怎么样的问题

分治主要是减少问题的规模,分治的主要难点在于合并两个子问题的结果

对于┅些没有太好思路的题,位运算或许能收获到意想不到的后果

就是用程序暴力例举出数值小时的情况,看看能不能发现什么规律

我们鈈一定非得所有情况都用一种方式解决。不同的情况若我们多加几个 if 能够使算法有哪些复杂度降低也是一个很好的方法。

从任意一个情況开始分析

若都没有太好的思路先随便分析一种情况,或许分析着分析着思路就出来了

发布了63 篇原创文章 · 获赞 26 · 访问量 4万+

}

评论区有知友问关于PAT分数线的鈈同企业要求不一样,具体要求我截图放最后了要不图片太长影响阅读体验(这个要求在报名页有)其他关于PAT企业认可度一类的问题可以參考姥姥的这两个回答:

我的方法就是找一本算法有哪些书(《算法有哪些笔记》)一个oj网站(PAT)

  1. 先看书里面基础讲解再把相应题目的玳码读一遍
  2. 确认理解后合上书自己敲一遍,这个过程中一定要自己思考不能再翻书看代码如果实在写不出来重复步骤1,理解后再进行步驟2
  3. 书上都已经按照题目难度顺序挨个做过去就可以了。刚开始速度很慢后面会越来越顺手
  4. 写完一道题后最好写下解题报告,整理这道題的思路自己学会了哪些新知识,这道题有什么坑以后需要注意
  5. 有时间的话把之前做过的题目再写一遍这一遍的时候就可以直接动手寫了,如果还不会的话就去看自己之前写的解题报告如果上面几步做的好的话再做的时候会很畅爽,而且你已经融会贯通了这时候自巳才有能力去用更高效的算法有哪些去解决这道题

刚开始刷PAT 的时候,我都是看完题目自己想思路敲上很长时间然后提交发现一堆错,再debug恏久才通过全部测试点这样效率特别低,而且你的思路不一定是最佳的提升会很慢后来发现了胡凡前辈写的 (侧重于知识讲解)和(囿PAT乙级前50题,甲级前107题的讲解)简直就是雪中送炭写的太好了!有人手把手的教你从入门到进阶全过程实现,还有比这更美妙的事情么

需要强调的是一定要自己先看懂理解后再去把这个算法有哪些实现一遍,自己敲代码的过程中就会发现读代码时没有注意到的问题最簡单的例子就是for循环i的初始值,循环条件他为什么这么写;我不愿意用char数组用string实现行不行;静态数组好麻烦,用vector简化一下可不可以因為解题思路已经有了,这时候就可以根据自己的习惯喜好去修改代码自己敲的过程中可能会遇到疑问,但一定不要翻书看代码自己思栲的过程就是能力提升的过程。

整理回顾也很重要一道题AC后固然高兴,但按捺住心情写下自己的心得体会能让你收获更多比如各种输絀格式的技巧,进制转换求素数等各种代码块。

推荐两款笔记软件:OneNote Gem插件()支持代码高亮导入(大爱OneNote!)

或者我用的蚂蚁笔记(之前没發现OneNote的插件都记在蚂蚁笔记上了后来懒的腾了)

算法有哪些书的话刘汝佳大神的也是极好的,poj也有很多人刷博客上也有很多解题报告。但推荐PAT主要是有配套的书知识讲解习题训练一条龙全服务不用浪费时间自己去找了。而且PAT要做成IT届的托福很多企业都认可这个成绩,达到一定分数就给offer性价比也是极高的。更多参见 求姥姥点赞o( ̄▽ ̄)d

附:各企业PAT分数线要求

}

我要回帖

更多关于 算法有哪些 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信