循环元: 如果一个字符串S是由字符串T重复k次构成, 则称T是S的循环元, 长度最小的T称为S的最小循环元, 此时k最大
结论1: 字符串S[0...n - 1]有长度为len的循环元的充要条件是len整除n且S[0...n - 1 - len] = S[len...n - 1]. (该结论较易证明, 此处不再赘述证明过程)
结论2: 字符串S[0...n - 1]的所有循环元的长度必为其最小循环元长度的整数倍
证明: 假设字符串S的最小循环元为C[0...u - 1](u > 1), S存在循环元D[0...v - 1], v > u, , q > 0, 显然S至少由2个D连接而成, 且S至少由3个C连接而成, 且S[v...v + u - 1] = C[q]...C[u - 1]C[0]...C[q - 1] = C[0...u - 1], 也即如下等式组成立:
C[0] = C[q]
C[1] = C[q + 1]
......
C[u - 1- q] = C[u - 1]
C[u - q] = C[0]
......
C[u - 1] = C[q - 1]
根据上述等式组可得, 对所有0 <= i <= u - 1, 均有C[i] = C[(i + q) mod u], 设w为u和q的最大公约数, 如果w为1也即w和u互质, 那么C[0] = C[q mod u] = C[2q mod u] = ... = C[(u - 1)q mod u], 假设存在a, b满足: 0 =< a < b < u且aq mod u = bq mod u, 那么
u | (b - a)q, 又u与q互质, 则u | (b - a), 这显然与0 =< a < b < u矛盾, 因此0, q mod u, ..., (u - 1)q mod u两两不等,则C[0] = C[1] = ... = C[u - 1]这显然与C为最小循环元矛盾, 因此w = 1不成立, 应有w > 1.
设u = pw, w > 1, 考虑有C[i] = C[(i + q) mod u] = ... = C[(i + (p - 1)q) mod u], 0 <= i < w, 假设存在c,d满足: 0 <= c < d < p
且(i + cq) mod u = (i + dq) mod u, 那么u | (d - c)q, 故应有p | (d - c), 这显然与0 <= c < d < p矛盾, 故i, (i + q) mod u,...,(i + (p - 1)q) mod u两两不等. 另一方面, w | q, u = pw, 则u | pq, 故(i + pq) mod u i. 设集 = {C[i + jq] | 0 <= j < p}, 0 <= i < w
设T = k + jq = gu + z, (0 <= k < w, j >= 0, g >= 0, 0 <= z < u), 因为w | q, w | u, 则T = i + rw, u = tw, 则T = gtw + z
,T - gtw z mod w, 也即i z mod w, 这表明集 = {C[i + jw] | 0 <= j < p}, 也就是说w是C的一个循环元, 这显然与C为最小循环元矛盾, 因此w > 1亦不成立.
综上述, S存在循环元D[0...v - 1], v > u, , q > 0为假, 结论2得证.
结论3: 如果字符串S[0...n - 1]存在循环元, 那么其循环元长度从小到大依次为, n - nex[n - 1], n - nex[nex[n - 1],...,
证明: 采用证明结论2过程中得出的结论, 即将字符串S的最小循环元循转任意长度均与旋转前不等, 即可证明此结论. 此处不再赘述证明过程.