算法导论——Rabin-Karp算法求模证明(1)

研究了好久Rabin-Karp算法的求模过程,现在终于明白,我们应该以逆向思维去思考这个过程,否则就会陷入泥潭

公式

1.(a+b) mod p=[(a mod p)+(b mod p)] mod p1.(a+b)\ mod\ p = [(a\ mod \ p)+(b\ mod \ p)] \ mod \ p
2.(ab) mod p=[(a mod p)(b mod p)] mod p2.(a*b)\ mod\ p = [(a\ mod \ p)*(b\ mod \ p)] \ mod \ p

欲证

a=anan1...a0a=a_na_{n-1}...a_0可写成
a=a0+base(a1+base(a2...+base(an1+basean)))a=a_0+base*(a_1+base*(a_2...+base*(a_{n-1}+base*a_n)))
其中basebase为基准值:1,2,3...1,2,3...
我们要证明命题:
a mod q=((...(((basean) mod q)+an1) mod q...) mod q+a0) mod qa\ mod\ q=((...(((base*a_n) \ mod \ q)+a_{n-1}) \ mod\ q...) \ mod \ q+a_0) \ mod \ q
q>ai,{aii=0,1,2...n}对于任意q>a_i,\{a_i|i=0,1,2...n\}成立

证明

我们可以根据公式部分,不断消去modmod符号,从而证明命题。消去过程采用从里向外的策略进行,也就是文章一开始说的逆向思维
加入下述等式成立

a mod q=((...(((basean) mod q)+an1) mod q...) mod q+a0) mod qa\ mod\ q=((...(((base*a_n) \ mod \ q)+a_{n-1}) \ mod\ q...) \ mod \ q+a_0) \ mod \ q
由于
q>ai,ai mod q=aiq>a_i,故a_i \ mod \ q = a_i
如此,修改上述等式
a mod q=((...(((basean)a\ mod\ q=((...(((base*a_n)mod qmod\ q)+an1)+a_{n-1}mod qmod\ q) mod q...) mod q+a0) mod q)\ mod\ q...) \ mod \ q+a_0) \ mod \ q
根据
公式1,消去红色和蓝色的mod q'mod \ q',如此往复直到我们消去最后一对红蓝mod q'mod \ q':
a mod q=((...(((basean))+an1)...)a\ mod\ q=((...(((base*a_n))+a_{n-1}) ...)mod qmod\ q+a0+a_0mod qmod\ q) mod q) \ mod \ q
并消去所有多余括号得:
a mod q=(base(a1+base(a2...+base(an1+basean)))+a0) mod qa\ mod\ q=(base*(a_1+base*(a_2...+base*(a_{n-1}+base*a_n)))+a_0) \ mod \ q
由于我们有
a=a0+base(a1+base(a2...+base(an1+basean)))a=a_0+base*(a_1+base*(a_2...+base*(a_{n-1}+base*a_n)))
所以,等式成立。验证完毕。

结论

有了这个公式,我们便能够知道RabinKarpRabin-Karp算法是如何快速计算模的了。
算法导论——Rabin-Karp算法求模证明(1)

相关文章: