在昨天2024年的春晚舞台上,魔术大师刘谦以一场令人拍案叫绝的纸牌魔术再度震撼全场。他巧妙地利用了数学原理,精准无误地让观众“随机”选择的纸牌完成了配对,尤其是令人忍俊不禁的是主持人尼格买提的纸牌却没有如愿配对,小尼碎了的话题也冲上了今天大年初一的热搜。然而,在这看似神秘莫测的魔术背后,却隐藏着一种在信息科学领域中广泛使用的纠错编码技术,小尼的操作有误,也就让他最后的结果与其他亲身参与的观众不一样了,从某种程度上讲参与者手上的最后半张牌就是一位校验码,查看校验码也就能知道你之前的操作是不是正确。那么现在,我们就从这场精彩的纸牌魔术出发,一同探索海明码等纠错码背后的原理。
-
刘谦魔术背后的约瑟夫问题
刘谦魔术的前几步其实都是个看似建立纸牌随机顺序的过程(但其实还是有序的哈,只是男性与女性的卡牌顺序可能不同),而最后一步“好运留下来烦恼丢出去”恰恰是一个约瑟夫问题,这个弃牌过程保证了无论男女都是留下编号为1的牌,也就正好是能和之前保留半张牌的配对牌。因此探索这个问题,我们先简要介绍一下约瑟夫问题。
约瑟夫问题(Josephus Problem)是一个著名的理论和计算机科学中的数学难题,源于一个关于罗马历史学家弗拉维奥·约瑟夫斯的传说。故事中,约瑟夫和其他一些人被围困,他们决定通过一种自裁的方式减少人数以求得部分人的生存:他们站成一个圈,并从某个人开始报数,数到特定数值(比如每数到第M个人)时,这个人会被杀掉,然后从下一个人继续报数,直到最后只剩下一个人为止。在现代数学和算法领域中,约瑟夫问题通常形式化为以下描述:
设有N个人排成一个圆圈,从某个位置(例如编号为1的人)开始按顺时针方向报数,每当数到第M个人时,该人会被移出圆圈。接着从下一个未移除的人继续从1开始报数,直至圆圈中只剩余最后一个人。这个问题要求确定的是在给定N和M的情况下,最后幸存下来的人的初始编号是多少。解决约瑟夫问题一般采用递归或迭代的方法。
在刘谦的魔术中,每一张纸牌就如同一个比特位,通过巧妙的设计和预设规则(即海明码的构造原则),使得无论观众如何随机选择,魔术师都能准确判断出原始的信息内容(即选中的纸牌),而主持人出现的操作失误,也让他没有得到预期中的结果,所以从这个角度上看,这个魔术本质上讲其实还是可以等价为一个纠错问题,也就如何在校验位上把数据流中的错误体现出来。
-
海明码简介
在计算机课程,尤其是纠错原理中,我们第一个接触的机制大概就是奇偶校验位,也就是在一段数据流的最后设计一个校验位,如果整个信息流中有奇数个1,那么校验位就是1,如果有偶数个1那么校验位就是0。
海明码是一种基于奇偶校验机制的,用于检测和纠正单个比特错误的线性纠错码,由美国数学家理查德·卫斯里·海明于1950年提出。如同刘谦在表演前对纸牌进行精心设计与安排,海明码通过对数据位增加冗余信息的方式,使得每个数据位都与其他几个数据位之间存在特定的关系,从而能在传输过程中发现并修正单一比特的错误。
我们知道之前很多如串口数据、网络传输包一旦校验失败,则整包重传,而海明码则不需要重传,他可以在添加校验位的情况下,自动找到错误码位置并更正,避免了整包重传的资源浪费情况发生。
而接下来我们就可以回答校验位个数的问题了,由于以16位数据为例,在已知只有一位数据错的情况下,校验位需要表示的情况共有2^4=16种,也就是需要4位表示,而如果是1024位数据,那么需要表示2^10=1024种情况,也就是10位校验位。那么拓展一下如果有两位错呢?那么这种情况下由于两位数据是任意的,从概率上讲是独立事件,校验位翻倍即可。
-
海明码工作原理
1.基于偶校验设计
海明码一般使用偶校验,也就是当参与校验的校验位1的个数为奇数,则校验位为1;反之1的个数为偶数时,则校验位为0。
例子:数据位1111的 偶校验就是 11110
一般来说单纯的我校验只能检测一位数据是否有错,但无法纠错。
如我们刚刚所说,我们的校验位所能表示的情况数量必须大于数据流总长度,也就是2^校验位数 >= 校验位数 + 数据位数 +1
以数据位取4为例,代入可得校验位等于3
2.校验位与数据位的设置
在海明码的数据流中凡是2^n(其中n为正整数)的位置都是校验位,其余都是数据位,以7个bit的数据流为例,如下图:
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
用途 | 校验位 | 校验位 | 数据位 | 校验位 | 数据位 | 数据位 | 数据位 |
3.确定校验位的校验范围
接下来需要确认校验位要用来校验哪些数据位。
首先把所有位置的二进制码表示写出来,左补齐至校验位个数,如本例中校验位为3,那么左补0使二进制码长度满3位。
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
用途 | 校验位 | 校验位 | 数据位 | 校验位 | 数据位 | 数据位 | 数据位 |
所在位置二进制码 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
其中校验位左边的0是*表示,也就是可以指代任意多个0,右边的0用?表示,即只能代表一个0。如下:
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
用途 | 校验位 | 校验位 | 数据位 | 校验位 | 数据位 | 数据位 | 数据位 |
所在位置二进制码 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
校验位通配符表示 | *1 | *1? | 1?? |
4.确定校验矩阵
接下来将所有数据位按照上述匹配规则进行分组,(其中?代表一位,*代表任意位)。
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
用途 | 校验位 | 校验位 | 数据位 | 校验位 | 数据位 | 数据位 | 数据位 |
所在位置二进制码 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
校验位通配符表示 | *1 | *1? | 匹配*1与*1?;即1、2两组 | 1?? | 匹配*1与1??;即1、4两组 | 匹配*1?与1??;即1、4两组 | 匹配*1、*1?与1??即匹配所有组 |
纵向的匹配分组如下:
校验位位置 | 1 | 2 | 4 |
校验位通配符表示 | *1 | *1? | 1?? |
匹配结果 | 001(1) | 010(2) | 100(4) |
011(3) | 011(3) | 101(5) | |
101(5) | 110(6) | 110(6) | |
111(7) | 111(7) | 111(7) |
因此我们可以确定
校验位1 负责校验1、3、5、7四位
校验位2 负责校验2、3、6、7四位
校验位4 负责校验4、5、6、7四位
假如要传递的数据为1110,那么如果进行偶校验,那么这段汉明码应该为1111110
5.纠错过程
我们刚刚也提到了1、2、4三个校验位将全部数据分为三组,那么不论哪一位出错,都可以得校验失败的结论,这个并不难理解。而海明码的纠错原理如下:
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
用途 | 校验位 | 校验位 | 数据位 | 校验位 | 数据位 | 数据位 | 数据位 |
所在位置二进制码 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
校验位通配符表示 | *1 | *1? | 匹配*1与*1?;即1、2两组 | 1?? | 匹配*1与1??;即1、4两组 | 匹配*1?与1??;即1、4两组 | 匹配*1、*1?与1??即匹配所有组 |
所属分组 | 1 | 2 | 1、2 | 4 | 1、4 | 2、4 | 1、2、4 |
然后你会发现有以下几种情况:
- 三组校验全错:首先第7位属于三个组,那么如果三个组都校验失败则可知是第7位错。
- 如果单独一组错这时可知是校验位出错,因为只有校验位自己单独一组。
- 如果两组同时出错,则是两组交叉地带的位置出错,如1、2组都校验错,则是代表第3位即属于1、2组共同校验的位置出错。
而且海明码还有一个快速确定错误位置的算法,
1.分别对每个组校验,通过的记为0,出错的记为1.
2、将校验结果按照组别从大到小排列起来,得到一串1和0的组合。
假如我们刚刚接收的海明码序列为1111111,那么得到的校验结果从大到小排除就是111,这也就对应了出错位置为111二进制码所对应的位置即第7位,
春晚舞台上,刘谦的纸牌魔术吸引了无数观众的目光。他以其出神入化的手法,将普通的纸牌演绎得栩栩如生,仿佛拥有了生命的魔力。这一切的背后,不仅体现了魔术师本人精湛的技艺,更是科技与艺术完美结合的生动展现。海明码的精妙原理,为这场魔术增添了更多的科技色彩,让人们在欣赏艺术的同时,也领略到了科技的神奇魅力。
在这个充满未知的世界里,无论是魔术舞台还是科研前线,人类智慧的火花都将永不熄灭。科技的发展离不开人们的探索与创新,正是这些火花,照亮了我们前行的道路。而对于编码技术来说,未来的创新将不仅仅局限于技术的层面,更将体现在如何更好地服务于人类社会,为信息传输带来更多可能性。
总之,随着科技的发展,未来的编码技术将会更加先进,为我们的生活带来更多便利。而在这一过程中,人类智慧的火花将继续照亮前行的道路,推动科技与艺术的交融,为我们的世界增添更多美好。无论是魔术舞台还是科研前线,我们都将携手共进,不断创新,以迎接更美好的未来。