JavaでRabin-Karpアルゴリズムを実装しようとしています。ローリングハッシュ値を一定時間で計算するのに苦労しています。http://algs4.cs.princeton.edu/53substring/RabinKarp.java.htmlで 1 つの実装を見つけました。それでも、これらの 2 つの行がどのように機能するかを理解できませんでした。
txtHash = (txtHash + Q - RM*txt.charAt(i-M) % Q) % Q;
txtHash = (txtHash*R + txt.charAt(i)) % Q;
剰余算術に関する記事をいくつか見ましたが、私の分厚い頭蓋骨に突き刺さる記事はありませんでした。これを理解するための指針を教えてください。