N个人,如何尽量保密而简洁地求出平均工资

要求:
1. 加法和除法操作尽量少;
2. 解密任意一人的工资,所需的串通人数要尽量多(小于或者等于N-1;等于N-1为最理想的情况);
3. 每个人所进行的操作尽量相似,承担的任务尽量均等。
 
方法一:第一个人取一个较大的随机数,把自己的工资加上该数,然后将求得的数秘密传递给第二个人;第二个人将得到的数加上自己的数,然后将求得的数秘传给下一个人;依次传递,直到第N人将所求的和秘密传递给第一人;第一人将得到的值减去初始的随机数,再除以N得到平均工资并予以公布。
优点:操作简单,只需要累加N次;在无人泄密和串通的情况下,每个人的工资都不能被推算出来。
缺点:保密性不高,只要第i-1和第i+1人串通就可以知道第i人的工资;第一个人相比于其它人承担了更多的工作量。
 
方法二:每个人将自己的工资随机分做 N个数之和,然后把其中N-1个数分别秘密地传递给其余N-1个人;每个人把自己留下的数以及收到的数加起来,并公布累加得到的值;把每个人公布的数加起来除以N就到了平均工资。
 
优点:只有N-1人串通或者泄露才可能准确推知余下的一人工资(这是平凡的,因为平均工资已知,如果再知道其中N-1人的工资,余下的一人的工资不用分析传递的细节就已经可以直接计算了);
缺点:需要约N^2次传递和累加;相比于方法一,每个人都知道了其它人工资的下限,虽然这个信息很宽泛,但不可忽略。
 
方法三:基于方法二改进。这里不妨假设N为奇数。每个人将自己的工资随机分做(N-1)/2份之和,这样每个人就有了(N-1)/2个数。第一个人拿出其中一个数,秘传给另一个人,该人拿出一个数与该数相加并传递给另外的人。每个人接收到的次数和传递出的次数之和叫做接传次数。传递的规则是:不将自己累加得到的数字传递给曾经将数字传递给自己的人;在余下的人当中,选择具有最小接传次数的其中一人,将自己累加得到的数传递给他。可以证明,在某个人把所有的数传递出去之前,他总能找到下一人接收他传出去的数字。当所有人传递完毕之后(这时数字会回到第一人手中),公布该数并除以N得到平均工资。稍加改进这种方法可以适应人数为偶数的情况。
优点:只需要约N^2/2次传递和累加,比方法二少一半;具有方法二的所有优点。结合方法一,即第一人加一个随机数,最后再减去该随机数,可以避免任何一人知道其它任何一人的工资的下限。
缺点:虽然传递的次数少,但比之于方法二,传递的过程不是并行的,这可以是优点,也可以是缺点。
 
问:有无更加高明的方法,使得传递的次数约为Nln(N)并且保留方法三的优点?
猜测:有。
 
问:当平均工资已知,但是某人将自己的工资遗忘了,该人可以取一个随机数作为自己的工资,然后进行上述的操作,这样该人可以推知自己的工资,而不引起泄密。那么,假如有两人或者多人忘记了自己的工资,怎么样在泄露尽量少的信息的情况下尽量准确的让他们可以推知自己的工资?
posted @ 2021-07-12 14:21  流川入海  阅读(300)  评论(0)    收藏  举报