Fingerprinting
给定 $n$ 位二进制序列 $a$ 和 $b$ ,判断它们是否相等。
确定性算法时间复杂度为 $O(n)$ 。
一种随机算法是检查它们的压缩是否相等,即模一个素数 $p$ 是否同余。
一个经典结论是,小于等于 $T$ 的素数个数约为 $\frac{T}{\ln T}$ 。
首先,正确率取决于素数的取值范围,显然 $T$ 应该远小于 $x$ 和 $y$ 本身,因为是在做压缩。
定义 $\pi(T)$ 为小于等于 $T$ 的素数个数。
由于 $|a-b|$ 的素因子个数不超过 $\log_{2}|a-b| \leq n$ 个,因此 $a \equiv b (\mathrm{mod} \ p)$ 的概率不超过 $\frac{n}{\pi(T)}$ 。
当 $T$ 设置得较大时,出错的概率就会很小,此时时间复杂度为 $O(\log T)$ ,因为是从计算机传输位数的角度考虑的。
接着,如果要在长序列中找是不是包含长度为 $m$ 的短序列 $y’$ 。
则随机找一个素数 $p$ ,对长序列中 $n-m+1$ 个片段分别做指纹匹配,发生指纹碰撞的概率最多为 $\frac{m \ln T}{T}$ 。
根据 Union Bound, $Pr[error] \leq (n-m+1) \times \frac{m \ln T}{T} \leq \frac{nm \ln T}{T}$ ,再使用滚动哈希,时间复杂度为 $O(n+m)$ 。
一点群论
群:有限集合,二元运算具有结合律,单位元,逆元。
群的例子:模素数群
子群:二元运算在子集中封闭,单位元在子集中,任意子群中元素的逆元也在子群中。
拉格朗日定理:子群的大小整除于群的大小。
拉格朗日定理的证明:
设 $G$ 是一个有限群,阶数为 $|G| = n$ 。设 $H$ 是 $G$ 的一个子群,阶数为 $|H| = m$ 。 我们需要证明 $m$ 能够整除 $n$ 。这个证明的核心思想是利用 陪集(Coset) 将整个群 $G$ 进行均匀划分。
-
定义左陪集: 对于群 $G$ 中的任意元素 $g$ ,我们定义 $H$ 的一个左陪集为 $gH = \{gh \mid h \in H \}$ 。
-
性质一:所有左陪集的大小都等于 $H$ 的大小。 我们要说明集合 $H$ 和集合 $gH$ 的元素个数一样多。考虑映射 $f: H \to gH$ ,定义为 $f(h) = gh$ 。 一方面,由定义可知映射是满射。 另一方面,群元可以消去:若 $gh_1 = gh_2$ ,在等式左边同乘 $g^{-1}$ 可得 $h_1 = h_2$ ,因此映射是单射。 所以 $f$ 是双射,即对于任意 $g \in G$ ,都有 $|gH| = |H| = m$ 。
-
性质二:任意两个左陪集要么完全相同,要么完全不交(互斥)。 假设有两个陪集 $aH$ 和 $bH$ 之间有交集,说明存在某些元素既在 $aH$ 中又在 $bH$ 中。
设这个交集元素为 $x$ ,那么自然存在 $h_1, h_2 \in H$ 使得 $x = ah_1 = bh_2$ 。
由此可以得到 $a = bh_2h_1^{-1}$ 。
现在拿这个 $a$ 去看 $aH$ 里的任意元素 $ah$:
$ah = (bh_2h_1^{-1})h = b(h_2h_1^{-1}h)$
因为 $H$ 是群,满足封闭性,所以 $h_2h_1^{-1}h$ 必定也属于 $H$ 。这说明 $aH$ 的每一个元素都属于 $bH$,即 $aH \subseteq bH$ 。
同理可证 $bH \subseteq aH$ ,因此只要两个陪集有交集,它们就必定完全相等 ( $aH = bH$ )。
-
性质三:所有左陪集的并集等于整个群 $G$。 群 $G$ 中的每一个元素 $g$ ,都必定属于至少一个陪集。因为子群 $H$ 必然包含单位元 $e$ ,所以 $g = ge \in gH$ 。
总结: 群 $G$ 中的每一个元素都被恰好分配在了一个左陪集当中(性质三),并且不同的左陪集之间绝对没有重叠(性质二),这意味着左陪集构成了对群 $G$ 的一个划分。
由于每一个左陪集包含的元素个数都完全一样,正是 $m$ 个(性质一),假设我们划分出了 $k$ 个互不相同的左陪集,那么就有:
$$|G| = k \times |H|$$
即 $n = k \times m$
所以,子群 $H$ 的阶数 $m$ 必然整除群 $G$ 的阶数 $n$ 。证明完毕。
Primality Testing
输入一个数 $n$ ,请判断它是否为素数。
首先回顾一下Miller-Rabin算法,这是一种密码学中非常常见的用于判定素数的随机算法。
我们熟知的是费马小定理,即 $p$ 为素数,且 $p$ 不整除整数 $a$ ,则有 $a^{p-1} \equiv 1 (\mathrm{mod} \ p)$
但是很多合数也可能满足这个式子,称它们为伪素数。
Miller-Rabin使用了一个更强的性质,也就是设 $n-1=2^{s} \cdot d$ 。
若 $n$ 是素数,则对于任意 $a$ ,以下其中之一成立:
- $a^{d} \equiv 1 (\mathrm{mod} \ n)$
- 存在 $0 \leq r < s,a^{2^{r}d} \equiv -1(\mathrm{mod} \ n)$
首先处理简单情况并分解,再随机选择底数 $a,2 \leq a \leq n-2$ ,计算 $x=a^{d} \ \mathrm{mod} \ n$ ,若 $x=1$ 或 $x=n-2$ 则本轮测试通过。
若不通过,则重复 $s-1$ 次 $x=x^2 \ \mathrm{mod} \ n$ ,若出现 $x=n-1$ ,则本轮通过,若始终未出现,则 $n$ 为合数。
对于不同 $a$ ,重复多轮测试,若都通过,则 $n$ 很可能是素数。
若 $n$ 是合数,每次测试将其误判的概率小于等于 $\frac{1}{4}$ ,因此多次测试后错误率呈指数级下降。
对于时间复杂度,第一次算出 $a^d$ 的时候可以采用快速幂算法,因此时间复杂度为 $O(\log n)$ 。
但是,对于密码学中通常使用大整数乘法,因此设大整数乘法的时间复杂度为 $M(\log n)$ ,总的时间复杂度为 $O(k \cdot O(\log n) \cdot M(\log n))$ 。
回到原题,考虑一个随机抽取 $a \in U_{1,2,\ldots,n-1}$ ,判断 $a,n$ 是否互素,若不是则输出 $n$ 不是素数。
然后检查 $a^{n-1} \equiv 1 (\mathrm{mod} \ n)$ 。
但是存在一种数称为 Carmichael Number,如果它是合数,且对于任意与 $n$ 互素的 $a,a^{n-1} \equiv 1(\mathrm{mod} \ n)$ 。
则前一个算法对它失效。
我们先来分析不考虑 Carmichael Number时的算法,设 $G$ 是所有与 $n$ 互素的数, $H$ 是 $\{a|a^{n-1} \equiv 1 \ \mathrm{mod} n,(a,n)=1 \}$ 。
则错误率为 $\frac{|H|}{|G|}$ 。
显然这是真子群(因为定义它不是Carmichael Number),由拉格朗日定理,错误率小于等于 $\frac{1}{2}$ 。
我们首先引入以下定理:当 $p$ 是素数,那么模 $p$ 意义下对 $p$ 开根号只有正负一两个平凡解,如果找到非平凡解,则 $p$ 不为素数。
随后给出以下算法:
- 如果 $p$ 是偶数或者某个素数的幂次,输出“合数”
- 分解 $p - 1 = 2^\omega O$ 为奇数 $O$ 乘以 $2$ 的幂次的形式
- 随机抽 $a \sim U_{[p-1]}$
- 如果 $p$ 和 $a$ 不互素,输出“合数”
- 计算序列 $a^{2^0 O}, a^{2^1 O}, \cdots, a^{2^\omega O}$
- 输出“合数”,如果
- 最后一项不是 $1$ , $a^{p-1} = a^{2^\omega O} \neq 1 \quad \cdots, \cdots, 3$
- 存在一项不是 $\pm 1$ ,且其平方(后一项)是 $1$ ,即找到非平凡根号 $1 \quad \cdots, 3, 1, \cdots, 1$
- 否则,输出“素数” $\quad \cdots, \cdots, -1, 1 \cdots, 1$
- 输出“合数”,如果
上述需要补充的是,可以在 $O(\log^2 n)$ 的复杂度内,确定一个数是否是 $p^k$ ,因为 $k < O(\log n)$ ,因此每次二分 $p$ 即可。
接着问题就很自然地出来了,如何计算这个算法的正确率?
对于合数 $p$(包括 Carmichael 数),单次迭代错判其为素数的概率都不超过 $\frac{1}{2}$ 。我们可以通过群论(拉格朗日定理)和中国剩余定理(CRT)来进行严格证明。
定义群 $G$ 和子群 $H$
只需考虑满足 $(a, p) = 1$ 的这些经过初步筛选的数字(若 $(a,p)\neq 1$,算法直接判定为合数,不犯错)。
- 群 $G$: $G = \{a \mid (a,p) = 1 \}$,即模 $p$ 意义下所有与 $p$ 互素的元素构成的乘法群。
- 寻找最大指数 $s^{*}$: 在算法序列的指数集合 $\{O, 2O, 2^2O, \cdots, 2^\omega O \}$ 中,找到最大的一个幂次 $s^{*}$,使得方程 $\exists x, x^{s^{*}} \equiv -1 \pmod p$ 成立。(如果 $p$ 能通过测试,序列中必然要出现 $-1$ 或者一开始就是 $1$)。
- 子群 $H$: $H = \{a \mid (a,p) = 1, \ a^{s^{*}} \equiv \pm 1 \pmod p \},H$ 是 $G$ 的一个子群。所有能够骗过算法、让算法输出“素数”的强伪素数底数 $a$,都必然包含在集合 $H$ 中。只要证明 $H$ 是 $G$ 的真子群,结论自然得出。
核心证明:证明 $H$ 是真子群(构造法)
我们需要构造出一个元素 $a \in G$,使得它不在 $H$ 中(即满足 $a^{s^{*}} \not\equiv \pm 1 \pmod p$)。
- 分解 $p$:
因为 $p$ 是合数,且算法排除了偶数和素数的幂次,所以 $p$ 一定可以分解为两个互素的因数乘积,即 $p = p_1 p_2$,其中 $(p_1, p_2) = 1$ 。
- 提取已知条件:
存在 $x$ 使得 $x^{s^{*}} \equiv -1 \pmod p$ 。这意味着在模 $p_1$ 和 $p_2$ 下,也有 $x^{s^{*}} \equiv -1 \pmod{p_1}$ 和 $x^{s^{*}} \equiv -1 \pmod{p_2}$ 。
- 构造元素 $a$:
中国剩余定理 (CRT) 回顾: 假设整数 $m_1, m_2, \dots, m_k$ 两两互素,则对于任意整数 $a_1, a_2, \dots, a_k$,同余方程组
$$ \begin{cases} x \equiv a_1 \pmod{m_1} \\ x \equiv a_2 \pmod{m_2} \\ \vdots \\ x \equiv a_k \pmod{m_k} \end{cases} $$
在模 $M = m_1 m_2 \dots m_k$ 下有唯一解。
根据上述的中国剩余定理(CRT),由于 $(p_1, p_2) = 1$ ,我们可以构造出唯一的 $a \in [0, p-1]$ 满足以下方程组:
$$ \begin{cases} a \equiv x \pmod{p_1} \\ a \equiv 1 \pmod{p_2} \end{cases} $$
由于 $(x, p_1)=1$ 且 $(1, p_2)=1$ , $a$ 与 $p$ 必然互素,所以 $a \in G$ 。
验证 $a \notin H$:
计算 $a^{s^{*}}$:
- 在模 $p_1$ 下: $a^{s^{*}} \equiv x^{s^{*}} \equiv -1 \pmod{p_1}$
- 在模 $p_2$ 下: $a^{s^{*}} \equiv 1^{s^{*}} \equiv 1 \pmod{p_2}$
如果 $a^{s^{*}} \equiv 1 \pmod p$ ,根据同余的性质,大模数下同余,小模数(因数)下必然也同余,所以必须要满足 $a^{s^{*}} \equiv 1 \pmod{p_1}$ 。但我们刚刚算出来它实际是 $-1 \pmod{p_1}$ ,这要求 $1 \equiv -1 \pmod{p_1}$ ,即 $p_1$ 整除 $2$ 。但 $p$ 是奇数,$p_1$ 也是大于等于 $3$ 的奇数,不可能整除 $2$,矛盾!
如果 $a^{s^{*}} \equiv -1 \pmod p$ ,同理必须要满足 $a^{s^{*}} \equiv -1 \pmod{p_2}$ 。但我们刚刚算出来它实际是 $1 \pmod{p_2}$ ,这同样要求 $1 \equiv -1 \pmod{p_2}$ ,即 $p_2$ 整除 $2$ ,这与 $p_2$ 也是奇数矛盾!
因此结论是 $a^{s^{*}} \not\equiv 1 \pmod p$ 且 $a^{s^{*}} \not\equiv -1 \pmod p$ 。
这个构造出来的 $a \in G$ 且 $a \notin H$,证明了 $H$ 是 $G$ 的真子群 ( $H \subsetneq G$ )。
使用拉格朗日定理得出错误率
根据拉格朗日定理,既然 $H$ 是 $G$ 的真子群,则必然有 $|G| \ge 2|H|$,即 $|H| \le \frac{1}{2}|G|$。
由于所有让算法“误判”的底数 $a$ 都属于 $H$,而我们是从全局中均匀随机抽取 $a$ 的,因此抽到骗子底数 $a$ 的错误概率满足:
$$ Pr[error] \le \frac{|H|}{|G|} \le \frac{1}{2} $$
Probabilistic Method
是信概统中学过的方法,终于来到我们略懂的领域了~
对于顶点个数为 $n$ 的完全图,当 $n \leq 2^{\frac{k}{2}}$ 时,存在边的二染色方案使得任何一个 $k-$ 完全子图都不是单色的。
边的二染色方案:每条边涂上两种颜色的其中一个。
$k-$ 完全子图:随机选出 $k$ 个人和他们之间的边。
考虑每条边随机掷硬币染色,证明随机染色方案包含单色的 $k-$ 完全子图的概率小于1。
对所有的 $\dbinom{n}{k}$ 个 $k-$ 完全子图进行Union Bound即可,甚至是信概统例题。
给定任意图 $G=\langle V,E \rangle$ ,存在一个割的大小 $\geq \frac{|E|}{2}$ 。
割的定义:将顶点分为两个集合,连接两个集合的边的边集。
对每个点进行抛硬币,单条边被割开的概率为 $\frac{1}{2}$ 。
所有边被割开的期望是 $E(X)=\frac{|E|}{2}$ 。
根据数学常识,必然存在一个割的大小 $\geq \frac{|E|}{2}$ 。
给定任意图 $G=\langle V,E \rangle,$ 存在一个独立集的大小 $\geq \sum_{v} \frac{1}{deg(v)+1}$ 。
给每个点随机赋实数值,如果一个点是自己和所有邻居的最小值,那么它被选入独立集。
显然不会选到相邻的点,同时点 $v$ 被选入的概率为 $\frac{1}{deg(v)+1}$ ,于是得证。