950 likes | 1.06k Views
随机性在计算机领域中的作用. 随机性的作用. “Randomization is a big idea in computer science.” ---C. E. Leiserson @ MIT. 随机性的作用. 宾夕法尼亚大学的 André DeHon 在“ Big Ideas in Computer Science in Computer Science and Engineering” 中总结了所有计算机学科中有代表性的重要思想,其中多次提到了“随机性”。. 1. 随机化的快速排序算法. 确定性的快速排序算法.
E N D
随机性的作用 • “Randomization is a big idea in computer science.” ---C. E. Leiserson @ MIT
随机性的作用 • 宾夕法尼亚大学的André DeHon在“Big Ideas in Computer Science in Computer Science and Engineering”中总结了所有计算机学科中有代表性的重要思想,其中多次提到了“随机性”。
确定性的快速排序算法 • 确定性的快速排序算法的效率依赖于pivot值的选取。 • 只要pivot值的选取方式固定,都存在一些规模为n的输入,使得快速排序算法效率为Θ(n2)。 例如,如果每次选取pivot值为待排序数组的最后一个值,则快速排序算法对于已经排序好的数组效率最低。 • 也就是说,确定性的快速排序算法希望输入数据没有任何规律,是完全随机的。
随机化的快速排序算法 • 每次在输入数据中随机地选取pivot值。 • 不存在任何输入使得随机化的快速排序算法在该输入下复杂度一定为Θ(n2)。 • 随机化的快速排序算法不依赖于外部输入数据的随机性。
随机算法的作用之一:降低对输入数据随机性的依赖随机算法的作用之一:降低对输入数据随机性的依赖 随机性的快速 排序算法: 带有一种 内置的随机性 (built-in randomness) 确定性的快速 排序算法 依赖于输入 数据的 “随机性” 不依赖输入 数据的 “随机性”
计算“平均成绩”问题 n个学生P1,P2,…,Pn参加了一次考试,学生Pi的成绩为Ci(1≤i≤n)。现在这n个学生要计算他们的平均成绩,并且保证: (1) 任何一个学生都不泄露自己的成绩。 (2) 即使有k个学生之间相互共享信息,这k个学生最多也只能知道其余n-k个学生的平均成绩。 是否存在一种可行的方案?
协议(protocol) 我们通过设计一个“协议”来解决这个问题。简单地说,“协议”是两个(或两个以上)人为完成某项任务而进行的一系列操作步骤。 最简单的协议是“切蛋糕”协议。 • 参与者:两个人A和B。 • 任务:公平地分一块蛋糕。 • 操作步骤:(1)A把蛋糕切成2块。 (2)B选走其中一块蛋糕。 (3)A取走剩下的那块蛋糕。
计算“平均成绩”问题 • 参与者:n个学生P1,P2,…,Pn • 任务:计算平均成绩(满足前面提到的两个条件) • 步骤:?
协议1 • 思想:假设考试包含n道题目。每个同学Pi负责统计所有同学第i道题目的得分。最后把所有同学的统计结果加起来,得到总成绩。
协议1 (1) 每个学生Pi把自己的成绩分成n份Ci=Ci1+Ci2+…+Cin(其中Cij代表第i个同学第j道题的分数),学生Pi把Cij告诉给学生Pj。 (2) 每个学生Pj计算并公布Dj=C1j+C2j+…+Cnj (所有学生第j道题的得分)。 (3) 计算D1+D2+…+Dn,得到总成绩。
协议1的优点 • 一方面,为了计算总成绩,每个学生必须把自己的成绩以某种方式发布出去,实现“信息共享”。 • 另一方面,任何学生都不能直接把自己的成绩告诉给任何人。 • 每个学生Pi把自己的成绩分成n份,把其中n-1份分别告诉其他n-1个同学。这样每个学生从Pi那得到的只不过是关于学生Pi成绩的“部分信息”。
协议1的缺点 • 考试未必恰好包含n个考试题目。 • 假设k个同学共享信息,可以大概估计其他同学的考试分数。
协议2 (1) 每个学生Pi把自己的成绩分成n份Ci=Ci1+Ci2+…+Cin(对任意j, Cij为0和Ci之间的随机数),学生Pi把Cij告诉给学生Pj。 (2) 每个学生Pi计算并公布Di=C1i+C2i+…+Cni (3) 计算D1+D2+…+Dn,得到总成绩。
协议2(例子) • 假设n=30,学生P1成绩是90,学生P2成绩是30。则相应的矩阵可能为:
协议2的缺点 假设k个同学共享信息,可以大概估计出:某两个学生Pi和Pj的分数哪个更高。 原因:随机变量Cij为0和Ci之间的随机数,因此可以从Cij中得到关于Ci的统计信息。
协议3 思想: 选取一个数M,使得Cij为0和M之间的随机数。 这样的好处是: 无需担心可以从Cij中得到M的任何统计信息。
协议3 (1) 选取M=101*n,每个学生Pi产生n-1个1到M之间的随机数Cij(i ≠j, 1≤j≤n),计算Cii,使得Ci=Ci1+Ci2+…+Cin(mod M),学生Pi把Cij告诉给学生Pj。 (2) 每个学生Pi计算并公布Di=C1i+C2i+…+Cni(mod M)。 (3) 计算D1+D2+…+Dn (mod M),得到总成绩。
协议3(例子) • 假设n=30,选取M=101*30=3030。学生P1成绩是90,学生P2成绩是30。 相应的矩阵可能为: • 其中矩阵第一行所有值相加等于3120=90(mod 3030) • 其中矩阵第一行所有值相加等于6090=30(mod 3030)
协议3 分析: • 协议3满足: (1)任何一个学生都不泄露自己的成绩。 (2)即使有k个学生之间相互共享信息,这k个学生最多也只能知道其余n-k个学生的平均成绩。 • 这是因为:每个学生Pi从其他学生那里得到的无非是一些0到M(公开的)之间的随机数。
随机性在协议3中起的作用 • 基本思想:把学生Pi的成绩Ci分成n份Ci=Ci1+Ci2+…+Cin(其中n-1个数都是随机数),借助这些随机数的“掩护”,Ci中包含的信息才不会被泄露。
RSA算法 (1)生成两个大质数p, q… …… • 要想保证RSA的安全性,p和q的数量级应为21000。
生成质数的算法 generatePrime(m, n) //生成一个m到n范围内的质数 isPrime = false; while(!isPrime) k = rand(m,n);//生成一个m到n范围内的随机数 isPrime = primilityTesting(k);//验证n是否为质数 return k; • 如果要生成一个21000数量级的质数,对primilityTesting算法效率有很高的要求。
“验证质数”的一个简单算法 primilityTesting(n) { for i = 2 to n – 1 if (n % i == 0) return false; return true; } 算法复杂度为O(n),也就是说要验证一个21000数量级的数是否为质数,需要O(21000)的时间。
验证质数的算法 • Miller-Rabin Test是验证一个数是否为质数的最常用的方法,也是最著名的随机算法。 • 我们这里主要介绍该算法的框架结构和整体思想。
Miller-Rabin Test的思想 • 假定要验证n是否为质数,该算法验证n为质数的某个必要条件(存在高效率的算法)。根据验证的结果判断n是否为质数。 • 这个必要条件就是“费马小定理”(Fermat’s Little Theorem)
费马小定理 • 如果一个数p是质数,那么对于任意的a∈{1,2,…,p-1}, ap-1 = 1 (mod p)。 • 例如, 从{1,2,…,p-1}中随机地选取a=2: 7是质数 2(7-1) = 64 = 1 (mod 7) 2(6-1) = 32 = 2 ≠1 (mod 6) 6不是质数。
Miller-Rabin Test的思想 • 如果一个数p是质数,那么对于任意的a∈{1,2,…,p-1}, ap-1 = 1 (mod p)。 • 例如, 从{1,2,…,p-1}中随机地选取a=2: 2(7-1) = 1 (mod 7) 7是质数。 2(6-1)≠1 (mod 6) 6不是质数。
Miller-Rabin Test的思想 • 如果一个数p是质数,那么对于任意的a∈{1,2,…,p-1}, ap-1 = 1 (mod p)。 从{1,2,…,p-1}中随机地选取a: a(n-1) = 1 (mod n) n是质数。(理由不充分) a(n-1)≠1 (mod n) n不是质数。(一定成立)
Miller-Rabin Test的思想 从{1,2,…,p-1}中随机地选取a: a(n-1) = 1 (mod n) n是质数。(理由不充分) a(n-1)≠1 (mod n) n不是质数。(一定成立) • 如果算法返回“n不是质数”,则n一定不是质数。 • 如果算法返回“n是质数”,则算法有可能“出错”。事实上,可以证明,“出错”的概率小于1/2。
Miller-Rabin Test算法 将以下“实验”重复进行k次: 从{1,2,…,p-1}中随机地选取a: a(n-1) = 1 (mod n) n是质数。(理由不充分) a(n-1)≠1 (mod n) n不是质数。(一定成立) (Miller-Rabin Test算法在此基础上还作了进一步的改进。) • 如果算法返回“n不是质数”,则n一定不是质数。 • 如果算法返回“n是质数”,则算法有可能“出错”。事实上,可以证明,“出错”的概率小于(1/2)k。
随机算法中一种常用的技巧 在随机算法的精确度和时间复杂度之间可以进行交换(trade-off): • 代价:算法时间复杂度以线性的速度上升。 • 收益:算法“失败”的概率以指数级的速度下降。
什么是零知识证明? • A向B证明c,证明结束后B不知道关于c的任何信息。 • J.-J. Quisquater et al., "How to Explain Zero-Knowledge Protocols to Your Children," Proc. Advances in Cryptology, pp. 628-631, 1989. • 我们举另外一个例子。
一个直观的例子 • 有一个迷宫,A知道这个迷宫从入口s到出口t的n条路径。假设A想让B相信从s到t至少有一条路径,同时A又不希望向B泄露从s到t的路径。该采用什么样的方法? s t
解决办法 m1 s t • (1) A选取从s到t的任意一条路径及路径上的一个中间点m1。以m1为界,将路径一分为二:s,…,m1和m1,…,t。A把m1的位置告诉给B。
解决办法 m1 s t • (2) B随机地向A提问:“从s如何到达m1?”或“从m1如何到达t?”
解决办法 m1 s t • (3) A回答B的问题,B验证A的答案是否正确。如果正确,则B相信A知道从s到t的路径。
分析 m1 s t • 从B的角度,假设A只知道s,…,m1和m1,…,t其中的一条路径。A能正确回答B的问题的概率为1/2。
解决办法&分析 m1 m2 s t 。。。 。。。 mk • 如果把前面的协议看成一次“随机实验”,该实验失败的概率为1/2。 • 如果A和B重复进行该实验k次,失败的概率为(1/2)k。当k足够大时, (1/2)k足够小,k次实验全部失败的概率可以忽略不计。
解决办法&分析 m1 m2 s t 。。。 。。。 mk • A每次向B提供的信息都是“部分信息”,B不足以从这些部分信息中“拼凑出”从s到t的路径。
随机性所起的作用 我们注意到: (2) B随机地向A提问:“从s如何到达m1?”或“从m1如何到达t?” • 假如A预先知道B提的问题是:“从s如何到达m1?”,则A有办法欺骗B。 • 同样道理,假如A预先知道B提的问题是: “从m1如何到达t?” ,A同样有办法欺骗B。
“验证身份(authentication)”问题 • 一组用户A, B, C,…每个用户都有一个私有信息。 • 假如A想向B表明身份: (1) A向B证明他(她)知道xA。 (2) A不希望泄露xA。
数论基础 • 为了解决“验证身份”问题,我们在Zn*上考虑问题: Zn* = {i | 1≤ i ≤n-1, gcd(i, n) = 1},其中n为两个不相同质数的乘积。 • 假设n = 3×7 = 21, Zn* ={1, 2, 4, 5, 8, 10, 11, 13, 16, 17, 19, 20} • Zn*在乘法操作下,形成一个代数系统“群(group)”.
Zn*中的乘法操作 • 对任意的a, b∈Zn*, a*b = a*b (mod n)。 • 例如,在Z21*中, 2*4 = 8 (mod 21) 4*16 = 1 (mod 21) • 在Zn*中乘法操作是简单的(regular multiplication & division)。