纠错码与魔术(三)——汉明纠错码魔术初步

这篇博客介绍了如何利用汉明编码原理设计魔术,通过布尔变量和异或运算隐藏信息,使观众在不知情的情况下透露关键数据。魔术《Ahorseofadifferentcolor》和《Giveanyfivecards》展示了这种方法,其中涉及到线性方程组的解码过程和颜色编码的创新设计。作者强调了数学在魔术中的应用,以及如何通过编码技巧实现信息的隐秘传递,使得魔术更加天衣无缝。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

早点关注我,精彩不错过!

本系列前面两篇已经介绍了纠错码的基本原理和在魔术中的应用和一些魔术例子,相关内容请戳:

纠错码与魔术(二)——魔术《矩阵感应》等

纠错码与魔术(一)——纠错码与汉明码简介

在mathematical card magic书中,还有很多基于纠错编码中重要的一类——hamming编码的设计精良的效果,在此和大家分享。

A horse of a different color

视频1 A horse of a different color

这个魔术是用重复加奇偶校验,并不是严格的hamming编码,不然前面4位有3位都是自由位,那还怎么玩?其编码规律是(a, b, x, a, b, a + b)其中,a, b, x是bool变量,其中加法是不进位的逻辑加法,也就是异或运算,当然也可以叫模2加法。而这个bool量可以用比如红黑,奇偶,是否大牌等等方式来定义,这里我们用的是最显然的红黑。显然,这里其实一共只有3bit的有效关注信息,因为后面的3位都可以看作是校验。而观众此时连你关注的是红黑都不知道,更别提去发现这隐藏的校验规律了。这规律使得,任何对红黑颜色的改变,都会自动在结果里编码出信息,进而解码出变化的是哪一张。具体怎么做呢?

首先,如果观众进行完变化以后,发现后面三个校验都没有问题,显然只有一个可能,那就是变化的是x,解码结束;如果有错误,如果是单个错误,显然那改变的也就是这个校验位1和2,或者是6上,因为只有他们才不会有连带影响;如果是两个错误,则改变必然发生在4,5位,其中一个错误一定在第6位,剩下4,5哪个被检测不一致,问题就在对应的1,2上。

于是,执行解码的时候,也可以直接看1,4和2,5两组牌是否完全一致开始,一致则根据第6张是否正确判断是没改还是第6,不一致则再看6是否正确决定不一致的两张中到底是哪一张改变。这些解码方法的不同本质上都是线性方程组求解过程消元过程的区别,并没有本质区别,怎么方便记忆,快,就怎么来。

这种通过暗含的线性关系构造的结构,使得在万全不知情的情况下,观众就把重要的信息给透露了出来,魔术便来了。

魔术表演方面,后面3张牌是交给另一个观众,也就是托完成的。只要这一点可以接受,整个魔术就是天衣无缝的。不过倒是可以通过选牌过程的软限制,使得两次编码的颜色自动相等,而托的那一次选正确的,观众自己选的唯一一次自由的颜色就让他自由吧!如果你仔细观察还可以发现,选择过程是可以托先选,观众再选的,只要要求观众选的不能都黑而且托选牌摆放位置可以调节即可,因为此时托的三张颜色组合必然是2红1黑,0红3黑。

但是,这个托的选择还是很碍眼,那能不能够完全不要托,或者托干的事情,看起来更隐蔽一点?请看下面的魔术。

Give any five cards

视频2 Given any five cards

我们来把所有的(a, b, a, b, a + b)的共5个位中所有可能的4种情况里,1的可能数量数一下会发现,恰好是{0,3,4}个(00000,01011或10101,11110),而这5位里剩下的就是0了,所以做一个减法函数在上面这个集合上,得到的值域结果是{1,2,5}。然后,这两个集合居然恰好是0:5集合的相互对立事件!也就是说,无论观众选出来的牌到底有几个表示1的红色,都存在一个排列,使得上面纠错编码的暗含等式成立,当数量是1,2,5时,那就让黑色代表1就好了,而告诉魔术师到底谁代表谁,这1bit的信息,岂不是易如反掌!

而托要做的,硬生生从尴尬地选出三张特定颜色的牌,变成了不经意地排列了一下5张牌的顺序,并用左右手示意或者从左往右还是反过来的方式而已!

仅仅付出了必须要改变的代价,就能够获得如此随意的自由度,只需要的校验码(parity code)随编码映射方式的不同而左右摇摆,太神了!

其实再用对称角度一想,这里5张2颜色选项的对称组合只有5vs0,4vs1,3vs2这么3种情况。需要构造前4个位置的copy语言成立,其解除了3vs2有两种对称的,其余还都是一致的。因此所有的判断都落脚在是否破坏了copy的前4bit,如果没有,则一定是最后一位被改变,若是不需要判断是否改变,那直接就能做了,如果需要,那也只是需要1bit的红黑分别代表0还是1的信息罢了。

这个作品里,这1bit信息我们采用了复合编码的方法纳入了。在编码时,保证同颜色的子序列都是数值递增(红1黑0)或递减的(红0黑1)。于是当发生转换以后,5vs0的变成4vs1不影响;4vs1的变成5vs0仍然可以判别一个长为4单调序列中插入一张的情况,变成3vs2则二者不一致取长的保持;3vs2的如果变成4vs1则是长为3的单调序列插入一张,而2vs3则不一致的看长为2的,一致则直接一致,这里的3vs2编码和前面4vs1变来的竟然完全兼容。于是根据以上判断,递增为红1黑0,否则相反。之所以这么设计,是因为这个编码的内容可以对颜色本身编码的校验码具有不变性,故二者可以互相独立编码,十分方便了,这也是我对这个魔术的一点小改进和贡献。

值得一提的是,在看原书《Mathematical Card Tricks》的同名魔术的时候,我并没有仔细研读那里关于颜色递增递减来编码红黑编码方法的讨论,你要知道对于想快点学会这个魔术效果的爱好者来说看那些繁复的说明是多么费脑筋。但是当我真的表演的时候,我竟然顺着这个思路推导出以上的策略,回头看到书里的描述,竟然一模一样!

我惊叹于这世间的数学巧合,让我如此不能自拔。

下一篇,我们会继续围绕汉明码的魔术应用给大家讲解,魔术内容先睹为快:

视频3 Multiple Persenality

视频4 A Small Ternary Linear Code

92433b965cd8df7751de8b119248f8d6.gif

我们是谁:

MatheMagician,中文“数学魔术师”,原指用数学设计魔术的魔术师和数学家。既取其用数学来变魔术的本义,也取像魔术一样玩数学的意思。文章内容涵盖互联网,计算机,统计,算法,NLP等前沿的数学及应用领域;也包括魔术思想,流程鉴等魔术内容;以及结合二者的数学魔术分享,还有一些思辨性的谈天说地的随笔。希望你能和我一起,既能感性思考又保持理性思维,享受人生乐趣。欢迎扫码关注和在文末或公众号留言与我交流!

eeea4258e0e6971b129b0e0ecd1ebf74.gif

67e3d0e18166993b7f6f57510b9a8ff9.png

ceeabc92f69a7029ecbbc22d5ccf0c03.jpeg

扫描二维码

关注更多精彩

纠错码与魔术(二)——魔术《矩阵感应》等

破解魔术的秘密(四)——前移原理介绍和案例分享

你真的分得清“前后左右”和“东西南北”吗?(四)——无处不在的相对方位

编码通信与魔术初步(七)——二进制编码经典魔术《街头猜数字》

知道魔术的秘密很了不起吗?

d576475f06ab2590aeb2964d7c679888.gif

点击阅读原文,往期精彩不错过!

