上篇:程序员的脑力瑜伽操03-约翰麦卡锡的间谍问题
公布答案啦:
首先我们认识一下单向函数:
我摘取了维基百科的定义:
单向函数 (One-way function)是一种具有下述特点的单射函数:对于每一个输入,函数值都容易计算(多项式时间),但是给出一个随机输入的函数值,算出原始输入却比较困难(无法在多项式时间内使用非确定性图灵机计算)。
拉宾就是采用“单向函数”的算法得出了解决方案。冯·诺依曼当时提出过一个单向函数,很出名。是这样描述的:
假设有个x,x有100位数字,该数值的平方值很容易计算,平方后的结果有200位数字,在这200位数字中我们取中间的100个数字,称为y。如果我给你x,你通过平方后取中间100位,得出y值。但如果我给你y值,让你计算我手中的x值,却很难逆向得出x值。
拉宾采取的就是冯·诺依曼的这个单向函数思想。
具体方案如下:
假设守卫知道如何计算平方后取中,而且他们有一份y值列表,每个y值对应一个间谍。当间谍来到边境的时候,间谍会告诉守卫他的x值和姓名。守卫核对x的平方取中是否等于y(同时核对间谍没有进入过其他地方)。如果守卫喝酒漏嘴,把手中y值列表也就是间谍名单泄漏了,更或者连平方取中这个“加密规则”也告诉了敌军,那现在敌军即使有了一份y值列表和平方取中规则,敌军也很难逆向算出x,然后赋予自己间谍一个x值(名字好赋予,名单上有)。
不过拉宾的方案引出了一个问题,就是"你怎么验证某个函数(就像我们这里的平方取中函数)很难逆向求解“的问题。感兴趣的猿媛们可以自行搜索。
如果猿媛们有更好的想法,比如都想到公钥私钥此类的,欢迎补充。
----------------------------------------------------------------------------------------------------------------
04弹:寻找你的恋人
在一个小王国中,有8个村子(A~H)。如下图所示,各个村之间有道路相连(黑点表示村子,线表示道路)。而你要寻找流浪在这个王国的你的唯一的恋人。
你的恋人住在这8个村子中的某一个里。她每过一个月便顺着道路去另外一个村子,这个村子是和上个月住的村子一定是直接相连的,比如恋人这个月住在G村,那么下个月就住在“C/F/H中的某个村子”,因为C/F/H3个村子只要一条直线或弧线和G村项链。恋人选择哪个村子是随机的,预测不了。
目前你手头上只有这么一个确凿的信息:12个月前,恋人住在G存,请求出这个月恋人住在A存的概率。
恋人,你在A村概率多大呢?
讨论第第三个问题回复,加上Tag03,如 Tag03:我的评论
讨论第四个问题时候加上Tag04,如 Tag04:我的评论