Инверсный конгруэнтный метод

Материал из testwiki
Версия от 19:12, 25 февраля 2023; imported>G2ii2g (орфография)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Инверсный конгруэнтный метод (или генератор Айхенауэра — Лена) — метод генерации псевдослучайных чисел, основанный на использовании обратного по модулю числа для генерации следующего члена последовательности.

Пример инверсного конгруэнтного генератора с параметрами n = 7, seed = 0, a = 4, c = 5

Описание

Инверсный конгруэнтный метод был предложен Айхенауэром и Леном в 1986 годуШаблон:Sfn как замена линейному конгруэнтному методу, не обладающему решётчатой структуройШаблон:Sfn.

Данный метод состоит в вычислении последовательности случайных чисел Xn в кольце вычетов по модулю натурального числа n.

Основным отличием от линейного метода является использование при генерации последовательности числа, обратного к предыдущему элементу, вместо самого предыдущего элемента.

Параметрами генератора являютсяШаблон:Sfn:

seed — соль
a — множитель (0a<n)
b — приращение (0b<n)

В случае простого n

Значение членов последовательности задается в виде:

x0=seed
xi+1(axi1+b)modn   if xi0
xi+1=b if xi=0

В случае составного n

Если число Xn является составным, элементы последовательности вычисляются следующим образом:

x0=seed
xi+1(axi1+b)modn  

Параметры подбираются таким образом, чтобы (seed,n)=1;(a,n)=1.

Период

Последовательность xi+1 периодична, причём период не превышает размерности кольца n. Максимальный период n достигается в случае, если многочлен f(x)=x2bxa𝔽n[x] является примитивным. Достаточным условием максимального периода последовательности является такой выбор констант a и b, чтобы многочлен f(x) был неприводимШаблон:Sfn.Шаблон:Неавторитетный источникШаблон:Нет АИ

В случае составного n максимально возможный период равен φ(n) (функция Эйлера)Шаблон:Sfn.Шаблон:Неавторитетный источникШаблон:Нет АИ

Пример

Инверсный конгруэнтный генератор с параметрами n=5,a=2,b=3,seed=1 генерирует последовательность {1,0,3,2,4,1,...} в кольце 𝔽5, где числа 1 и 4, а также 2 и 3 обратны друг другу. В данном примере многочлен f(x)=x23x2 неприводим в 𝔽5[x] и числа 0,1,2,3,4 не являются его корнями, благодаря чему период максимален и равен n=5.

Примеры реализации

Python

Шаблон:Сокрытие

C++

Шаблон:Сокрытие

Составные инверсные генераторы

Объединение двух инверсных конгруэнтных генераторов

Основным недостатком инверсных конгруэнтных генераторов является возрастание сложности вычислений при увеличении периода. Данный недостаток исправлен в составных инверсных конгруэнтных генераторах.

Конструкция составных инверсных генераторов представляет из себя объединение двух или более инверсных конгруэнтных генераторов.

Пусть p1,,pr — различные простые числа, каждое pj5. Для каждого индекса j в пределах 1j r пусть {yn(j)}n0 — последовательность элементов 𝔽pj с периодом pj. Другими словами, {yn(j)|0npj}𝔽pj.

Пусть {xn(j)}n0 — последовательность случайных чисел в пределах xn(j)[0;1], где xn(j)=yn(j)pj;n0;1j r.

Результирующая последовательность (xn)n0 определяется как сумма: xn:=xn(1)+xn(2)++xn(r)mod1.

Период результирующей последовательности T=p1p2prШаблон:Sfn.

Одни из преимуществ данного подхода является возможность использовать инверсные конгруэнтные генераторы работающие параллельно.

Пример составного инверсного генератора

Пусть r=2,p1=5 и p2=7. Для упрощения положим (yk(1))k0=(0,1,2,3,4,) and (yk(2))k0=(0,1,2,3,4,5,6,). Для каждого 1n35 вычислим xn=yn(1)5+yn(2)7.

Тогда (xn)n0={0.0, 0.34, 0.69, 0.03, 0.37, 0.71, 0.06, 0.4, 0.74, 0.09, 0.43, 0.77, 0.11, 0.46, 0.8, 0.14, 0.49, 0.83, 0.17, 0.51, 0.86, 0.2, 0.54, 0.89, 0.23, 0.57, 0.91, 0.26, 0.6, 0.94, 0.29, 0.63, 0.97, 0.31, 0.66, 0.0}. То есть мы получили последовательность с периодом 5×7=35.

Чтобы избавится от дробных чисел, можно умножить каждый элемент полученной последовательности на 35 и получить последовательность целых чисел: (xn(int))n0={0, 12, 24, 1, 13, 25, 2, 14, 26, 3, 15, 26, 4, 16, 28, 5, 17, 28, 6, 18, 30, 7, 19, 31, 8, 20, 32, 9, 21, 33, 10, 22, 34, 11, 22, 0}

Преимущества инверсных конгруэнтных генераторов

Инверсные конгруэнтные генераторы применяются в практических целях по ряду причин.

Во-первых, инверсные конгруэнтные генераторы обладают достаточно неплохой равномерностьюШаблон:Sfn, кроме того полученные последовательности совершенно лишены решетчатой структуры, характерной для линейных конгруэнтных генераторовШаблон:SfnШаблон:SfnШаблон:Sfn.

Во-вторых, двоичные последовательности, полученные с помощью ИКГ не имеют нежелательных статистических отклонений. Полученные данным методом последовательности проверены рядом статистических тестов и остаются стабильными при изменении параметровШаблон:SfnШаблон:SfnШаблон:SfnШаблон:Sfn.

В-третьих, составные генераторы обладают теми же свойствами, что и одиночные линейные инверсные генераторыШаблон:Sfn, но при этом имеют период значительно превышающий период одиночных генераторовШаблон:Sfn. Кроме того, устройство составных генераторов позволяет добиться высокого прироста производительности при использовании на многопроцессорных системахШаблон:Sfn.

Существует алгоритм, позволяющий разрабатывать составные генераторы, обладающие предсказуемыми длиной периода и уровнем сложности, а также хорошими статистическими свойствами выходных последовательностей Шаблон:Sfn.

Недостатки инверсных конгруэнтных генераторов

Основным недостатком инверсных конгруэнтных генераторов является медленная скорость генерации элементов последовательности: на вычисление одного элемента последовательности затрачивается O(logn) операций умноженияШаблон:SfnШаблон:Неавторитетный источник.

Примечания

Шаблон:Примечания

Литература

Книги
Статьи

Шаблон:Columns-list

Шаблон:Добротная статья