文章
技术

【xkcd】谜题第二弹:囚犯问题

爱狗却养猫 饭丝

第一弹:/t/3960

来源:原网站依然offline;存档:https://web.archive.org/web/20190823182521/https://wiki.xkcd.com/irc/Puzzles


一 孤灯审讯室

100人被关押在一所监狱里。他们被告知,一小时后,他们都将被带到无窗、隔音的单人牢房。之后他们会被从牢房带到审讯室接受审讯,顺序随机(所以每个犯人可能被多次审讯或连续审讯);审讯结束后再被送回单人牢房。审讯室里有一个灯泡和操作它的开关。灯最初是关闭的,但只要犯人在审讯室里,就可以随意拨动开关,狱警则不会拨动开关。单人牢房里看不到审讯室的情况;每次提审一个犯人;审讯的时间长短和数量是随机的。总之,除了电灯开关,犯人们没有办法交流。在任何时候,任何一个被审讯的犯人都可以说:"每个人已经至少被审讯过一次。"如果确实如此,则所有人都会被释放。如果说错了,所有的犯人都会被处决。

  1. 现在,囚犯们有一个小时的时间来制定他们的策略,然后他们就会被互相隔离。他们应该制定怎么样的策略才能被释放?

  2. 如果不知道电灯的初始状态(开还是关),他们应该制定怎样的策略?

  3. 假设已知每天有且只有一次审讯。在这种情况下,是否存在更有效率的解决方案?

二 生死开箱

某监狱有100名犯人,每个囚犯都有一个从1到100的独特号码。在一个房间里,100个箱子排成一排。每个箱子里都放着一张纸片,纸片上写着1到100的数字。每个数字都只出现一次。每个犯人可以单独进入房间一次,最多打开50个箱子。他们只能看箱子里是什么数字,而不能移动纸片或箱子。一个犯人离开房间、下一个犯人进来之前,所有的箱子都会被重新关上。如果有犯人没能打开装有自己号码的盒子,所有犯人都会被处死;如果每个犯人都找到了自己的号码,那么所有犯人都将获得自由。一旦这个过程开始(即第一个犯人进入了房间),犯人之间将不允许以任何方式交流。显然,如果每个犯人随机打开50个箱子,那么所有人获得自由的概率是(1/2)^100,概率很低。

  1. 囚犯们可以通过什么策略来提高存活概率?

  2. 假设你是监狱工作人员,可以在事前与囚犯交流策略。之后你可以进入房间,检查所有的箱子,然后选择任意两张纸互相调换(最多可以调换一次)。然后,你会被送出监狱,无法与任何犯人交流,流程开始。你应该怎么做才能保证所有的犯人都能获得自由?

三 悲催的数学家们

你和另外n-1名数学家(n为有限数字)被一个邪恶的独裁者逮捕并关进了监狱。监狱是圆形的,有n个相同的无窗牢房,环绕着一个中央庭院。照明系统存在一些问题——每个牢房的电灯开关控制着顺时针方向下一个牢房的灯光。更糟的是,每天晚上午夜过后,电力只足以供应持续十分之一秒的灯光。

典狱长担心你们会用灯光来交流,所以他会经常以自己选择的方式重新安排囚犯的位置,并会打扫所有牢房以防囚犯互相留下信息。他每天都可能这样做,而且你们对他的行动将全然无知。除了牢房内部,你们看不到其他人或监狱的任何部分。你们甚至不知道有多少数学家和你们关在一起。

典狱长到你们的牢房去探望你们,并解释说,如果你们在这些防范措施下还能交流,他会认为你们都值得释放:在任何时候,任何囚犯如果认为他已经发现了有多少囚犯(即n),可以向典狱长申请释放。该囚犯将被允许进行一次猜测,如果猜对了,所有的囚犯都将被释放;但如果猜错了,所有的囚犯都将被处决。

你被选中设计一个策略,来发现囚犯的数量。你可以写一封邮件概述你的策略,典狱长会将此邮件传递给所有的囚犯。然而,你的策略必须是万无一失的,因为典狱长也会阅读你的邮件。

问题:有没有一种策略可以保证你的释放?如果有,请给出。如果没有,为什么?

四 棋盘传讯

有两个犯人,还有一个典狱长。典狱长向犯人们提出了一个挑战。他的房间里有一个8x8的棋盘和64个硬币。他将走进自己的房间,将每个硬币放在棋盘的一个方格上,且随机翻转硬币(正面或是反面)。其中一个犯人首先进入房间,典狱长会向她指出一个“魔法方格”。这个囚犯可以翻转棋盘上的一枚(仅一枚)硬币,然后离开;她也可以选择不翻转任何硬币,直接离开。接着,第二个犯人进入房间检视棋盘。如果他能正确指出“魔法方格”在哪里,则两个犯人都将获得自由。

