“还有一个重要用途是本原根。如果同一个词既是长度 $p$ 块的整数次幂,又是长度 $q$ 块的整数次幂,整块重复提供足够长的重叠。周期引理会迫使它们服从共同的更短块,从而保证最短根唯一。”
日志 bbaabbaabbaa 长十二,可以压成“bbaa 重复三次”。如果还允许根本身继续重复,abababab 就既能写成 ab 的四次幂,也能写成 abab 的平方。为了让这个压缩说明唯一,需要一直拆到根不能再拆为止。
本原根是最短的完整重复块,而不是把记录截断后仍能解释它的最短周期块。两者在 abababa 上不同:周期二解释了错位相等,但任何较短块都不能整数次拼成七个字符。
形式陈述
哪些词已经不能再拆
对非空词
a、ab、aba、bbaa 都是本原词。单个字符没有更短的非空根;aba 虽然首尾都有 a,长度三也不容许用 a 或 ab 整块拼成。aaaa 与 abab 则分别是 a 的四次幂和 ab 的平方。
每个非空词都能写成
存在性不难:在所有完整重复根中选最短的那个。至少
直觉
为什么最短根是唯一的
假设
令
Fine–Wilf 引理说明
这还说明所有完整根的长度都是本原根长度的倍数。若
例子与边界
边界与迁移
空词被排除,因为
本原性对旋转保持不变。如果一个旋转等于 bbaa 与 aabb 都本原,且互为旋转。
最后自行核验 abcabcabcabc、abcab 与 aaaaa。答案依次是 abc 的四次幂、整串的一次幂、a 的五次幂。给第二个答案时,应同时报告最短周期三并解释
推论与应用
从最短周期得到本原根
先用前缀函数算
这是最短周期。若
第二个分支值得证明,不能只当口诀。假设
对于 bbaabbaabbaa,前缀函数为
最后一项为八,bbaa、指数三。对 abababa,
def primitive_root(s):
if not s:
raise ValueError("the empty word has no primitive root")
pi = [0] * len(s)
for i in range(1, len(s)):
j = pi[i - 1]
while j and s[i] != s[j]:
j = pi[j - 1]
if s[i] == s[j]:
j += 1
pi[i] = j
p = len(s) - pi[-1]
if len(s) % p:
p = len(s)
return s[:p], len(s) // p
循环不变量和线性比较次数由前缀函数的失败链证明提供;本页新增的逻辑是最后的整除分支及其正确性。算法使用
两块可以交换,意味着什么
一般连接不满足交换律:ab 接 a 得 aba,交换后是 aab。不过两个非空词满足
“同根所以交换”直接来自指数相加。反向可以模仿欧几里得算法。若
例如 abab 和 ab 相交换,第一步消去一个 ab,剩下 ab 与 ab。这个结论用于排除“看似不同、实际同一重复块”的歧义;它并不说任何有共同前缀的两块都能交换。
参考资料
- [1] M. Lothaire, Combinatorics on Words, Cambridge University Press, 1997,§1.3:交换、共轭、本原词与唯一根。
- Štěpán Holub, Martin Raška and Štěpán Starosta, Combinatorics on Words Basics, Archive of Formal Proofs,CoWBasic 的 commutation、primitive root 与 power 结果。
- N. J. Fine and H. S. Wilf, “Uniqueness Theorems for Periodic Functions”, 1965,DOI:两周期合并的依据。