Инверсный конгруэнтный метод
Инверсный конгруэнтный метод является примером нелинейного генератора. На каждом шаге алгоритма, состояние вычисляется как линейная функция от обратного (по модулю) к текущему. Общая формула имеет вид \[x_{i+1} = \left\lbrace\begin{align} ax_i^{-1}+c \mod p, && x_i\neq 0\\ c \mod p, && x_i = 0\\ \end{align}\right.,\] \(p\) – простое.
Максимальный период такого генератора составляет \(p\), и эта длина периода достигается тогда и только тогда, когда полином \[f(z) = z^2 - cz - a\] является примитивным в поле \(GF(p)\), то есть может быть представлен как \[f(x) = (x-\alpha)(x-\alpha^p),\] где \(\alpha\) – некий примитивный элемент \(GF(p^2)\), и тогда \[c = \alpha + \alpha^p \mod p\] \[a = - \alpha^{p+1} \mod p\]
Значительным преимуществом этого метода является отсутствие линейных корреляций между идущими подряд числами. Как следствие, отсутствует характерная для ЛКГ “решетчатая” структура. Это, конечно, не отменяет наличия других корреляций.
Метод умножения с переносом
Метод умножения с переносом является специальным случаем мультипликативного генератора (генератора Лемера), позволяющим эффективно использовать в качестве модуля \(p\) числа, большие, чем позволяет архитектура платформы (т.е. больше машинного слова).
Общая формула имеет вид \[x_n = (ax_{n-r}+c_{n-1}) \mod b,\] где \[c_{n} = \left\lfloor \frac{a x_{n-r}+c_{n-1}}{b} \right\rfloor\] называется переносом, \(a\) – множитель, \(b\) – база. В качестве состояния хранятся \(r\) значений \(x_{n-r}, \ldots, x_{n-1}\) и значение \(c_{n-1}\).
Пусть \(p = ab^{r}-1\) и состояние представляет из себя большое \(b\)-ичное целое число, где старший разряд равен \(c_{n-1}\), младший – \(x_{n-r}\). Тогда операцию преобразования состояния можно представить как последовательность следующих операций:
- Вычесть \(x_{n-r}\). Это обнуляет младший разряд.
- Прибавить \(a x_{n-r} b^r\). Это добавляет к состоянию один новый разряд \(c_n\), а второй по старшинству разряд (соответствующий b^r) равен \(x_n\).
- Разделить состояние на \(b\) (что эквивалентно смещению вправо на 1 \(b\)-ичный разряд).
Первые два пункта по сути прибавляют к состоянию \(x_{n-r}(ab^r - 1) = x_{n-r} p\). Третий пункт соответствует умножению на \(b^{-1} \mod p\).
Таким образом, генератор умножения с переносом эквивалентен генератору Лемера с модулем \(p = ab^{r}-1\) b множителем \(a' = b^{-1} \mod p\).
Периодом генератора является порядок элемента \(b\) в мультипликативной группе по модулю \(p\). Понятно, что для максимизации периода имеет смысл выбирать простое \(p\). В то же время, этого недостаточно. Распространённым методом является выбор в качестве \(p\) “безопасного простого”, т.е. \(p=2q+1\), где \(q\) так же простое. По малой теореме Ферма, порядок любого элемента есть делитель \(p-1\), и тогда период есть делитель \(2q\), то есть, исключая \(b=p-1\) (единственный элемент с порядком 2, если p простое), \(\lambda=q = (p-1)/2 = ab^r/2 − 1\).
Собственно, это же рассуждение даёт нам теоретически возможное максимальное значение периода, если \(p\) не является “безопасным простым”.