Interested Article - Вихрь Мерсенна

Вихрь Мерсе́нна ( англ. Mersenne twister , MT) — генератор псевдослучайных чисел (ГПСЧ), алгоритм , разработанный в 1997 году японскими учёными Макото Мацумото ( яп. 松本 眞) и Такудзи Нисимура ( яп. 西村 拓士). Вихрь Мерсенна генерирует псевдослучайные последовательности чисел с периодом равным одному из простых чисел Мерсенна , отсюда этот алгоритм и получил своё название и обеспечивает быструю генерацию высококачественных по критерию случайности псевдослучайных чисел.

Вихрь Мерсенна лишён многих недостатков, присущих другим ГПСЧ, таких как малый период, детерминированность , легко выявляемые статистические закономерности.

Тем не менее, этот генератор не является криптостойким , что ограничивает его использование в криптографии .

Существуют по меньшей мере два общих варианта алгоритма, различающихся только величиной используемого простого числа Мерсенна , наиболее распространённым из которых является алгоритм MT19937 , период которого составляет 2 19937 − 1 (приблизительно 4,3•10 6001 ).

Свойства

Вихрь Мерсенна является витковым регистром сдвига с обобщённой отдачей (TGFSR) ( англ. twisted generalised feedback shift register). «Вихрь» — это преобразование, которое обеспечивает равномерное распределение генерируемых псевдослучайных чисел в 623 измерениях (для линейных конгруэнтных генераторов оно ограничено 5 измерениями). Поэтому функция корреляции между двумя последовательностями выборок в выходной последовательности вихря Мерсенна пренебрежимо мала.

Псевдослучайная последовательность , порождаемая вихрем Мерсенна, имеет очень большой период, равный числу Мерсенна, что более чем достаточно для многих практических приложений.

Существуют эффективные реализации Вихря Мерсенна, превосходящие по скорости многие стандартные ГПСЧ (в частности, в 2—3 раза быстрее линейных конгруэнтных генераторов). Алгоритм вихря Мерсенна реализован в программной библиотеке Boost , Glib и стандартных библиотеках для C++ , Python , Ruby , R , PHP , MATLAB , Autoit .

Выдаваемые вихрем Мерсенна последовательности псевдослучайных чисел успешно проходят статистические тесты DIEHARD , что подтверждает их хорошие статистические свойства.

Генератор не предназначен для получения криптографически стойких случайных последовательностей чисел . Для обеспечения криптостойкости выходную последовательность генератора необходимо подвергнуть обработке одним из криптографических алгоритмов хеширования .

К -распределение

Было предложено много генераторов возможно «высокого качества», но только немногие могут быть использованы для серьёзного моделирования из-за отсутствия чёткого понятия «хаотичности» для генераторов псевдослучайных чисел, так как каждый исследователь концентрируется на конкретных параметрах хаотичности. Среди многих известных мер, тесты, основанные на более высоком равномерном распределении, таких как спектральный тест и тест на к-распределении, описанный ниже, считается сильнейшим.

Определение

Говорят, что псевдослучайная последовательность x i периода P , состоящая из w -битных целых, имеет k -распределение с v -битной точностью, если она удовлетворяет следующему условию:
Пусть trunc v (x) — число, образованное первыми v битами последовательности x i , рассмотрим P векторов вида ( trunc v ( x i ) , trunc v ( x i + 1 ) , . . . , trunc v ( x i + k 1 ) ) ( 0 i < P ) {\displaystyle ({\text{trunc}}_{v}(x_{i}),\,{\text{trunc}}_{v}(x_{i+1}),\,...,\,{\text{trunc}}_{v}(x_{i+k-1}))\quad (0\leq i<P)} , длиной kv бит.
Тогда каждая из 2 kv возможных комбинаций битов встречается равное число раз, за исключением комбинации, состоящей полностью из нулей, которая встречается на один раз меньше.

Геометрическая интерпретация

Для каждого v = 1, 2, …, w , пусть k(v) — максимальное число, такое, что последовательность является к -распределенной с v -битной точностью. Разделим каждое целое x i на 2 w для нормализации в псевдослучайное вещественное число x i из интервала [0, 1]. Поместим P точек в k - мерный куб с координатами ( x i , x i+1 …, x i+k-1 )(i = 0, 1,…, P-1) для всего периода. Каждая из осей данного k -мерного куба разделена на 2 v интервалов. Таким образом, мы разделили куб на 2 kv малых куба. Последовательность является к -распределённой с v -битной точностью, если каждый малый куб содержит равное число точек, кроме куба в начале координат, который содержит на одну точку меньше. Следовательно, чем выше k(v) для каждого v , тем более многомерным будет распределение с v -битной точностью. Под тестом на k -распределение понимается получение значений k(v) .

Описание

x будем обозначать w -мерные векторы над полем F 2 {\displaystyle F_{2}} = {0,1} , соответствующие машинным словам размера w . Вихрь Мерсенна генерирует последовательность векторов, которые являются псевдослучайными целыми из диапазона от 0 до 2 w — 1. Путём деления на 2 w — 1 можно также получить псевдослучайное вещественное число из диапазона [0,1].

Алгоритм основан на следующей рекуррентной формуле :

x k + n := x k + m ( x k u x k + 1 l ) A , k = 0 , 1 , ( 1 ) {\displaystyle x_{k+n}:=x_{k+m}\oplus ({x_{k}}^{u}\mid {x_{k+1}}^{l})A,\qquad k=0,1,\ldots \qquad (1)}

где:

В правой части x k u обозначает «старшие w-r бит» x k и x k+1 l «младшие r бит» x k+1 . Вектор ( x k u | x k+1 l ) является конкатенацией старших w-r бит x k и младших r бит x k+1 . Возьмём ( x 0 , x 1 ,…, x n-1 ) в качестве начального заполнения. Тогда генератор вычислит x n по рекуррентному выражению при k = 0. Полагая k = 1,2, …, генератор вычислит x n+1 , x n+2 ,… Форма матрицы A выбрана из расчета скорости выполнения умножения на A :

A = ( 0 1 0 0 1 0 1 a w 1 a w 2 a 0 ) {\displaystyle A={\begin{pmatrix}0&1&&&&\\0&0&1&&&\\0&\cdots &\cdots &\ddots &&\\&&&&\ddots &\\&&&&&1\\a_{w-1}&a_{w-2}&\cdots &\cdots &\cdots &a_{0}\end{pmatrix}}}

И вычисление x A сводится к побитовым операциям:

