Upload
acton-sparks
View
81
Download
1
Embed Size (px)
DESCRIPTION
随机性在计算机领域中的作用. 随机性的作用. “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. 随机化的快速排序算法. 确定性的快速排序算法. - PowerPoint PPT Presentation
Citation preview
随机性在计算机领域中的作用
随机性的作用
• “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. 随机化的快速排序算法
确定性的快速排序算法• 确定性的快速排序算法的效率依赖于 pivot 值的选
取。
• 只要 pivot 值的选取方式固定,都存在一些规模为n 的输入,使得快速排序算法效率为 Θ(n2) 。例如,如果每次选取 pivot 值为待排序数组的最后一个值,则快速排序算法对于已经排序好的数组效率最低。
• 也就是说,确定性的快速排序算法希望输入数据没有任何规律,是完全随机的。
随机化的快速排序算法• 每次在输入数据中随机地选取 pivot 值。
• 不存在任何输入使得随机化的快速排序算法在该输入下复杂度一定为 Θ(n2) 。
• 随机化的快速排序算法不依赖于外部输入数据的随机性。
随机算法的作用之一:降低对输入数据随机性的依赖
确定性的快速排序算法
依赖于输入数据的
“ 随机性”
随机性的快速排序算法:
带有一种内置的随机性
(built-inrandomness)
不依赖输入数据的
“ 随机性”
2. 计算“平均成绩”问题
计算“平均成绩”问题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 ,得到总成绩。
nnnn
n
n
CCC
CCC
CCC
...
......
...
...
21
22221
11211
协议 1 的优点• 一方面,为了计算总成绩,每个学生必须把自己的
成绩以某种方式发布出去,实现“信息共享”。
• 另一方面,任何学生都不能直接把自己的成绩告诉给任何人。
• 每个学生 Pi 把自己的成绩分成 n 份,把其中 n-1份分别告诉其他 n-1 个同学。这样每个学生从 Pi 那得到的只不过是关于学生 Pi 成绩的“部分信息”。
协议 1 的缺点• 考试未必恰好包含 n 个考试题目。• 假设 k 个同学共享信息,可以大概估计其
他同学的考试分数。
nnnn CCC ...
......
...555
...010
21
协议 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 ,得到总成绩。
nnnn
n
n
CCC
CCC
CCC
...
......
...
...
21
22221
11211
协议 2 (例子)• 假设 n=30 ,学生 P1 成绩是 90 ,学生 P2
成绩是 30 。则相应的矩阵可能为:
30,302,301,30 ...
......
0...12
5...34
CCC
协议 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) ,得到总成绩。
nnnn
n
n
CCC
CCC
CCC
...
......
...
...
21
22221
11211
协议 3 (例子)• 假设 n=30 ,选取 M=101*30=3030 。学生 P1 成
绩是 90 ,学生 P2 成绩是 30 。相应的矩阵可能为:
• 其中矩阵第一行所有值相加等于 3120=90(mod 3030)• 其中矩阵第一行所有值相加等于 6090=30(mod 3030)
30,302,301,30 ...
......
2200...861030
1001...2368
CCC
协议 3
分析:• 协议 3 满足:
(1) 任何一个学生都不泄露自己的成绩。(2) 即使有 k 个学生之间相互共享信息,这 k 个学生最多也只能知道其余 n-k 个学生的平均成绩。
• 这是因为:每个学生 Pi 从其他学生那里得到的无非是一些 0 到 M( 公开的 ) 之间的随机数。
随机性在协议 3 中起的作用• 基本思想:把学生 Pi 的成绩 Ci 分成 n 份 Ci
=Ci1+Ci2+…+Cin (其中 n-1 个数都是随机数),借助这些随机数的“掩护”, Ci 中包含的信息才不会被泄露。
nnnn
n
n
CCC
CCC
CCC
...
......
...
...
21
22221
11211
3. 验证一个数是否为质数
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 – 1if (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 。
随机算法中一种常用的技巧时间复杂度 “失败”的概
率1 次随机实验 O(f(n)) p
k 次随机实验 k*O(f(n)) pk
在随机算法的精确度和时间复杂度之间可以进行交换 (trade-off) :
• 代价:算法时间复杂度以线性的速度上升。• 收益:算法“失败”的概率以指数级的速度下降。
4. 零知识证明( zero-knowledge proof )
什么是零知识证明?• 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
解决办法
• (1) A 选取从 s 到 t 的任意一条路径及路径上的一个中间点 m1 。以 m1 为界,将路径一分为二: s,…,m1 和 m1,…,t 。 A 把 m1 的位置告诉给 B 。
s t
m1
解决办法
• (2) B 随机地向 A 提问:“从 s 如何到达m1 ?”或“从 m1 如何到达 t ?”
s t
m1
解决办法
• (3) A回答 B 的问题, B验证 A 的答案是否正确。如果正确,则 B 相信 A 知道从 s 到 t 的路径。
s t
m1
分析
• 从 B 的角度,假设 A 只知道 s,…,m1 和 m1,…,t 其中的一条路径。 A 能正确回答 B 的问题的概率为1/2 。
s t
m1
解决办法 & 分析
• 如果把前面的协议看成一次“随机实验”,该实验失败的概率为 1/2 。
• 如果 A 和 B 重复进行该实验 k 次,失败的概率为(1/2)k 。当 k 足够大时, (1/2)k 足够小, k 次实验全部失败的概率可以忽略不计。
s t
m1
m2
。。。 。。。
mk
解决办法 & 分析
• A 每次向 B 提供的信息都是“部分信息”, B 不足以从这些部分信息中“拼凑出”从 s 到 t 的路径。
s t
m1
m2
。。。 。。。
mk
随机性所起的作用我们注意到:(2) B 随机地向 A 提问:“从 s 如何到达m1 ?”或“从 m1 如何到达 t ?”
• 假如 A预先知道 B 提的问题是:“从 s 如何到达m1 ?”,则 A 有办法欺骗 B 。
• 同样道理,假如 A预先知道 B 提的问题是: “从 m1 如何到达 t ?” , A 同样有办法欺骗B 。
总结公开信息 迷宫A 的保密信息 从 s 到 t 的路径A 把保密信息“拆分”成两部分
s,…mi & mi,…,t
A 告诉 B 一个“中间点”
mi
A 告诉 B 某些”部分信息”
s,…mi 或 mi,…,t
B很容易能验证 A 提供的答案
沿着路径 s,…mi 或 mi,…,t 走
“验证身份 (authentication)” 问题
• 一组用户 A, B, C,… 每个用户都有一个私有信息。• 假如 A 想向 B 表明身份:
(1) A向 B 证明他 (她 ) 知道 xA 。(2) A 不希望泄露 xA 。
用户 A B C … …
私有信息 xA xB xC … …
数论基础• 为了解决“验证身份”问题,我们在 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 Z∈ n* ,
a*b = a*b (mod n) 。
• 例如,在 Z21* 中,
2*4 = 8 (mod 21)4*16 = 1 (mod 21)
• 在 Zn* 中乘法操作是简单的 (regular multiplication
& division) 。
Zn* 中的除法操作
• 对任意的 b Z∈ n* ,存在唯一的 c Z∈ n
* ,使得b*c = 1 (mod n)
我们把 c叫做 b 的倒数,记为 b-1。• 在 Zn
* 中,已知一个数 b ,计算 b-1 是简单的 (the extended Euclidean algorithm) 。
b 1 2 4 5 8 10 11 13 16 17 19 20
b-1 1 11 16 17 8 19 2 13 4 5 10 20
Zn* 中的除法操作
• 对任意的 a, b Z∈ n*
a/b = a*b-1 (mod n)
• 例如,在 Z21* 中,
5/8 = 5*(8-1) = 5*8 = 19 (mod 21)
• 在 Zn* 中除法操作是简单的 (the extended E
uclidean algorithm & regular multiplication and division) 。
在 Zn* 中求平方
• 对任意的 a Z∈ n* ,
a2 = a*a (mod n)
• 例如,在 Z21* 中,52 = 4(mod 21)
• 在 Zn* 中“求平方”操作是简单的 (regular
multiplication & division) 。
在 Zn* 中开平方
• 对任意的 a, b Z∈ n* ,如果
a2 = b (mod n)• 那么, a叫做 b 的一个平方根。• 对于较大的 n ,在不知道 n 的质因数分解的情况下,在 Zn
* 中“开方”操作是极其复杂的。
a 1 2 4 5 8 10 11 13 16 17 19 20
a2 1 4 16 4 1 16 16 1 4 16 4 1
总结• 在 Zn
*(n 为两个不同质数的乘积 ) 中:
操作 复杂程度乘法 简单除法 简单平方 简单开方 复杂
“验证身份 (authentication)” 问题
• 一组用户 A, B, C,… 每个用户都有一个私有信息。• 假如 A 想向 B 表明身份:
(1) A向 B 证明他 (她 ) 知道 xA 。(2) A 不希望泄露 xA 。
用户 A B C … …
私有信息 xA xB xC … …
“验证身份 (authentication)” 问题
• 选取 n 为两个不同大质数 p 和 q 的乘积。每个用户都知道 n ,但并不知道 p 或者 q 。
• 每个用户 i 从 Zn* 中随机地选取一个数 xi ,计算 Xi
= xi2 (mod n) ,并把 (i, Xi) 公开。
公开信息n
(A, XA) (B, XB) (C, XC) … …
私有信息 xA xB xC … …
“验证身份 (authentication)” 问题
• 假设 A 想向 B 表明身份,最简单的办法:(1) A 把 xA 告诉给 B 。(2) B验证 xA
2 = XA (mod n) 是否成立。• 但这样做之后, B 知道 xA , B 可以伪装成 A 和其他用户通
信。我们需要用到“零知识证明”。
公开信息n
(A, XA) (B, XB) (C, XC) … …
私有信息 xA xB xC … …
“零知识证明”的思想
• A首先生成一个随机数 y ,并计算 Y = y2(mod n) 。• A把关于 xA的信息“拆分”成两部分,“ y” 和“ y*xA” 。
(1) 把两部分信息和在一起,可以得到 xA 。(2) y 对 xA 起“掩护”作用。
s t
Yy
y*xA
类比
公开信息 迷宫 XA, n
A 的保密信息 从 s 到 t 的路径 xA
A 把保密信息“拆分”成两部分
s,…m & m,…,t y & y*xA
A 告诉 B 一个“中间点”
m Y
A 告诉 B 某些”部分信息”
s,…m 或 m,…,t y 或 y*xA
B很容易能验证A 提供的答案
沿着路径 s,…m 或m,…,t 走
验证 y2=Y? 或 (y*xA)2=Y*XA?
解决办法
• (1) A 随机地生成一个数 y Z∈ n* ,计算 Y = y2(mod
n) 。 A 把 Y 告诉给 B 。
s t
Yy
y*xA
解决办法
• (2) B 随机地向 A 提问:“ y等于多少?”或“ y*xA等于多少?”
s t
Yy
y*xA
解决办法
(3) A回答 B 的问题, B验证 A 的答案。3.1 问题 : “y等于多少 ?” 验证 : y2 = Y (mod n)?
3.2 问题 : “y*xA等于多少 ?” 验证 : (y*xA)2= Y*XA (mod n)?
s t
Yy
y*xA
分析
• 从 B 的角度,假设 A 只知道“ y” 或“ y*xA” 。 A能正确回答 B 的问题的概率为 1/2 。
s t
Yy
y*xA
解决办法 & 分析
• 如果把前面的协议看成一次“随机实验”,该实验失败的概率为 1/2 。
• 如果 A 和 B 重复进行该实验 k 次,失败的概率为(1/2)k 。当 k 足够大时, (1/2)k 足够小, k 次实验全部失败的概率可以忽略不计。
s t
Y1
Y2
。。。 。。。
Yk
解决办法 & 分析
• A 每次向 B 提供的信息或者是“ y” 或者是“ y*x
A” , B 不足以从这些随机信息中得到关于 xA 的任何信息。
s t
Y1
Y2
。。。 。。。
Yk
随机性所起的作用我们注意到:(2) B 随机地向 A 提问:“ y等于多少?”或“ y*xA等于多少?”
• 假如 A预先知道 B 提的问题是: “ y等于多少?” ,则 A 有办法欺骗 B 。
• 同样道理,假如 A预先知道 B 提的问题是: “ y*xA等于多少?” , A 同样有办法欺骗 B 。
5. 随机性方法在数据通信中的应用
问题• 已知: A 和 B各有一个文本文件,并且 A 和 B 之
间通过一条可靠(但昂贵)的通讯线路连接。
• 目标: A 和 B 需要比较他们的文本文件是否相同。
• 要求:在 A 与 B 之间通讯的数据量尽量少。
• 方法:?
问题
This is my document … This is my document …
1001011101 … 1001011101 …
A B
?
问题• 已知: A 和 B各有一个二进制序列(二进制数),
并且 A 和 B 之间通过一条可靠(但昂贵)的通讯线路连接。
• 目标: A 和 B 需要比较他们的二进制序列(二进制数)是否相同。
• 要求:在 A 与 B 之间通讯的数据量尽量少。
• 方法:?
方法 1
( 确定性的方法 )
• A 和 B事先约定好, A 只向 B传输二进制序列的某些位(比如,奇数位)。
• B 接收到 A传来的数据后,依序跟自己序列的相应位(奇数位)位比较。
方法 1 的缺点• 有时候,方法 1 能检测出 A 与 B 数据的不一致。
• 有时候,方法 1 不能检测出 A 与 B 数据的不一致。
A: 1011010
B: 1011110
A: 1011010
A: 1111010
方法 1 的缺点
• 条件:假设 A 与 B 的二进制序列长度为 n ,选取传输位的方法为确定性的方法且传输位的总位数小于 n 。
• 结论:则总存在某些情况,使得 A 与 B 之间数据的不一致性永远无法得到检测(检测出数据不一致性的概率为 0 )。
方法 2
( 随机性的方法 )
• A 随机地向 B传输二进制序列的某些位。
• B 接收到 A传来的数据后,依序跟自己序列的对应位比较。
方法 2 的缺点• 对于 A传送的每一个比特位,都需要附加
相应的信息,来表示该比特位对应 A 数据的哪一位。
• 该方法能成功地检测 A 与 B 数据不一致的概率较低。假设只传输 100 个比特位,成功验证两个长度为 100000 的比特序列是否一致的概率小于 0.1% 。
方法 2 的缺点• 假设 A 与 B 的二进制序列长度为 n ,且其
中只有一个比特位不一致。
• 如果 A 随机地向 B传送 k比特的数据,则用方法 2 能成功地检测出这种不一致性的概率为: / = k/n 。
k
n
1
1
k
n
方法 3
• 思想:采用传输数据指纹( fingerprint )的方法。 A向 B传送 A 数据的指纹, B核对该指纹是否与自己数据的指纹一致。
• 一个数据的数据指纹中包含原数据的特征信息。
• 我们前面已经提到了, A 和 B 的数据都可以看成是二进制序列(二进制数)。
• 最简单的生成数据指纹的方法:对于一个二进制数 n ,其指纹为“ n (mod p)” 其中 p 为一个质数。
数据指纹的例子• 为了直观起见,我们用十进制数来解释数
据指纹,二进制数的指纹类似。
• 假设, n = 8928 ,选取 p = 23 :8929 (mod 23) = 4 意味着 8929 在“ mod 23” 操作下的数据指纹为 4 。
方法 2.9999
假定 A 和 B 的数据分别为 xA 和 xB (位数为n )
• A 随机选取一个质数 p (位数最多为 m ),A向 B 发送 xA (mod p) 。
• B 接收到指纹后,核对 xA (mod p) = xB (mod p) 是否成立。
方法 3
假定 A 和 B 的数据分别为 xA 和 xB (位数为n )
• A 随机选取一个质数 p (位数最多为 m ),A向 B 发送 xA (mod p) 和 p 。
• B 接收到指纹后,核对 xA (mod p) = xB (mod p) 是否成立。
方法 3 --- 例子
A:8928
mod 23
4
B:8928
mod 23
4(4, 23)
=?
A: 8928
mod 23
4
B:8944
mod 23
20(4, 23)
=?
方法 3 --- 例子• 如果 B 的数据为 8928
+23*k, 用方法 3 都会“出错”。
• 下面我们来分析一下方法 3 出错的概率。
A:8928
mod 23
4
B:8951
mod 23
4(4, 23)
=?
方法 3 --- 分析为了区分 xA 和 xB (xA≠xB) ,我们随机地选取一个质数 p ,进行“ mod p” 操作:
• 如果 p | |xA-xB| , 则 xA ≠ xB (mod p) 。即:p 能将 xA 和 xB区分开来。
• 如果 p | |xA-xB| , 则 xA = xB (mod p) 。即:p 不能将 xA 和 xB区分开来。
方法 3 --- 分析Fact #1: 小于等于 n 的数中大约有 n / ln(n) 个质数。Fact #2: 如果 x ≤ 2n ,则 x 最多有 n 个不同的质因数。
P[failure]= (|xA-xB| 的质因数的个数 ) / (1 到 2m 之间的质数的个数 )< n / (2m / ln(2m))
例如, n=100000 , m=32 : P[failure] ≈ 10-3
假设只传输 64 个比特位,成功验证两个长度为 100000的比特序列是否一致的概率大概是 99.9% 。我们还可以通过“重复进行随机试验”的方法提高成功的概率。
6. 随机性方法在图论中的应用
图• 定义图 G = (V, E) ,其中 V 为顶点的集合,
E 为边的集合。例如,
连通图• 在图 G = (V, E) 中, p1, p2, …, pn叫做从 v
到 v’ 的路径,当且仅当 p1=v, pn=v’ , (pi, pi
+1) E∈ ( 1 ≤ i ≤ n-1 )。
• 图 G = (V, E)被称为是连通图,当且仅当对任意的 v, v’ V∈ ,都存在从 v 到 v’ 的路径。
连通度• 已知一个连通图 G = (V, E) ,如果至少需
要从 G 中去掉 c 条边才能使 G 变为非连通图,则 c称为 G 的连通度 (connectivity) 。
研究连通度的意义• 假设我们用图来表示一个局域网:顶点表示局域网中的计算机,边表示计算机之间的物理连接。则,连通度在一定程度上表示该局域网的可靠程度。
• 假设我们用图来表示一个交通网络:顶点表示城市,边表示城市之间的公路。则,连通度在一定程度上表示该交通网络的抗阻塞能力。
计算连通度的算法• 计算图连通度的确定性算法是基于网络流
(network flow) 的方法。该算法复杂,而且效率低。
• 目前,计算图连通度常用算法是一种随机算法。和确定性的算法相比,该方法不仅简单,而且效率较高。
计算连通度的随机性算法connectivity(G) //G=(V, E)
while(|V|≠2)
choose an edge (x, y) at random in G;
// 在 G 中随机选择一条边 (x, y)
contract (x, y);
//聚合边 (x, y)
return |E|;
分析• 给定一个图 G = (V, E) ,重复执行 connecti
vity(G) kn2 次之后,算法“出错”的概率小于 (1/e)k ( 其中 n 为图 G 的顶点数, e 为自然对数的底 ) 。
• Nick Harvey: “The Best Algorithms are Randomized Algorithms” @University of Waterloo, 2010.
总结• 基于随机性的方法是计算机领域中常用的
解决问题的方法。
• 我们列举了随机性在以下几个方面的应用:设计协议、数论、密码学、数据通信、图论。