Инверсный конгруэнтный метод был предложен Айхенауэром и Леном в 1986 году[1] как замена линейному конгруэнтному методу, не обладающему решётчатой структурой[2].
Данный метод состоит в вычислении последовательности случайных чисел в кольце вычетов по модулю натурального числа .
Основным отличием от линейного метода является использование при генерации последовательности числа, обратного к предыдущему элементу, вместо самого предыдущего элемента.
Значение членов последовательности задается в виде:
if
if
В случае составного n
Если число является составным, элементы последовательности вычисляются следующим образом:
Параметры подбираются таким образом, чтобы .
Период
Последовательность периодична, причём период не превышает размерности кольца . Максимальный период достигается в случае, если многочлен является примитивным. Достаточным условием максимального периода последовательности является такой выбор констант и , чтобы многочлен был неприводим[4].[неавторитетный источник][источник не указан 3494 дня]
Инверсный конгруэнтный генератор с параметрами генерирует последовательность в кольце , где числа и , а также и обратны друг другу. В данном примере многочлен неприводим в и числа не являются его корнями, благодаря чему период максимален и равен .
Примеры реализации
Python
Код
defegcd(a,b):ifa==0:return(b,0,1)else:g,y,x=egcd(b%a,a)return(g,x-(b//a)*y,y)defmodinv(a,m):gcd,x,y=egcd(a,m)ifgcd!=1:returnNone# modular inverse does not existelse:returnx%mdefICG(n,a,c,seed):if(seed==0):returncreturn(a*modinv(seed,n)+c)%nseed=1n=5a=2c=3count=10foriinrange(count):print(seed)seed=ICG(n,a,c,seed)
Объединение двух инверсных конгруэнтных генераторов
Основным недостатком инверсных конгруэнтных генераторов является возрастание сложности вычислений при увеличении периода.
Данный недостаток исправлен в составных инверсных конгруэнтных генераторах.
Конструкция составных инверсных генераторов представляет из себя объединение двух или более инверсных конгруэнтных генераторов.
Пусть — различные простые числа, каждое . Для каждого индекса в пределах пусть — последовательность элементов с периодом . Другими словами, .
Пусть — последовательность случайных чисел в пределах , где .
Результирующая последовательность определяется как сумма: .
Во-вторых, двоичные последовательности, полученные с помощью ИКГ не имеют нежелательных статистических отклонений. Полученные данным методом последовательности проверены рядом статистических тестов и остаются стабильными при изменении параметров[7][8][10][11].
В-третьих, составные генераторы обладают теми же свойствами, что и одиночные линейные инверсные генераторы[12], но при этом имеют период значительно превышающий период одиночных генераторов[13]. Кроме того, устройство составных генераторов позволяет добиться высокого прироста производительности при использовании на многопроцессорных системах[14].
Существует алгоритм, позволяющий разрабатывать составные генераторы, обладающие предсказуемыми длиной периода и уровнем сложности, а также хорошими статистическими свойствами выходных последовательностей [15].
Недостатки инверсных конгруэнтных генераторов
Основным недостатком инверсных конгруэнтных генераторов является медленная скорость генерации элементов последовательности: на вычисление одного элемента последовательности затрачивается операций умножения[16][неавторитетный источник].
↑Hellekalek, 1995, p. 261: «The excellent theoretical and empirical properties of inversive methods remain stable under the variation of parameters, provided we have maximal period length».
↑Bubicz, Stoklosa, 2006, p. 2: «Compound approach gives the same outstanding properties of produced sequences as single inversive generators».
↑Bubicz, Stoklosa, 2006, p. 2: «Compound inversive generators allow obtaining period length significantly greater than obtained by a single ICG».
↑Bubicz, Stoklosa, 2006, p. 2: «They seem to be designed for application with multiprocessor parallel hardware platforms».
↑Bubicz, Stoklosa, 2006, p. 2: «There exists steady and simple way of parameter choice, based on the Chou algorithm. It guarantees
maximum period length».
↑Anne Gille-Genest: Pseudo-Random Numbers Generators, 2012, p. 12: «The main disadvantage of those both inverse generators is that a calculation of one random number takes O(log m) multiplication in Fm so the algorithm is not fast».