刘谦春晚纸牌魔术背后的数学—海明码原理简介

2024-02-11 10:12

本文主要是介绍刘谦春晚纸牌魔术背后的数学—海明码原理简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在昨天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位,

春晚舞台上,刘谦的纸牌魔术吸引了无数观众的目光。他以其出神入化的手法,将普通的纸牌演绎得栩栩如生,仿佛拥有了生命的魔力。这一切的背后,不仅体现了魔术师本人精湛的技艺,更是科技与艺术完美结合的生动展现。海明码的精妙原理,为这场魔术增添了更多的科技色彩,让人们在欣赏艺术的同时,也领略到了科技的神奇魅力。

在这个充满未知的世界里,无论是魔术舞台还是科研前线,人类智慧的火花都将永不熄灭。科技的发展离不开人们的探索与创新,正是这些火花,照亮了我们前行的道路。而对于编码技术来说,未来的创新将不仅仅局限于技术的层面,更将体现在如何更好地服务于人类社会,为信息传输带来更多可能性。

总之,随着科技的发展,未来的编码技术将会更加先进,为我们的生活带来更多便利。而在这一过程中,人类智慧的火花将继续照亮前行的道路,推动科技与艺术的交融,为我们的世界增添更多美好。无论是魔术舞台还是科研前线,我们都将携手共进,不断创新,以迎接更美好的未来。

这篇关于刘谦春晚纸牌魔术背后的数学—海明码原理简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699534

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创