谁最富有?
///author:charme(www.hi.baidu.com/charme000)
///date:2010.5.18
//////////////////////////////////////////////////////////////////////////////////
现在我们考虑这样的一个问题:
假如有4个富人,现在一个组织要统计下他们的财富状况。通过统计要反应出最大和最小财富的数目。
大概的给出两个前提:
(1) 每个人的财富都小于100亿
(2) 每个人的财富都达到的了以亿计的级别
(3) 每个富翁提供的自己的财富情况属实
(4) 每个富翁之间不会串通(也就是不会主动的去打听别的富翁的经济状况)
(5) 每个富翁都不想让除了统计机构之外的其他富翁知道自己的任何财富信息
问题来了:用什么样的手段来获得满意的结果呢?
根据题目我们大概可以给出这样的一个解决办法:
(1) 把所有的富翁集中在一个房间里
(2) 准备上面贴有1亿,2亿,3亿。。。。。100亿标签的箱子
(3) 每个富翁发100个一样的信封
(4) 每个富翁发1张写有“是”和99张写有“否”的纸条
(5) 这些纸条由富翁自己来放进信封
(6) 每个富翁开始投递邮件(原则是那个装有“是”纸条的信封要装入富翁自己认为和财富状况对应的邮箱里)
(7) 做统计
上面的步骤结束后基本就保证了每个富翁都在不了解别人财富的情况下而完成了财富统计的要求。
接下来我们做一个延伸,因为我们之前给定的前提太多了,很不符合实际情况。
比如我们这个统计过程是通过发电子邮件来实行的,那么电子邮件就有可能被窃取,这样的话富翁的财富状况就有可能内其他人得知,惹来杀身之祸。
那么问题来了:我们怎么样才能保证富翁们的信息不会被获取还要实现统计呢?
分析:我们可以这样来想,信息不被泄露-》信息不被得知-》信息被不完全的获取那么这样等价下来吧,我们要做的就是怎么保证出现富翁之间互相打听的时候只能得到部分的信息,从而保证了完整的信息不被恶意的获取。
密码学上有一个很有用的理论:假设我们想知道数字N。并且已知N<M,那么我们可以找三个数N1,N2,N3(N1<M,N2<M,N3<M),做一个运算(N1+N2+N3)=N(mod M)(也就是求三者之和以M为模得倒的余数N),那么这样的话,即使有人知道了这三个数里面的两个,也不会推算出另外一个数,这样就保证的信息的不完全获取。
那么我们就根据上面的这个密码学理论来讨论这个实际的问题。
解答:
假设有四个富翁A,B,C,D
拥有的财富分别为10亿,20亿,30亿,30亿
每个人有100个盒子
这100个盒子按整数贴有1亿2亿。。。。。。100亿这样的标签,同前。
每个富翁都要在这每个人100个盒子里依次的放数字。(也就是说一个富翁要给除了自己外的其他人都要投数字,也就是一个人要往400个盒子里放数字)
问题是放什么数字呢?怎么放呢?
我们采取这样的策略:
A在B的盒子里依次放入4(10号除外------------------------10号放4)
A在C的盒子里依次放入6(10号除外------------------------10号放6)
A在D的盒子里依次放入10(10号除外------------------------10号放10)
A在A的盒子里依次放入11(10号除外------------------------10号放12)
注意:(4+6+10+11)=0(mod 31) (4+6+10+12)=1(mod 31)
上面得出的两条结论是很重要的。31是我们选择的比4大的数字,其实任何数字都可以的,这样满足一个条件:1.大于N 。
那么对于我们选定的数字M(M>N)。总可以找到一个组合来让他满足上面的两个规律,4,6,10,11(12)就是我们找到的这些符合规律的组合。
那么这个结论说明了什么呢?
这个结论我们暂时可以理解为:对于A这个执行者,他拥有的财富对应的是数字10,那么通过余数0,1的变化微妙看出只有他对这个变化做出了“贡献”,也就是说因为他才使得结果余数发生了变化。
那么B,C,D三个人依次类推的来头数。
那么到最后都投数完毕的时候400个盒子都慢慢的了。每个盒子里都有了4个数字。那么现在我们要求B,C,D来看自己的盒子里的数字,也就是每个盒子里的数字的组合告诉A(比如通过电子邮件,要知道现在电子邮件传输的是B,C,D的信息,而不包括A,的,那么根据前面的理论基石知道三个的信息业没有办法推算出A的信息)。
那么我们定义下每个盒子里的数字的组合:a1-a2-a3-a4
那么可想而知,A得到的信息是这样的:
除了10 20 30 以外的所有箱子的组合都是 31-31-31-31.。。。。这些数字加起来mod31得到0
对于10号箱子必然得到组合32-31-31-31 。。。。。。。。。得到余数1
对于20号和10号结果一样。。。。。。。。。。。。。。。。。。。。。得到余数1
对于30号得到组合32-32-31-31.。。。。。。。。。。。。。。。。。得到余数2
到此我们知道了财富分布状况是:
10亿-------1人 20亿--------1人 30亿-----------2人
而且呢,对于30号,谁报告的32这个数字,表示谁占有30亿,对于20号谁的邮件里提到32这个数字,表示他就占有20亿。
那么上面的问题得到了完美的解决。
如果扩展到更多的富翁,那么也是一样的算法。
呼呼,这个问题很有意思,密码学业很有用,希望大家多研究下。呼呼
如果对于这个问题有更好的理论来解决,希望大家可以EMAIL(charme000@gmail.com)下我,学习下。