Ваш второй вопрос, кажется, просто о модульной арифметике с -ve числами. Один из способов думать об этом - работая мод М, вы можете добавлять или вычитать М столько раз, сколько захотите, поскольку М эквивалентно 0 мод М. Таким образом, мы имеем (7-3.3) .10 + 2 (мод 13) = -2,10 + 2 = -18 = 13 + 13 - 18 = 8 мод 13
Ваш первый вопрос мне менее понятен, но позвольте мне проработать его подробно. Когда символ впервые появляется в текстовом окне, он просто добавляется. Затем он перемещается вдоль текстового окна, и, наконец, мы хотим удалить всю память о нем, чтобы после того, как он выходит из текстового окна, он не влияет на хеш-значение.
Сначала мы видим символ x и добавляем его к значению хеша, поэтому получаем h.d + x. Когда мы видим следующий символ, мы умножаем его на d (и делаем другие вещи, которые я пытаюсь объяснить), а затем добавляем новый символ - скажем, y. Итак, мы получаем ... + х * д + у. Следующий шаг дает нам ... + x * d * d + y * d + z. Когда мы как раз собираемся избавиться от символа, у нас есть значение хеша x * d ^ (m-1) + ...., где .... зависит только от символов после x. Таким образом, мы можем устранить влияние x на значение хеша, вычитая x * d ^ (m-1) перед умножением на d.