算法导论——Rabin-Karp算法求模证明(1)
研究了好久Rabin-Karp算法的求模过程,现在终于明白,我们应该以逆向思维去思考这个过程,否则就会陷入泥潭
公式
1.(a+b) mod p=[(a mod p)+(b mod p)] mod p
2.(a∗b) mod p=[(a mod p)∗(b mod p)] mod p
欲证
a=anan−1...a0可写成
a=a0+base∗(a1+base∗(a2...+base∗(an−1+base∗an)))
其中base为基准值:1,2,3...
我们要证明命题:
a mod q=((...(((base∗an) mod q)+an−1) mod q...) mod q+a0) mod q
对于任意q>ai,{ai∣i=0,1,2...n}成立
证明
我们可以根据公式部分,不断消去mod符号,从而证明命题。消去过程采用从里向外的策略进行,也就是文章一开始说的逆向思维。
加入下述等式成立
a mod q=((...(((base∗an) mod q)+an−1) mod q...) mod q+a0) mod q
由于
q>ai,故ai mod q=ai
如此,修改上述等式
a mod q=((...(((base∗an)mod q)+an−1mod q) mod q...) mod q+a0) mod q
根据
公式1,消去红色和蓝色的′mod q′,如此往复直到我们消去最后一对红蓝′mod q′:
a mod q=((...(((base∗an))+an−1)...)mod q+a0mod q) mod q
并消去所有多余括号得:
a mod q=(base∗(a1+base∗(a2...+base∗(an−1+base∗an)))+a0) mod q
由于我们有
a=a0+base∗(a1+base∗(a2...+base∗(an−1+base∗an)))
所以,等式成立。验证完毕。
结论
有了这个公式,我们便能够知道Rabin−Karp算法是如何快速计算模的了。