05-23 16:00:49.311 25132-25512 A0c0d0/JSAPP I result {"code":200,"msg":"操作成功","data":[{"id":1,"name":"华为Mate 60 Pro","model":"ALN-AL80","imageUrl":"https://img.alicdn.com/imgextra/i3/2213047591560/O1CN01QNx6eB1NOWu3oeUfn_!!2213047591560.jpg_q50.jpg_.webp","shortDescription":"麒麟9000S 卫星通信","price":6999.00,"subsidizedPrice":6499.00,"sales":15000,"rating":4.90,"stock":500,"isAvailable":0,"brand":"华为"},{"id":2,"name":"华为P60 Art","model":"NOH-AN80","imageUrl":"https://img.alicdn.com/imgextra/i4/2609173245/O1CN011h2L1I1ZqGCdlsYlJ_!!2609173245.jpg_q50.jpg_.webp","shortDescription":"超聚光XMAGE影像","price":7988.00,"subsidizedPrice":7588.00,"sales":12000,"rating":4.80,"stock":300,"isAvailable":0,"brand":"华为"},{"id":3,"name":"华为nova 12","model":"BAC-AL00","imageUrl":"https://picasso.alicdn.com/imgextra/O1CNA1bnbda21Vuba4TjLYB_!!2838892713-0-psf.jpg_.webp","shortDescription":"前置双摄人像","price":2999.00,"subsidizedPrice":2699.00,"sales":50000,"rating":4.70,"stock":1000,"isAvailable":0,"brand":"华为"},{"id":4,"name":"荣耀Magic6 Pro","model":"PGT-AN30","imageUrl":"https://img.alicdn.com/imgextra/i2/263726286/O1CN01ko93gt1wJ2hQAORAB_!!4611686018427380942-0-item_pic.jpg_.webp","shortDescription":"骁龙8 Gen3 青海湖电池","price":5699.00,"subsidizedPrice":5399.00,"sales":25000,"rating":4.80,"stock":600,"isAvailable":0,"brand":"荣耀"},{"id":5,"name":"荣耀X50 GT","model":"ANY-AN00","imageUrl":"https://img.alicdn.com/imgextra/i3/3851598352/O1CN01UHPfyv2BZGwPnHUlx_!!0-item_pic.jpg_q50.jpg_.webp","shortDescription":"1.5K护眼曲屏","price":1999.00,"subsidizedPrice":1799.00,"sales":80000,"rating":4.60,"stock":1500,"isAvailable":0,"brand":"荣耀"},{"id":6,"name":"荣耀90 Pro","model":"REA-AN20","imageUrl":"https://img.alicdn.com/imgextra/i3/1114511827/O1CN01r3ngr41PMof7MhFhY_!!4611686018427386323-0-item_pic.jpg_q50.jpg_.webp","shortDescription":"2亿像素写真相机","price":3299.00,"subsidizedPrice":2999.00,"sales":40000,"rating":4.70,"stock":800,"isAvailable":0,"brand":"荣耀"},{"id":7,"name":"荣耀Play7T Pro","model":"CMA-AN40","imageUrl":"https://img.alicdn.com/imgextra/i1/1907069314/O1CN019jd3kt2IfrnZ6J0AH_!!1907069314.jpg_q50.jpg_.webp","shortDescription":"40W快充 OLED屏","price":1799.00,"subsidizedPrice":1599.00,"sales":120000,"rating":4.50,"stock":2000,"isAvailable":0,"brand":"荣耀"},{"id":8,"name":"华为畅享70 Pro","model":"CMA-AN70","imageUrl":"https://android-api.oss-cn-beijing.aliyuncs.com/logo.jpg","shortDescription":"7000mAh长续航","price":1599.00,"subsidizedPrice":1399.00,"sales":150000,"rating":4.40,"stock":3000,"isAvailable":0,"brand":"华为"},{"id":9,"name":"华为Mate X5","model":"TET-AN80","imageUrl":"https://android-api.oss-cn-beijing.aliyuncs.com/logo.jpg","shortDescription":"折叠屏 玄武钢化","price":12999.00,"subsidizedPrice":12499.00,"sales":5000,"rating":4.90,"stock":100,"isAvailable":0,"brand":"华为"},{"id":10,"name":"荣耀Magic Vs2","model":"CMA-AN80","imageUrl":"https://android-api.oss-cn-beijing.aliyuncs.com/logo.jpg","shortDescription":"轻薄折叠屏","price":8999.00,"subsidizedPrice":8499.00,"sales":10000,"rating":4.70,"stock":300,"isAvailable":0,"brand":"荣耀"},{"id":11,"name":"iPhone 15 Pro Max","model":"A3108","imageUrl":"https://android-api.oss-cn-beijing.aliyuncs.com/logo.jpg","shortDescription":"A17 Pro 钛金属","price":9999.00,"subsidizedPrice":null,"sales":80000,"rating":4.80,"stock":200,"isAvailable":0,"brand":"苹果"},{"id":12,"name":"iPhone 15","model":"A3092","imageUrl":"https://android-api.oss-cn-beijing.aliyuncs.com/logo.jpg","shortDescription":"A16芯片 灵动岛","price":5999.00,"subsidizedPrice":null,"sales":150000,"rating":4.80,"stock":5000,"isAvailable":0,"brand":"苹果"},{"id":13,"name":"iPhone 15 Plus","model":"A3096","imageUrl":"https://android-api.oss-cn-beijing.aliyuncs.com/logo.jpg","shortDescription":"6.7英寸大屏","price":6999.00,"subsidizedPrice":null,"sales":80000,"rating":4.70,"stock":3000,"isAvailable":0,"brand":"苹果"},{"id":14,"name":"iPhone SE 4","model":"A2785","imageUrl":"https://android-api.oss-cn-beijing.aliyun 05-23 16:00:49.311 25132-25512 A0c0d0/JSAPP I result [object Object] 05-23 16:00:49.359 25132-25512 C03f00/ArkCompiler E [ArkRuntime Log] TypeError: is not callable 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log]Lifetime: 0.000000s 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log]Js-Engine: ark 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log]page: pages/Index.js 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log]Error message: is not callable 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log]Stacktrace: 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log] at forEachUpdateFunction (/devcloud/slavespace/usr1/081f8aba80800f0f0fcec015bd66c7e0/harmony_code/codearts_workspace/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:4352:1) 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log] at anonymous (entry|entry|1.0.0|src/main/ets/pages/Index.ts:144:13) 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log] at updateFunc (/devcloud/slavespace/usr1/081f8aba80800f0f0fcec015bd66c7e0/harmony_code/codearts_workspace/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6812:1) 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log] at UpdateElement (/devcloud/slavespace/usr1/081f8aba80800f0f0fcec015bd66c7e0/harmony_code/codearts_workspace/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6514:1) 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log] at anonymous (/devcloud/slavespace/usr1/081f8aba80800f0f0fcec015bd66c7e0/harmony_code/codearts_workspace/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6741:1) 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log] at updateDirtyElements (/devcloud/slavespace/usr1/081f8aba80800f0f0fcec015bd66c7e0/harmony_code/codearts_workspace/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6736:1) 05-23 16:00:49.361 25132-25512 C03900/Ace E [Engine Log] at rerender (entry|entry|1.0.0|src/main/ets/pages/Index.ts:152:9)
05-24
### 关于 HarmonyOS 或 ArkCompiler 中 'is not callable' 的 TypeError 问题 在 HarmonyOS 和 ArkCompiler 开发环境中遇到 `TypeError: is not callable` 误通常表明尝试调用的对象并非函数或可调用对象。这种误可能由多种原因引起,例如变量名冲突、未正确定义的回调函数或者对 `null` 值进行了不当操作。 #### 可能的原因分析 1. **变量覆盖了内置方法或函数** 如果开发者无意间将某些全局名称重新赋值为其他类型的值(如 `null`),可能会导致该误。例如,在 JavaScript 环境下,如果重写了 `Array.prototype.map` 方法并将其设置为 `null`,那么后续对该方法的调用会失败[^4]。 2. **异步编程中的上下文丢失** 在使用箭头函数或其他形式绑定事件处理器时,如果没有正确处理 this 上下文,则可能导致原本期望作为函数执行的内容变成了 undefined 或 null。这种情况常见于 React 组件生命周期方法以及 Vue.js 自定义指令场景中[^5]。 3. **API 返回值异常** 当从外部服务获取数据时,若返回的结果不符合预期结构——比如应该是一个函数却实际接收到的是 null ——也会引发此类误消息提示[^6]。 4. **Null 安全性问题** 类似于 MySQL 数据库设计里提到允许字段为空 (NULL)[^2], 在程序逻辑层面也需要考虑如何优雅地应对可能出现的 Null 情况。如果不小心试图直接调用了被赋予 Null 的属性或方法就会抛出类似的运行期误。 #### 决方案建议 针对以上几种可能性提供相应的决方案如下: - #### 验证目标是否确实具备可调用特性 在每次准备调用前先验证其类型是否属于 Function 。可以利用 typeof 运算符来进行初步判断。 ```javascript const maybeFunction = someCondition ? () => {} : null; if(typeof maybeFunction === 'function') { maybeFunction(); } ``` - #### 使用 Optional Chaining 提高健壮性 ES2020 引入了一个新功能叫做 optional chaining (`?.`) ,它可以帮助我们更简洁安全地访问深层嵌套对象而不用担心中间环节存在 null/undefined 导致崩溃风险。 ```javascript let result = possiblyUndefinedObject ?. methodToCall(); // 不会报即使object不存在 ``` - #### 明确区分命名空间内的同名实体 尽量避免自定义标识符框架内部保留字发生碰撞;另外通过模块化组织代码也能有效减少这类隐患的发生几率。 - #### 调试工具辅助定位具体位置 利用断点调试技术逐步跟踪哪一部分代码最终触发了这个特定异常,并针对性修复源头问题所在之处。 ```javascript try{ potentiallyProblematicCode(); }catch(e){ console.error('Error occurred:', e); } ``` ### 总结 通过对 HarmonyOS / ArkCompiler 平台开发过程中常见的 “not callable” 类型误现象剖析可知,这往往涉及到基本概念理偏差或者是编码习惯上的疏漏所致。采取适当预防措施加上良好实践能够显著降低遭遇这些问题的概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值