ВУЗ:
Составители:
Если инкремент b равен нулю, то есть генератор имеет вид
()
maXX
nn
mod
1−
=
,
и мы получим самую простую последовательность, которую можно предложить
для генератора с равномерным распределением. При соответствующем выборе
констант a = 7
5
= 16 807 и m = 2
31
-1 = 2 147 483 647 мы получим генератор с
максимальным периодом повторения. Эти константы были предложены
учеными Парком и Миллером, поэтому генератор вида
(
)
12mod7
31
1
5
−⋅=
−
nn
XX
называется генератором Парка-Миллера.
Преимуществом линейных конгруэнтных генераторов является их
быстрота за счет малого количества операций на байт и простота реализации. К
сожалению, такие генераторы в криптографии используются достаточно редко,
поскольку являются предсказуемыми.
Иногда используют квадратичные и кубические конгруэнтные
генераторы, которые обладают большей стойкостью к взлому.
Квадратичный конгруэнтный генератор имеет вид
(
)
mсbXaXX
nnn
mod
1
2
1
++=
−−
.
Кубический конгруэнтный генератор задается как
(
)
mdсXbXaXX
nnnn
mod
1
2
1
3
1
+++=
−−−
.
Для увеличения размера периода повторения конгруэнтных генераторов
часто используют их объединение [13]. При этом криптографическая
безопасность не уменьшается, но такие генераторы обладают лучшими
характеристиками в некоторых статистических тестах.
Пример такого объединения для 32-битовой архитектуры может быть
реализован так:
// Long 32-
static long s1 = 1;
static long s2 = 1;
//MODMULT s*b mod m , m=a*b+c 0<=c<m
#define MODMULT(a,b,c,m,s) q = s/a; s = b*(s-a*q)-c*q;
if (s<0) s+=m;
double combinedLCG (void)
{
long q;
long z;
MODMULT (53668, 40014, 12211, 2147483563L, s1)
MODMULT (52774, 40692, 3791, 2147483399L, s2)
z = s1 - s2;
if (z<1)
z += 2147483562;
return z*4.656613e-10;
}
void InitLCG (long InitS1, long InitS2)
Страницы
- « первая
- ‹ предыдущая
- …
- 43
- 44
- 45
- 46
- 47
- …
- следующая ›
- последняя »