后缀树与字符串复杂度:深入解析与应用
1. 引言
在密码学和序列分析领域,序列复杂度的衡量至关重要。流密码中的运行密钥密码是对一次性密码本的确定性近似,它为给定的种子或密钥 $K$ 生成最终周期性的序列 $s = (s_1, s_2, \cdots, s_n)$,其中 $s_i \in Z_m$,$1 \leq i \leq n$。然而,这种加密方式不再保证完美的安全性,因此人们致力于开发生成伪随机序列的算法。
为了衡量序列的随机性,我们可以使用统计量。统计量是一个函数 $\alpha$,它可以测量序列的某些属性,如二进制序列中最长间隙的长度或二进制导数的分布。如果能计算出统计量的分布,特别是其期望值 $E(\alpha)$,就可以通过丢弃那些 $\alpha(s)$ 与均值显著偏离的序列来区分随机序列和非随机序列。
另一个衡量序列随机性的概念是 Kolmogorov 复杂度,它将序列的随机性特征化为产生该序列的最小图灵机程序的编码长度。但遗憾的是,一般情况下序列的 Kolmogorov 复杂度是不可计算的,因此需要简化计算模型以获得可计算的复杂度度量。
有限状态机(FSM)是一类自动机,由有限状态集 $Q = {q_1, q_2, \cdots, q_m}$、转移函数 $\delta: Q \to Q$ 和输出函数 $\Delta: Q \to A$ 组成。FSM 是确定性有限自动机(DFA)的特殊实例,其中 $\delta$ 仅依赖于当前状态。反馈移位寄存器(FSR)是 FSM 的一个特殊类,具有重要的实际意义,因为它们可以直接在硬件中实现,并且是大多数数字电路设计的基础。
对于 FSR,序列 $s$ 的复杂度定义为生成 $s$ 的最小 FSR。当反馈多项式 $f(X)$ 被限制为线性多项式(度数最多为 1)时,著名的 Massey - Berlekamp 算法可用于在序列长度的多项式时间内确定 $m$ 和 $f(X)$,这样的机器被称为线性反馈移位寄存器(LFSR)。序列的线性复杂度或线性跨度 $L(s)$ 是指用线性反馈多项式生成给定序列 $s$ 所需的级数。
自然地,我们可以将 FSR 的反馈函数 $f(X)$ 扩展为任意度数的多项式。虽然线性情况很有吸引力,因为线性跨度可以直接计算,但计算高阶跨度的工作较少。设 $F_k(s)$ 是当 $f(X)$ 是度数最多为 $k$ 的多项式时序列 $s$ 的跨度,对于固定的序列长度 $n$,有 $F_0(s) \geq F_1(s) \geq \cdots \geq F_n(s)$,其中 $F_1(s) = L(s)$ 是 $s$ 的线性跨度。
下面通过一个表格来对比不同序列的线性跨度和跨度:
| 序列类型 | 长度 | 预期线性跨度 | 预期跨度 |
| ---- | ---- | ---- | ---- |
| 二进制序列 | $n$ | 约 $\frac{n}{2}$ | 约 $2\log n$ |
| de Bruijn 序列 | $63$ | 至少 $62$ | 至多 $12$ |
从表格中可以明显看出,反馈多项式的度数对序列生成所需的移位寄存器长度有显著影响。
2. 计算序列的跨度
2.1 先前的工作
Chan 和 Games 提出了一种计算序列二次跨度的算法。该算法通过反复求解线性方程组来确定反馈多项式的系数。对于长度为 $m$ 的移位寄存器,反馈多项式 $f(X)$ 是二次的,如果它可以写成特定的形式。
这个算法和 Massey - Berlekamp 算法一样,是一种在线算法,即它一次处理一个字符,并计算已读取部分序列的跨度。当出现差异时,移位寄存器的长度可能需要增加。对于线性跨度,只有当 $n_k < \frac{k}{2}$ 时,当前跨度才会改变,新的线性跨度为 $(k + 1) - n_k$。但对于二次情况,出现差异时应进行的适当增量是未知的,必须通过搜索可能的增量区间来找到。
Jansen 在他的论文中表明,$M’(s)$ 可以被表征为序列 $s$ 的有向无环单词图(DAWG)的一个属性。DAWG 是一个有限自动机,它可以识别 $s$ 的所有子串或子单词。如果 DAWG 中从起始顶点到出度至少为 2 的顶点的最长路径为 $k$,则 $M’(s) = k + 1$。然而,从 DAWG 中很难确定关于跨度的任何分析信息,因为一般来说枚举自动机是困难的。
2.2 模式匹配算法
模式匹配算法关注从给定文本 $Y$ 中查找和/或检索模式或子串 $w$ 的方法。如果要对文本 $Y$ 进行重复搜索,可以对 $Y$ 进行预处理并存储在特定的数据结构中,以提高搜索效率。Aho 等人提出了一种数据结构,可用于解决以下三个模式匹配问题:
- 给定文本 $Y$ 和模式 $w$,找到 $w$ 在 $Y$ 中的所有出现位置。
- 给定文本 $Y$,确定 $Y$ 中最长的重复子串。
- 给定两个文本 $Y_1$ 和 $Y_2$,确定同时是 $Y_1$ 和 $Y_2$ 子串的最长字符串。
在本文中,我们关注第二个问题的解决方案。他们提出的数据结构称为位置无关树,后来称为后缀树。
设 $w = w_1, w_2, \cdots, w_n, \$ 是长度为 $n + 1$ 的字符串,其中 $\$$ 是仅出现在位置 $n + 1$ 的唯一字符。那么 $w$ 中的每个位置都可以由 $w$ 的至少一个子串唯一标识,这些子串被称为 $w$ 的后缀。设 $u(i)$ 是唯一标识 $w$ 中位置 $i$ 的最短子串。将 $u(1), u(2), \cdots, u(n)$ 插入到树 $T(w)$ 中,该树称为 $w$ 的后缀树。后缀树 $T(w)$ 有 $n$ 个叶子,对应于 $w$ 的前 $n$ 个位置,树的边被标记,使得从根到表示位置 $i$ 的叶子的路径是 $u(i)$,其中 $1 \leq i \leq n$。后缀树的高度 $h(T(w))$ 是从根到某个叶子的最长路径的长度。
下面是一个后缀树的示例:
graph TD;
A[Root] --> B[0];
A --> C[1];
B --> D[1];
C --> E[0];
D --> F[0];
E --> G[1];
F --> H[1];
G --> I[1];
H --> J[0];
I --> K[0];
J --> L[1];
K --> M[$];
L --> N[$];
这个图展示了序列 $s = 010101110010\$$ 的后缀树。
序列 $s$ 的跨度大于 $k$ 当且仅当存在两个子串 $s_1 = s_i, s_{i + 1}, \cdots, s_{i + k - 1}$ 和 $s_2 = s_j, s_{j + 1}, \cdots, s_{j + k - 1}$,使得 $s_{i + l} = s_{j + l}$,$0 \leq l < k$,且 $s_{i + k} \neq s_{j + k}$。我们可以说子串 $s’ = s_i, s_{i + 1}, \cdots, s_{i + k - 1}$ 在 $s$ 中以两个不同的后继字符出现。因此,没有 $k$ 个变量的函数 $f(x_1, x_2, \cdots, x_k)$ 可以生成序列 $s$。
对于字符串 $w$,设 $LRS(w)$ 是 $w$ 中最长的重复子串,$|LRS(w)|$ 是其长度。可以观察到 $|LRS(w)| \leq h(T(w)) - 1$。实际上,有限序列的跨度和其最长公共子串的长度之间可能存在显著差异。
下面通过一个流程图来展示计算序列跨度的大致过程:
graph TD;
A[开始] --> B[构建后缀树];
B --> C[计算后缀树高度];
C --> D[确定跨度];
D --> E[结束];
定理 2.1 表明,序列 $s$ 的跨度等于从 $T(s)$ 的根到叶子 $u$ 的最长路径,其中 $u$ 的父节点至少有两个边未被 $\$$ 标记的子节点。这个定理建立了后缀树和序列跨度之间的重要联系,为后续的分析和计算提供了理论基础。
后缀树的结构取决于字符串给定后缀之间的重叠情况。对于后缀 $u(i)$ 和 $u(j)$,$1 \leq i \neq j \leq n$,我们可以定义一些统计量,如 $n$ 高度 $B_n$、$n$ 浅度 $h_n$ 和后缀树的平均深度 $D_n$。这些统计量可以直接通过后缀树计算,因为后缀树可以在 $O(n)$ 时间内使用线性 $O(n)$ 空间构建。
假设字符串的字符是从 $Z_p$ 中随机独立抽取的,当 $q_i = p^{-1}$ 时,字符串以均匀概率出现,这被称为 Bernoulli 模型。在 Bernoulli 模型下,对于大的 $n$,有 $E(H_n) \sim 2 \log_p n$,$E(h_n) \sim \log_p n$,$E(D_n) \sim \log_p n$。即使不假设 Bernoulli 模型,Apostolico 和 Szpankowski 仍然能够计算 $H_n$、$h_n$ 和 $D_n$ 的期望值。
通过以上内容,我们深入探讨了序列复杂度的衡量方法、不同类型反馈移位寄存器的特点以及后缀树与序列跨度之间的关系。这些知识对于密码学、序列分析和数据结构等领域的研究和应用具有重要意义。
2. 计算序列的跨度(续)
2.2 模式匹配算法(续)
后缀树的构建和分析为我们理解序列的复杂度提供了有力的工具。我们已经知道,后缀树的高度与序列的跨度有着紧密的联系。接下来,我们进一步探讨后缀树的一些性质以及如何利用这些性质来更好地理解序列的特征。
我们知道,后缀树中的字符串 $u(1), u(2), \cdots, u(n)$ 并非相互独立,它们可能存在重叠。而由插入 $n$ 个独立字符串 $v’(1), v’(2), \cdots, v’(n)$ 得到的搜索树是一种数字搜索树,称为字典树(trie)。字典树的性质已经得到了广泛的研究,特别是在从具有 $p$ 个符号的字母表中抽取 $n$ 个字符串构建的随机字典树中,其预期高度为 $2\log_p n + o(\log n)$。后缀树 $T(s)$ 的性质与使用长度为 $n$ 的字符串构建的后缀树的性质在渐近意义上是等价的。
为了更深入地分析后缀树,我们定义了一些统计量。设 $x_{ij}$ 为后缀 $u(i)$ 和 $u(j)$ 的最长公共前缀的长度,基于此我们可以定义以下统计量:
- $B_n$:$n$ 高度,对应于在 $n$ 个后缀上构建的后缀树的高度。
- $h_n$:$n$ 浅度。
- $D_n$:后缀树的平均深度。
这些统计量可以通过后缀树直接计算,因为后缀树可以在 $O(n)$ 时间内使用线性 $O(n)$ 空间构建。假设字符串 $s$ 的字符是从 $Z_p$ 中随机独立抽取的,且第 $j$ 个字符是 $p_i$ 的概率为 $q_i$,$0 \leq i \leq p - 1$。当 $q_i = p^{-1}$ 时,即字符串以均匀概率出现,这就是 Bernoulli 模型。在 Bernoulli 模型下,对于大的 $n$,有以下关系:
- $E(H_n) \sim 2 \log_p n$
- $E(h_n) \sim \log_p n$
- $E(D_n) \sim \log_p n$
下面通过一个表格来展示这些统计量在不同情况下的预期值:
| 统计量 | Bernoulli 模型下预期值 | 非 Bernoulli 模型下预期值 |
| ---- | ---- | ---- |
| $H_n$ | $2 \log_p n$ | 当 $q_i$ 不相等时,$E(H_n)$ 会变大,大 $n$ 时,$E(H_n) \sim 2 \log_{q_{max}} n$ |
| $h_n$ | $\log_p n$ | 可由 Apostolico 和 Szpankowski 的方法计算 |
| $D_n$ | $\log_p n$ | 可由 Apostolico 和 Szpankowski 的方法计算 |
对于二进制序列,Jansen 计算了长度高达 22 的所有序列的跨度,其经验平均值接近 $2\log_2 n$,这与 $E(H_n)$ 相符。其他对 $E(H_n)$ 的估计也有得到,但从后缀树推导似乎是最可靠的方法。
2.3 反馈多项式的预期大小
除了序列的跨度,反馈多项式的大小也是一个重要的研究点。我们已经知道,对于线性情况,反馈多项式的大小由线性跨度本身界定。但当 $f(X)$ 不受限制时,$f(x)$ 的大小可能是跨度的指数函数。
下面我们通过理论和实验两个方面来分析反馈多项式的预期大小。
-
理论分析
:从数学角度来看,当反馈多项式的度数增加时,其可能的组合数量会呈指数级增长。因为对于一个 $k$ 度的反馈多项式,其系数的不同取值组合构成了一个庞大的搜索空间。例如,一个二次反馈多项式的系数求解就涉及到多个变量的组合,随着度数的升高,这个组合的复杂度会急剧上升。
-
实验验证
:通过对不同长度和类型的序列进行实验,我们可以观察到反馈多项式大小的实际变化情况。实验结果表明,随着序列长度的增加和反馈多项式度数的提高,反馈多项式的大小确实呈现出指数增长的趋势。
下面通过一个图表来展示反馈多项式大小随跨度的变化趋势:
graph LR;
A[跨度较小] --> B[反馈多项式大小较小];
C[跨度较大] --> D[反馈多项式大小指数增长];
这种反馈多项式大小的指数增长解释了为什么在使用任意反馈的移位寄存器时,虽然移位寄存器的内存需求大幅减少,但却需要在反馈多项式中编码更多关于序列的信息。
3. 总结与启示
通过对后缀树和字符串复杂度的深入研究,我们得到了许多有价值的结论。
首先,反馈多项式的度数对序列生成所需的移位寄存器长度有显著影响。线性跨度和跨度之间存在巨大差异,这表明允许更高阶的反馈多项式可以大大减少移位寄存器的内存需求。例如,对于长度为 $10^6$ 的二进制序列,预期线性跨度约为 500,000,而预期跨度小于 50。
其次,后缀树为我们提供了一种有效的工具来分析序列的复杂度。通过后缀树,我们可以计算序列的跨度以及相关的统计量,这些统计量可以帮助我们区分随机序列和非随机序列。例如,在 Bernoulli 模型下,后缀树的高度、浅度和平均深度都有明确的渐近预期值,这些值可以作为判断序列随机性的参考。
最后,反馈多项式的大小在非线性情况下可能是跨度的指数函数。这意味着在设计数字电路时,我们需要在移位寄存器的内存需求和反馈多项式的存储需求之间进行权衡。
在未来的研究中,我们可以进一步探索如何更高效地计算高阶跨度,以及如何利用后缀树的性质来设计更安全的密码系统。此外,对于反馈多项式的存储和优化也是一个值得深入研究的方向。
总之,后缀树和字符串复杂度的研究为密码学、序列分析和数字电路设计等领域带来了新的思路和方法,具有广阔的应用前景。
69

被折叠的 条评论
为什么被折叠?



