Skip to content

定义Definition

本原词与唯一重复根

Primitive word · Primitive root of a word · 本原字 · 字符串本原根

不能写成更短非空词的二次或更高整数幂的词称为本原词;每个非空词都能唯一写成本原根的正整数幂。

日志 bbaabbaabbaa 长十二,可以压成“bbaa 重复三次”。如果还允许根本身继续重复,abababab 就既能写成 ab 的四次幂,也能写成 abab 的平方。为了让这个压缩说明唯一,需要一直拆到根不能再拆为止。

本原根是最短的完整重复块,而不是把记录截断后仍能解释它的最短周期块。两者在 abababa 上不同:周期二解释了错位相等,但任何较短块都不能整数次拼成七个字符。

形式陈述 ​

哪些词已经不能再拆 ​

对非空词 u 和整数 k≥1,uk 表示连接 k 份 u。非空词 s 若不存在 s=uk、k≥2,就称为本原词。

a、ab、aba、bbaa 都是本原词。单个字符没有更短的非空根;aba 虽然首尾都有 a,长度三也不容许用 a 或 ab 整块拼成。aaaa 与 abab 则分别是 a 的四次幂和 ab 的平方。

每个非空词都能写成

s=rk,r 本原,k≥1.

存在性不难:在所有完整重复根中选最短的那个。至少 s 自己就是一个根;如果所选根还可拆,就能继续缩短,与最短性矛盾。真正需要证明的是不同拆法最后不会落到两个不同的本原根。

直觉

为什么最短根是唯一的 ​

假设 s=ua=vb,而 u,v 都本原。若 a=1,则 s=u 已经本原,只能有 b=1,于是 u=v;另一边同理。因此只需考虑 a,b≥2。

令 p=|u|,q=|v|,n=|s|。二者都是 s 的周期,且 p,q≤n/2,所以

n≥p+q≥p+q−gcd(p,q).

Fine–Wilf 引理说明 d=gcd(p,q) 也是周期。由于 d 整除 p,q,前缀 u 和 v 都是同一个长 d 块的整数次幂。它们本原,迫使 p=q=d,而它们又是 s 的等长前缀,所以 u=v。根的长度相同后,指数 a=b=n/p 也确定了。

这还说明所有完整根的长度都是本原根长度的倍数。若 s=tm,先把 t 拆成本原根 r′ 的幂,那么 s 也成为 r′ 的幂,唯一性迫使 r′=r。它不是只保证“最短长度唯一”,还保证内容和所有更长根的结构。

例子与边界

边界与迁移 ​

空词被排除,因为 εk=ε 对任意正整数 k 都成立,指数失去唯一性。允许空词作为根还会把所有长度论证破坏;本页的实现因此直接拒绝空输入。

本原性对旋转保持不变。如果一个旋转等于 vk,把切口移回去,只会把重复块 v 也旋转,原串仍是某个同长度块的 k 次幂。这为循环移位等价类提供了稳定的属性。但不同旋转的本原根内容可以不同,例如 bbaa 与 aabb 都本原,且互为旋转。

最后自行核验 abcabcabcabc、abcab 与 aaaaa。答案依次是 abc 的四次幂、整串的一次幂、a 的五次幂。给第二个答案时,应同时报告最短周期三并解释 3∤5;给第三个答案时,应注意不同起点虽然有五个,旋转得到的字符串却只有一种。后一种重复计数将在下一页解决。

推论与应用

从最短周期得到本原根 ​

先用前缀函数算

p=n−π[n−1].

这是最短周期。若 p∣n,则 s=(s[0:p])n/p;这个根必本原,否则还能得到更短周期。若 p∤n,本原根就是 s 自己,指数为一。

第二个分支值得证明,不能只当口诀。假设 p∤n,但 s 仍有一个真完整根,长度为 q∣n、q≤n/2。最短周期满足 p≤q,因此长度条件足够,Fine–Wilf 给出周期 gcd(p,q)≤p。最短性迫使 gcd(p,q)=p,从而 p∣q∣n,与假设矛盾。所以不存在真完整根。

对于 bbaabbaabbaa,前缀函数为

[0,1,0,0,1,2,3,4,5,6,7,8].

最后一项为八,p=12−8=4;四整除十二,输出根 bbaa、指数三。对 abababa,p=2 却不整除七,输出根仍是整串、指数一。两个分支都用到周期与整除,不能只保留其中一个条件。

python
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

循环不变量和线性比较次数由前缀函数的失败链证明提供;本页新增的逻辑是最后的整除分支及其正确性。算法使用 O(n) 时间和 O(n) 个整数单元,复制返回根还需 O(|r|) 个字符。若只返回长度和指数,可以不复制根,但前缀数组仍占线性空间。

两块可以交换,意味着什么 ​

一般连接不满足交换律:ab 接 a 得 aba,交换后是 aab。不过两个非空词满足 uv=vu,当且仅当它们是同一个非空词的幂。[1]

“同根所以交换”直接来自指数相加。反向可以模仿欧几里得算法。若 |u|≥|v|,从 uv=vu 的前 |v| 个字符看出 u=vx。代入并消去相同前缀,得到 xv=vx。当 x 非空时,问题总长度缩短,继续归纳;当 x 为空时,u=v,已经找到共同块。归纳返回的共同块同时生成 v 和 x,因此也生成 u=vx。

例如 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:两周期合并的依据。
关系图谱11 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例

类型化关系