OMSCS-GA课程笔记05-Randomized Algorithms
这个系列是Gatech OMSCS 高级算法课程(CS 6515: Intro to Grad Algorithms)的同步课程笔记。课程内容涉及动态规划、随机算法、分治、图算法、最大流、线性规划以及NP完备等高级算法的设计思想和相关应用,本节主要介绍随机算法。
随机算法在密码学中有着非常重要的应用。

Modular Arithmetic
在介绍随机算法与密码学的关系前我们需要先来引入模算数(modular arithmetic)的相关概念。对于整数

以除数3为例,通过取模运算可以定义3个同余等价类。

Basic Fact
同余的一个基本性质是如果

Modular Exp
模算数的一个重要应用是计算指数的余数。对于n-bit整数

上述算法的复杂度依赖于


Multiplicative Inverse
我们定义mod运算的逆为满足

需要注意的是并不是所有的整数都存在逆。

实际上当且仅当




GCD
因此计算mod的逆就归结于计算

基于欧几里得定理可以得到计算最大公约数的算法,其复杂度为
1
2
3
4
5
6
Euclid(x, y):
if y == 0:
return x
else:
return Euclid(y, x mod y)


这样就可以计算mod的逆,其复杂度为
1
2
3
4
5
6
7
Ext-Euclid(x, y):
if y == 0:
return (x, 1, 0)
else:
d, alpha', beta' = Ext-Euclid(y, x mod y)
return (d, beta', alpha' - x//y * beta')



RSA
Fermat’s Little Theorem
在模算数的基础上就可以介绍密码学中重要的RSA算法了,不过在此之前我们还需要引入费马小定理(Fermat’s little theorem)。它指出对于任意质数




Euler’s Theorem
欧拉定理(Euler’s theorem)是对费马小定理的推广,它指出互质的整数

如果我们进一步令


RSA Idea
RSA算法的基本思想是利用欧拉定理来对

Cryptography Setting
在密码学中最常见的一类场景是公开密钥加密(public-key cryptography)。此时数据发送方通过加密函数e()
对信息进行加密,而接收方通过解密函数d()
进行解密,它们之间的直接通信都是加密后的消息e(m)
。同时接收方会公开公钥(public key),这样任何拥有公钥的人都可以加密,但只有数据接收方能够利用私钥(private key)进行解密。

RSA Protocols
因此数据接收方的任务在于计算公钥和私钥,然后公开公钥并保留私钥用来解密。为此它需要首先选择两个质数

对于数据发送方来说,它只需要先获取公钥

而当接收方需要进行解密时只需要利用私钥计算

RSA Pitfalls
使用RSA进行加密时需要注意的是保证原始数据gcd(y, N)
来破解

另一方面我们还希望原始数据

RSA Recap
总结一下目前为止的内容,整个RSA算法的流程如下:


Random Prime Numbers
整个RSA算法依赖于选取质数

要验证一个整数是否是质数则需要费马素性检验(Fermat primality test)。根据费马小定理,任意小于质数

可以证明任意合数都至少存在一个Fermat witness。

因此合数的因数一定是Fermat witness,称为trivial Fermat witness。而实际上Fermat witness不一定都是因数,此时则称其为non-trivial Fermat witness。只有trivial Fermat witness的合数称为Carmichael数(Carmichael number),在使用费马素性检验时它们的性质非常接近于质数,因此也被称为伪质数(pseudo primes)。不过Carmichael数非常少见,在简单情况下我们可以忽略它们的存在。


如果我们忽略Carmichael数的存在可以得到质数的检验算法:




Bloom Filters

Ball into Bins
假设我们有

要分析

在此基础上可以证明第

当
带入概率上界可以得到:

由于

利用上面的结论可以推导出


除了随机放置小球外,另一种放置小球的方式是每次随机选择两个盒子然后把小球放到

可以证明按照这种方式进行放置时

Chain Hashing
Hashing在现实生活中有着非常多的应用,比如说可以使用hashing作为容器来保存数据,此时我们需要回答的问题是容器中是否存在某个给定的元素

对于chain hashing这种数据结构,检测
- 使用
计算链表的编号 。 - 检测
是否在链表 中。
记

要提升查询的效率可以使用两个

Bloom Filter
Bloom滤波器(Bloom filter)是对chain hashing的一种改进,它可以实现

Bloom滤波器包括两个基本操作,插入insert(x)
以及查询query(x)
。

在实现时Bloom滤波器使用了一个大小为n的二进制数组。首先把数组的每一位都初始化为0,当我们需要插入

要提升系统的鲁棒性可以同时使用k个hashing函数。此时要进行插入和查询则需要同时检查数组的k个可能位置,当数组的k个位置上都为1时说明


显然k值对于假阳性的概率有着重要的影响,可以证明出现假阳性的概率约为



