KMP_next陣列應用_最小迴圈元
迴圈元: 如果一個字串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,
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的最小迴圈元循轉任意長度均與旋轉前不等, 即可證明此結論. 此處不再贅述證明過程.