Ответ 1
Основой этого алгоритма является то, что ненулевой многочлен степени не выше d имеет не более d нулей. Каждая строка длины-k имеет свой собственный ассоциированный многочлен степени k - 1, и мы просматриваем возможные совпадения, вычитая многочлены рассматриваемых строк и оценивая по a. Если строки равны, то результат всегда равен нулю. Если строки не равны, то результат равен нулю тогда и только тогда, когда a является одним из нулей полиномиальной разности (это тот факт, что ставит требование первичности на n, так как целые числа mod n в противном случае не были бы полем).
В теории, по крайней мере, мы хотим быть случайными, чтобы забытый противник не мог создавать ложные срабатывания с любой частотой. Если мы не ожидаем неприятностей, то лучше выбрать a так, чтобы умножение на a было дешевым (например, двоичное разложение a имеет небольшое количество бит). Тем не менее, некоторые варианты плохо подходят для типичных наборов строк (например, a = 1). Мы хотим, чтобы n было достаточно большим, чтобы избежать ложных срабатываний (вероятность (k - 1)/n) случайным шансом, но достаточно небольшим и предпочтительно специальной формы, чтобы эффективные вычисления по модулю были эффективными.