x A = { x 1 x 0 = 0 ( x 1 ) a x 0 = 1 {\displaystyle {\boldsymbol {x}}A={\begin{cases}{\boldsymbol {x}}\gg 1&x_{0}=0\\({\boldsymbol {x}}\gg 1)\oplus {\boldsymbol {a}}&x_{0}=1\end{cases}}}

где

x := ( x k u x k + 1 l ) k = 0 , 1 , {\displaystyle {\boldsymbol {x}}:=({x_{k}}^{u}\mid {x_{k+1}}^{l})\qquad \qquad k=0,1,\ldots }
a := ( a w 1 , a w 2 , , a 0 ) {\displaystyle {\boldsymbol {a}}:=({a_{w-1}},{a_{w-2}},\ldots ,{a_{0}})}
x := ( x w 1 , x w 2 , , x 0 ) {\displaystyle {\boldsymbol {x}}:=({x_{w-1}},{x_{w-2}},\ldots ,{x_{0}})}

Неполные массивы

Неполные массивы

Последовательность МТ ( x k+n , x k+n-1 ,…, x k+1 u ) образует (n × w — r) -массив. Так как r битов отбрасываются, массив называется неполным массивом . Каждый элемент получен из рекуррентного соотношения (1). Смена состояния MT также происходит по линейному соотношению и определяется с помощью линейного преобразования B .

В соответствии с общей теорией линейных рекуррентных последовательностей, каждое значение в ( n × w r )-массиве есть линейная рекуррентная последовательность , соответствующая характеристическому многочлену φ B ( t ) преобразования B . Матрица B имеет размеры ( n × w r ) × ( n × w r ) и следующую форму:

B = ( 0 I w 0 0 I w 0 0 I w 0 0 0 0 I w r S 0 0 0 ) m -th row {\displaystyle B={\begin{pmatrix}0&I_{w}&\cdots &0&0\\\vdots &&&&\\I_{w}&\vdots &\ddots &\vdots &\vdots \\\vdots &&&&\\0&0&\cdots &I_{w}&0\\0&0&\cdots &0&I_{w-r}\\S&0&\cdots &0&0\end{pmatrix}}{\begin{matrix}\\\\\leftarrow m{\hbox{-th row}}\\\\\\\\\end{matrix}}}

S = ( 0 I r I w r 0 ) A {\displaystyle S={\begin{pmatrix}0&I_{r}\\I_{w-r}&0\end{pmatrix}}A}

Где I r {\displaystyle I_{r}} единичная матрица размера r × r .

Для l = 0 , 1 , {\displaystyle l=0,1,\ldots } выполняется ( x l + n , x l + n 1 , , x l + 1 ) := ( x l + n 1 , x l + n 2 , , x l ) B {\displaystyle (x_{l+n},x_{l+n-1},\ldots ,x_{l+1}):=(x_{l+n-1},x_{l+n-2},\ldots ,x_{l})B} .
Характеристический многочлен φ B ( t ) преобразования B имеет вид :

Φ B ( t ) = ( t n + t m ) w r ( t n 1 + t m 1 ) r + a 0 ( t n + t m ) w r ( t n 1 + t m 1 ) r 1 + . . . + a r 2 ( t n + t m ) w r ( t n 1 + t m 1 ) + a r 1 ( t n + t m ) w r + a r ( t n + t m ) w r 1 + . . . + a w 2 ( t n + t m ) + a w 1 {\displaystyle \Phi _{B}(t)=(t^{n}+t^{m})^{w-r}\cdot (t^{n-1}+t^{m-1})^{r}+a_{0}(t^{n}+t^{m})^{w-r}\cdot (t^{n-1}+t^{m-1})^{r-1}+...+a_{r-2}(t^{n}+t^{m})^{w-r}\cdot (t^{n-1}+t^{m-1})+a_{r-1}(t^{n}+t^{m})^{w-r}+a_{r}(t^{n}+t^{m})^{w-r-1}+...+a_{w-2}(t^{n}+t^{m})+a_{w-1}}

Последовательность достигает максимального периода 2 ( nw-r ) −1, тогда и только тогда когда φ B ( t ) -примитивный .

Закалка

Необработанные последовательности, генерируемые рекурсией (1), обладают плохим равномерным распределением на больших размерностях. Чтобы это исправить, используется метод закалки ( англ. tempering) , на выходе которого получается итоговая псевдослучайная последовательность. Метод заключается в том, что каждое сгенерированное слово умножается справа на специальную обратимую матрицу T размера w × w . Для матрицы T : x z = x T , выбраны следующие последовательные преобразования:

y := x ⊕ ( x >> u )
y := : y ⊕ (( y << s ) & b )
y := : y ⊕ (( y << t ) & c )
z := y ⊕ ( y >> l )

где l , s , t и u — целые, а b и c — специально подобранные битовые маски размера слова, и ( x ≫u) обозначает побитовую операцию сдвига вправо на u бит.

Алгоритм

Вихрь Мерсенна алгоритмически реализуется двумя основными частями: рекурсивной и закалки . Рекурсивная часть представляет собой регистр сдвига с линейной обратной связью , в котором все биты в его слове определяются рекурсивно; поток выходных битов определяются также рекурсивно функцией битов состояния.

Блок-схема.

Регистр сдвига состоит из 624 элементов, и, в общей сложности, из 19937 клеток. Каждый элемент имеет длину 32 бита за исключением первого элемента, который имеет только 1 бит за счет отбрасывания бита.

Процесс генерации начинается с логического умножения на битовую маску, отбрасывающей 31 бита (кроме наиболее значащих).

Следующим шагом выполняется инициализация ( x 0 , x 1 ,…, x 623 ) любыми беззнаковыми 32-разрядными целыми числами. Следующие шаги включают в себя объединение и переходные состояния.

Смена состояния МТ.

Пространство состояний имеет 19937 бит (624·32 — 31). Следующее состояние генерируется сдвигом одного слова вертикально вверх и вставкой нового слова в конец. Новое слово вычисляется гаммированием средней части с исключённой . Выходная последовательность начинается с x 624 , x 625 ,…

Алгоритм производится в шесть этапов:

 Шаг 0. Предварительно инициализируется значение констант u1, h1, a u1 ← 10…0 битовая маска старших w-r бит, h1 ← 01…1 битовая маска младших r бит, aaw-1aw-2…a0 последняя строка матрицы A.
Шаг 1. x[0], x[1],…,x[n-1] ← начальное заполнение
Шаг 2. Вычисление (xiu | xi+1l) y ← (x[i] AND u1) OR (x[(i + 1) mod n] AND h1)
Шаг 3. Вычисляется значение следующего элемента последовательности по рекуррентному выражению (1) x[i] ← x[(i + m) mod n] XOR (y>>1) XOR a если младший бит y = 1
Или x[i] ← x[(i + m) mod n] XOR (y>>1) XOR 0 если младший бит y = 0 Шаг 4. Вычисление x[i]T yx[i] yy XOR (y>>u) yy XOR ((y<<s) AND b) yy XOR ((y<<t) AND c) zy XOR (y>>l) вывод z Шаг 5. i ← (i + 1) mod n
Шаг 6. Перейти к шагу 2.

Параметры 32-битного генератора MT

Параметры MT были тщательно подобраны для достижения упомянутых выше свойств. Параметры n и r выбраны так, что характеристический многочлен примитивный или nw — r равна числу Мерсенна 19937. Обратите внимание, что значение w эквивалентно размеру слова компьютера. В этом случае это 32 бита. В то время как значения n , m , r и w фиксируются, значение последней строки матрицы A выбирается случайным образом. Для чисел Мерсенна тест на простоту целых намного проще. Так, известно много простых чисел Мерсенна (то есть простых вида 2 p −1), до p=43112609 . Параметры закалки ( англ. tempering) подобраны так, что мы можем получить хорошее равномерное распределение. Все параметры МТ приведены в таблице 1.

Таблица 1
n 624
w 32
r 31
m 397
a 9908B0DF 16
u 11
s 7
t 15
l 18
b 9D2C5680 16
c EFC60000 16

Другие варианты реализации

В связи с изменениями в технологии, в частности, ростом производительности процессоров, были изобретены 64-битные и 128-битные версии МТ. 64-разрядная версия была предложена Такудзи Нисимурой в 2000 году, 128-разрядная − в 2006 году тоже Такудзи Нисимурой. Обе версии имеют тот же период, что и оригинальный MT.

64-битный MT имеет две версии. Первая версия использует то же рекурсивное соотношение, во вторую версию были добавлены ещё два вектора, что увеличило количество членов характеристического многочлена:

x k + n := x k + m 2 x k + m 1 x k + m 0 ( x k u x k + 1 l ) A ( 2 ) {\displaystyle x_{k+n}:=x_{k+m2}\oplus x_{k+m1}\oplus x_{k+m0}\oplus ({x_{k}}^{u}\mid {x_{k+1}}^{l})A\qquad (2)}

По сравнению с 32-разрядной MT, 64-разрядная версия работает быстрее. Все параметры для 64-битной версии приведены в таблице 2.

Таблица 2
ID Для рекурсивного соотношения (1) Для рекурсивного соотношения (2)
n 312 312 312 312 312
w 64 64 64 64 64
r 31 31 31 31 31
m 156 156
m 0 63 63 63
m 1 151 151 151
m 2 224 224 224
a B5026F5AA96619E9 16 F6A3F020F058B7A7 16 B3815B624FC82E2F 16 8EBD4AD46CB39A1E 16 CACB98F78EBCD4ED 16
b D66B5EF5B4DA0000 16 28AAF6CDBDB40000 16 599CFCBFCA660000 16 656BEDFFD9A40000 16 A51DBEFFDA6C0000 16
c FDED6BE000000000 16 FDEDEAE000000000 16 FFFAAFFE00000000 16 FDFECE7E00000000 16 FFEE9BF600000000 16
u 29 29 26 26 26
s 17 17 17 17 17
t 37 37 33 33 33
l 41 41 39 39 39

Примечания

  1. .
  2. (неопр.) . Boost C++ Libraries . Дата обращения: 29 мая 2012. 19 ноября 2012 года.
  3. (неопр.) . GLib Reference Manual . Дата обращения: 29 мая 2012. 19 ноября 2012 года.
  4. (неопр.) . Python v2.6.8 documentation . Дата обращения: 29 мая 2012. 19 ноября 2012 года.
  5. (неопр.) . Python v3.2 documentation . Дата обращения: 29 мая 2012. 19 ноября 2012 года.
  6. (неопр.) . Python 3.8.3 documentation . Дата обращения: 23 июня 2020. 28 июля 2021 года.
  7. (неопр.) . Ruby 1.9.3 documentation . Дата обращения: 29 мая 2012. 26 июня 2021 года.
  8. (неопр.) . CRAN Task View: Probability Distributions . Дата обращения: 29 мая 2012. 19 ноября 2012 года.
  9. (неопр.) . php documentation . Дата обращения: 29 мая 2012. 19 ноября 2012 года.
  10. (неопр.) . Matlab Documentation . Дата обращения: 23 ноября 2015. 12 сентября 2010 года.
  11. (неопр.) . Дата обращения: 22 марта 2014. 6 апреля 2021 года.
  12. .
  13. ↑ .
  14. .
  15. .
  16. (неопр.) . Дата обращения: 15 ноября 2012. 9 ноября 2020 года.
  17. (неопр.) . Дата обращения: 15 ноября 2012. 8 января 2020 года.

Литература

  • M. Matsumoto, T. Nishimura. Mersenne twister: A 623-dimensionally equidistributed uniform pseudorandom number generator (англ.) // ACM Trans. on Modeling and Computer Simulations : journal. — 1998. — Vol. 8 , no. 1 . — P. 3—30 . — doi : .
  • Matsumoto, M.; Kurita, Y. Twisted GFSR generators (неопр.) // ACM Trans. on Modeling and Computer Simulations. — 1992. — Т. 2 , № 3 . — С. 179—194 . — doi : .
  • Matsumoto, Makoto; Nishimura, Takuji; Hagita, Mariko; Saito, Mutsuo. (англ.) : journal. — 2005.
  • T. Nishimura. Tables of 64-bit Mersenne twisters (неопр.) // ACM Trans. on Modeling and Computer Simulations. — 2000. — Т. 10 , № 4 . — С. 248—357 . — doi : .
  • Matsumoto M., Saito M., Nishimura T., Hagita M. (неопр.) .

Ссылки

  • Makoto Matsumoto, (англ.)
  • (англ.)
  • (англ.)

Same as Вихрь Мерсенна