问题:第一个犯人应该使用什么策略来确保两人都能获得自由?

菜单
  1. 狼狼醬 耶渣
    狼狼醬   私信可以,但我保留你亂罵的時候公開私信的權利。不算好的基督徒,深信左右都是膠的港獨。

    第一個問題: 如果審訊室見到電燈開關的話,每一個人都有自己撥開關的次數。開始時撥動。Aka不管本來是開是關,閃動了就是閃動了。 數完所有的次數就是所有人都被審訊過了。

  2. penumbra  
    1. (1)其实很简单, 只要指定一个“counter”就可以了。只有这个“counter”可以关灯。对于其余的囚犯,他们把灯打开当且仅当灯是关的,并且自己之前没有打开过灯。这样每一次counter关灯,他就知道有一个囚犯被审讯过了。

    这种情况下expected days till freedom=n(n-1)+n*H_(n-1)=O(n^2),此处H_i是第i个Harmonic number.

    (2)只要对(1)稍加改进就可以了。 如果你是counter:如果灯是开着的,把灯关掉。

    如果你不是counter:如果灯开着,什么也不做。如果灯关着,开灯当且仅当你之前开过0-1次灯。

    这样当counter数到200次的时候,他就可以说所有人都已经被审讯过了。因为当灯本身是开着的,这200次里有199次是犯人们打开的,能够保证所有人都已经被审讯过。如果灯本身是关着的,这200次都是犯人打开的。

    (3)我认为这一问比较奇怪,在我看来唯一影响的factor就是if prisoners will be able to tell days。目前我所知最好的algorithm是 with complexity O(n*(logn)^2),与审讯的模式无关。

    2.这是一个很经典的问题。这个问题其实是一个counting问题。

    Def:A permutation of a set X is a bijection p:X->X.

    Prop:For a finite set X with cardinality n,the collection of permutations S_X form a group under ordinary function composition. Moreover, S_X is isomorphic to the symmetric group S_n.

    我们只需考虑箱子的编号构成的排列。注意到每一个这样的排列都是S_n的一个元素。

    策略:对于每一个囚犯,他进入后首先打开写有自己编号的箱子,而后每次他都打开编号为自己之前打开箱子中数字的箱子,知道他成功找到自己的箱子或50次用完。

    这个策略是基于一个trivial的定理:

    Thm:each permutation p in S_n can be written as a product of disjoint cycles.

    每个人要做的,就是找到自己的cycle然后走下去,这个方法能成功当且仅当最长的cycle的长度<=50,因为如此他就可以完成cycle,找到自己的编号。所以要计算这种方法的成功率,我们只需count满足条件的permutation即可。

    counting很简单,对于每一个k>=51,如果有一个cycle of length k,那么这个cycle必须是最大的,而且各个case之间是exclusive的。

    For each k,P(contains cycle of length k)=Binomial(100,k) *(k-1)! *(100-k)!/100!=1/k.

    Hence P=1-sum(i=51,100)1/k which is approximately 0.3.

    0.3应该是目前所知最好的结果。

    3.这是一个非常tedious的问题,我无法找到efficient algorithm,在此贴上solution by Chris Lomont,Gene Foulk &Casey Hart.

    这种策略在只有100人的情况下,极有可能第一部分就要花掉远超宇宙寿命的时间。并且要假设这些mathematicians记忆力惊人(比如能准确地记住十亿天前发生了什么)。

    第一部分:bounding n

    这一部分分为k轮,第i轮(1<=i<=k)将花掉2^i+1天,k将在过程中决定。

    一开始,只有chosen拥有“标记”,在每轮的第一天,所有拥有标记的人打开开关,所有看到亮光的人也拥有标记,标记一旦拥有就一直持续(自己记住)。注意如果有未被标记的人,这一天一定至少有一个新的人被标记,并且被标记者最多变成原来的2倍(根据warden分配牢房的情况)。在此轮剩下的天数中,未被标记者即使看到灯光也不标记自己,而被标记者坚持每晚开灯,直到某晚他自己房间的灯未开。根据以上讨论,第i轮中,最多2^i人被标记,并且如果有人未被标记,第二天开始每天开灯的人将会减少,因此经过2^i天后,如果有人未被标记,所有人都不会接受到灯光。

    每一轮被标记的人数都会增加。因此经过有限轮后(不妨设为k轮),2^k晚经过,所有人仍接受到灯光,这说明在第一天的标记阶段,所有人都被标记,从这轮中所有人都会知道人数n在区间[k+1,2^k]中。

    (还有很长很长,有时间补上,or not)

    4.这是一个代数背景较深的问题,但是只描述解法的话中学生也能理解。

    要想确定一个entry在8*8matrix中的位置,我们需要row index和coloum index。在这里只给出row index的寻找方法,column同理,并且两者相互独立。

    我们来看1*8case。注意在二进制下,我们只需3个word就能确定1-8中任意一个数(写成二进制,只有3位)。对棋盘进行如下独立的3次染色: AAAABBBB,AABBAABB,ABABABAB。 对于要猜“魔法方格”的人,他要做的是数3次数:第一次,染色棋盘AAAABBBB,数B色方格上heads的个数,奇数记4,偶数记0. 第二次,染色AABBAABB,同样数B中heads的个数,奇数记2,偶数记0. 第三次,染色ABABABAB,数B中heads的个数,奇数记1,偶数记0.

    只要将3次所得数字加起来,就是魔法方格的row index(0=8)。 为了说明可行性,我们必须证明第一个囚犯一定能够在只翻转一枚硬币的情况下,让正确的组合在3种颜色中都出现。 但这是trivial的,因为初始状态只有8种可能:全部正确,第一种染色错误,第二种染色错误,第三种染色错误,第一二种染色错误,第一三种染色错误,第二三种染色错误,全部错误。 对于这八种情况,第一个人只需翻动如下列数的硬币即可:1,5,3,2,7,6,4,8. 所以翻动一枚硬币可以帮助第二个人确定行数,而这枚硬币拥有degree of freedom 1(即可以在一列上随便移动),所以同样的我们可以让这枚硬币来确定列数。

    这个问题的背景可以追溯到non-free module on a commutative ring的性质。

  3. penumbra  

    @Wolfychan #120028 第四行句号后第一句话“单人牢房看不到审讯室的情况”。

  4. 狼狼醬 耶渣
    狼狼醬   私信可以,但我保留你亂罵的時候公開私信的權利。不算好的基督徒,深信左右都是膠的港獨。
  5. penumbra  

    @Wolfychan #120079 没听懂你在说什么。当然counter和其他所有人一样,都不能随意出入牢房。重点在于“狱警不能能拨动开关”,因此审讯室中开关的状态是犯人们交流的唯一途径。既然假设狱警选择审讯的犯人是uniformly的,那么只能寄希望于counter会每隔一段时间被选上。

  6. 一只雞兒 一致通过
    一只雞兒   坚持贯彻主体思想一亿年不动摇

    @penumbra #120032 1(3)和前面的区别应该就是囚犯在这里可以通过天数而知道审判的次数,那么他们可以冒险用命换效率吧.

    在第n天某个人从未被提审次的概率pn=P(x=0),B(n,1/100)

    那么截止第n天所有人都被审过的概率就是p=P(x=0),B(100,pn)

    如果某个人认为这个p够接近1的话他就可以去报告,如果在之前指定只有一个囚犯能开灯其他人不能动而这时候灯的确是亮的,p还能更高一点.

  7. penumbra  

    @一只雞兒 #120261

    首先说一下我不认为你截止第n天所有人被审核过的概率是正确的,对于任何一个人,他在第n天未被审核过的概率是(99/100)^n没错,但是在第n天时,任何两人未被审核并不是independent或disjoint,因此应该没有简单的closed formula。

    我认为应该用inclusion-exclusion:

    Pr(all were interrogated by the end of day n)=1-sum(j=1,99)[binomial(100,j)* ((100-j)/100)^n* (-1)^(j+1)].

    然后我觉得“用命换效率”不妥,因为如此一来这个开关其实起不到任何作用,我想提问者的意思是“不牺牲准确性的情况下加以改进”才是。

    并且那时灯的明暗状态并不会影响到概率,更多的是一种indicator:如果灯亮,说明猜测fail了。

  8. 一只雞兒 一致通过
    一只雞兒   坚持贯彻主体思想一亿年不动摇

    概率忘光光了唉,是我想当然了,这俩的确不是independent events.不过感觉拿j* ((人数-j)/人数)^n* (-1)^(j+1)代入后算出来的p有点怪,尝试分别代进3人,n=3-5的情况时与实际有出入...

    不过那时候灯亮还是有一点作用的,代入binomial里的人数能从100减到99.

  9. penumbra  

    @一只雞兒 #120413

    你写的formula跟我提出的有出入。注意我的formula中第一项是binomial coefficient, binomial(n,k)=n!/(k!(n-k)!).

    另外对于正确的概率,在n从1到99时,概率应是0,因为不可能审讯100人。很容易可以证明那个公式恰有这个性质,你也可以用python简单验证。

    另外我还是不能同意灯的状态会对expected value有任何影响。