【不可能的谜题】- 数学智力游戏系列
不可能的谜题(The Impossible Puzzle)是一个数学问题, 乍看之下似乎没什么线索,无法作答,所以被称为“不可能的谜题”. 这谜题有很多个版本。这里用最原始的版本:
教授在黑板上写下了两个正整数X和Y, 将其和告诉了学生S,积告诉了学生P。两人知道 1<X<Y<100,并发生了如下对话:
P:我不知道X和Y的具体值
S:我知道你不知道X和Y的具体值
P:那我现在知道了
S:那我也知道了
如果两人足够聪明,求X和Y。
下面来来分析这个有趣的谜题, 并用选择 Wolfram 语言 求解出来:
一、P说不知道X和Y的具体值
那么,那些情况下他能确定 X 和 Y 的值呢?当 P 得到的数的乘法分解唯一的时候。如15=3*5,16=2*8,而当他知道的数为诸如20的时候就不能确定了(20=2*10=4*5)。那我们做的第一步就是可以缩小数对的范围。
首先产生所有的 x、y 数对,用 Wolfram 语言来实现就是下面代码, 如果你对 Wolfram 语言还比较默认, 可以跳到解题的下一个步骤. 由于Table 多参数产生的列表是多层的,所以需要压平一层。
初学者看不懂Wolfram 语言中这些##&@@@#&不要紧,把它当成Flatten[#,1]& 就好了,两者在大多数情况下可以互换。此处采用这个写法是为了少打 5 个字符以节约大量时间。
p1 则是 P 第一次对话后剩余的可能的 x、y 数对。先用 GatherBy 按积相等进行分组,用 Select 挑选分组的长度不少于 2,即分解不唯一的数对。
二、S说我知道你不知道X和Y的具体值
S 只知道 x、y 的和,为什么却能知道 P 不能确定答案呢?无论 S 得到的数如何加法分解,每一对和分解的乘积的乘法分解不唯一,就能得出这样的结论。比如S得到了11,
11=2+9=3+8=4+7=5+6,
2*9=3*6,
3*8=4*6,
4*7=2*11,
5*6=3*10。
由于 S 足够聪明,他知道 P 的推理过程,自然能得出上面的 p1 表。换句话说,S 做出题设的结论,如果 S 得到的数的的加法分解数对全在 p1 表中的时候。于是可再次缩小数对范围。
下面是代码求解:
先对 p1 压平,按和相等进行分组,用 Select 挑选每组长度为所有分解长度的数组。可见此时 S 的值已锁定在 10 个值之内。
三、P说已经知道了答案
P 说已经知道了答案,那他是如何做到的呢?P 足够聪明,他知道 S 的推理过程,也就知道了 s1 的数对集合。说明在自己知道的数的乘法分解中,仅有一个数对在 s1 表中。据此可以再次缩小数对的范围。
先对s1进行压平,按积相等进行分组,用Select挑选每组长度为1的数组。
四、S说他也知道了答案
S 足够聪明,也得出了 p2 的数对集合,而且自己得到的数的加法分解中仅有一个数对在 p2 表中。让我们再来试试。
先对 p2 进行压平,按和相等进行分组,用Select挑选每组长度为1的数组。
可见此数对唯一,答案已然揭晓。
这道不可能的谜题最早是由汉斯·弗赖登塔尔得在 1969 年发表,而“不可能的谜题”这个名字是由马丁·加德纳所提出的, 加德纳可是 20 世纪下半叶, 美国数学科普界叱咤风云的人物, 除了他之外还有两位大师级的人物:艾萨克·阿西莫夫与卡尔·萨根.
这些大师均已逝世, 未来我们会用一系列这些文章来纪念他们. 下面看来加德纳老先生著名的"水手分椰子"趣题:
5个水手带着1只猴子来到一座荒岛,见岛上有大量椰子,他们便把这些椰子平均分成5堆。夜籁人静,一个水手偷偷起来拿走了一堆椰子,把剩下的椰子又平均分成5堆,结果多出一只椰子丢给猴子吃掉了,过了一会儿,另一个水手也偷偷起来,拿走了一堆椰子后,再把剩下的椰子平均分成5堆,结果还是多了一只,丢给猴子吃了。就这样一个多事的夜晚,5个水手都偷偷藏起一堆,重分了椰子,每次都多出一只椰子让猴子占了便宜。第二天一早,岛上依然平均堆放着5堆椰子。试问:原先的椰子最少要有多少只?
这道趣题解法很多, 您想尝试下吗? 有兴趣的请将答案发至 meemath@foxmail.com, 我将在下一期数学智力游戏文章中将解答方法公布.