数学魔术《数字根九》的奥秘

介绍数字根9的数学魔术及其原理

Share
数学魔术《数字根九》的奥秘
Photo by Crissy Jarvis / Unsplash

《数字根九》这个数学魔术是我在初中时买的一本书上学到的。这本书收藏了许多奇妙有趣的小游戏和故事,但遗憾的是,几年前弄丢了。学会数字根九后,我向初中的同学表演了几次,收获了不少称赞。大学乃至工作后,每当需要我上台表演节目时,我都会选择表演这个小游戏—唱歌跳舞对我而言实在是太难。

魔术的内容

这个魔术表演起来很简单,仅需要一位参与者。

首先表演者要求参与者随机想一串比较长的数字,例如 2024835016。然后再让参与者将这串数字打乱重新排列,假设重新排列为 8251603402—即使将 0 排在最前面也没问题。然后使用两数中较大的一个减去较小的一个,得到差值 6226768386。前面说到的这些数字,表演者是不需要知道的(保持魔术的神秘感)。

最后让参与者删掉差值里面一个非零数字(假设为 2),把剩下的数字(626768386)逐个报给表演者(可不按顺序)。表演者可根据这些剩下的数字猜出参与者删掉的是数字是几。

魔术的原理

这个数学魔术本质上是一个数字根问题。数字根又叫数根,是正整数的一个性质。计算方法是将正整数的各个位上的位数相加,如果相加得到的数字大于等于 10,则继续将结果的各位数相加,直到得到一个小于 10 的数字,即为原正整数的数字根。

在上面提到的魔术里,参与者将剩下的数字 626768386 报给表演者后。表演者计算这个数字的数字根为 7。然后用 9 减去 7 得到 2,就是参与者删掉的数字。如果 9 减去数字根得到的数字为 0,则参与者删掉的数字是 9。一个数字加上 9 后,它的数字根是不变的。

数字 x 的数字根 y 的计算公式为:

$$ y = mod(a-1, 9) + 1 $$

假设我们有一串数字 a,以及将 a 的各位数字打乱顺序后得到的数字 b。根据数字根的加和计算方法,a 和 b 的数字根是相同的,且 a - b 的数字根为 9,这就是魔术的数学原理。下面我们证明该原理的真实性。

要证明 a - b 的数字根为 9,我们需要证明:

$$ ((a - b) - 1) mod 9 + 1 = 9 $$

证明过程如下:

$$ ((a-b)-1)mod9+1 = ((a-b)mod9 - 1mod9)mod9 + 1 $$

$$ (a-b)mod9 = (amod9 -bmod9)mod9 = 0 $$

所以

$$ ((a-b)-1)mod9+1 = (0 - 1mod9)mod9 + 1 = (-1)mod9 + 1 = 9 $$

即需要证明的等式成立,魔术原理得证。

Read more

在 AI 时代,做 iOS 逆向分析有哪些高效手段

在 AI 时代,做 iOS 逆向分析有哪些高效手段

AI 发展如此迅猛,传统的代码手艺活已经被 AI 取代了很大一部分。除了生成代码外,AI 在其他的研发流程也能提升很多效率,例如这次要说的 AI 逆向分析。 在手工时代,我们逆向分析一个 iOS app,通常是使用 Hopper 或者 IDA 等软件查看解密的 Mach-O,然后利用软件提供的能力加上人工去分析逻辑流程。这个过程还要求我们懂一些基础的汇编语法。有时候还要去猜测哪些类哪些方法是负责某个逻辑,靠试验去验证。 现在来到了大模型时代,AI 不仅能自己通过一些简单的工具去分析 ipa 和 Mach-O ,也能使用更准更稳的 MCP、Skill 工具来做深度的分析。 Hopper MCP Hopper 在新版本支持了 MCP Server。 把 framework、Mach-O 或者解密后的 IPA 直接丢给它,

By Gray
Cinder:基于 Swift Macro 与 Mach-O Section 的解耦注册机制

Cinder:基于 Swift Macro 与 Mach-O Section 的解耦注册机制

Cinder(Github) 是一个无需逐模块启动注册、支持字符串、类型和函数调用的 Swift 编译期注册框架。 Cinder 是什么 在 iOS app 里借助 Mach-O 注册能力做一些二进制的插桩操作并不罕见。以往这些操作大都使用 objc runtime ,借助 __attribute__((used)) 和 __attribute__((section("name"))) 实现。在 Swift 上实现有一些难度,因为 Swift runtime 能力弱,以及早期的版本没有类似 objc 的 __attribute__ 能力。 * 在 Swift 5.10 版本,Apple 提供了 @_used 和

By Gray