Лінійний конгруентний метод

Лінійний конгруентний метод — один із методів генерації псевдовипадкових чисел. Застосовується в простих випадках і не володіє криптографічною стійкістю. Входить в стандартні бібліотеки різних компіляторів.

Опис

Лінійний конгруентний метод був запропонований Д. Г. Лемером в 1949 році.[1] Суть методу полягає в обчисленні послідовності випадкових чисел , вважаючи

де — модуль (натуральне число, відносно якого обчислюють остачу від ділення; ), — множник ( ), — приріст ( ), — початкове значення ( ).

Ця послідовність називається лінійною конгруентною послідовністю. Наприклад, для отримаємо послідовність [2]:21—37</ref>

Властивості

Лінійна конгруентна послідовність, визначена числами , , і періодична з періодом, не більшим за . При цьому довжина періоду рівна тоді і тільки тоді, коли[2]:21—37:

  1. Числа і взаємно прості;
  2. кратно для кожного простого , що є дільником ;
  3. кратно , якщо кратно .

Наявність цієї властивості для випадку , де — число бітів в машинному слові, було доведено М. Грінбергом (англ. M. Greenberg).[3] Наявність цієї властивості для загального випадку і достатність умов були доведені Т. Е. Халлом (англ. T. E. Hull) і А. Р. Добеллом (англ. A. R. Dobell).[4]

Метод генерації лінійної конгруентної послідовності при називають мультиплікативним конгруентним методом, а при змішаним конгруентним методом. При згенеровані числа будуть мати менший період, ніж при , але при певних умовах можна отримати період довжиною , якщо — просте число. Той факт, що умова може призводити до появи більш довгих періодів, був встановлений В. Е. Томсоном (англ. W. T. Thomson) і незалежно від нього А. Ротенбергом (англ. A. Rotenberg).[2]Щоб гарантувати максимальність циклу повторення послідовності при , необхідно в якості значення параметра обирати просте число. Найвідомішим генератором подібного типу є так званий мінімальний стандартний генератор випадкових чисел, запропонований Стівеном Парком (англ. Stephen Park) і Кейтом Міллером (англ. Keith Miller) в 1988 році. Для нього , а .[5][6]

Методом генерації послідовностей псевдовипадкових чисел, що найчастіше використовують є змішаний конгруентний метод.[джерело не вказане 2530 днів]

Параметри, що часто використовуються

При виборі числа необхідно враховувати наступні умови:

  1. число повинно бути достатньо великим, так як період не може мати більше ніж елементів;
  2. значення числа повинно бути таким, щоб обчислювалось швидко.

На практиці при реалізації методу виходячи з вказаних умов частіше всього обирають , де — число бітів в машинному слові. При цьому варто враховувати, що молодші двійкові розряди згенерованих таким чином випадкових чисел демонструють поведінку, далеку від випадкової, тому рекомендується використовувати лише старші розряди. Подібна ситуація не виникає, коли , де — довжина машинного слова. В такому випадку молодші розряди поводять себе так же випадково, як і старші.[2]Вибір множника і приросту зазвичай обумовлений необхідністю виконання умови досягнення періоду максимальної довжини.

Таблиця хороших констант для лінійних конгруентних генераторів

Всі наведені константи забезпечують роботу генератора з максимальним періодом. Таблиця упорядкована по максимальному добутку, яке не викликає переповнення в слові заданої довжини.[7]

Переповнюється приacm
22010612836075
22121116637875
22242116637875
223430253111979
22393613996655
223136612836075
2241711121353125
224859253111979
224419617329282
224967304114406
22514128411134456
225625657131104
2251541295714000
2251741273112960
2251291462121870
22520529573139968
2264211711781000
2261255617329282
22628128411134456
22710931825786436
22742154773259200
227102124631116640
228127724749117128
228204125673121500
229231125367120050
229159751749244944
229266136979175000
229408125673121500
229366130809145800
230387729573139968
230361345289214326
2301366150889714025
231812128411134456
231456151349243000
231714154773259200
232930149297233280
2324096150889714025
23324163744411771875
23417221107839510300
2343626166037312500
2358458945989217728

Відомий «невдалий» (с точки зору якості вихідної послідовності) алгоритм RANDU, що протягом багатьох десятиліть використовували в різних компіляторах.

Для покращення статистичних властивостей числової послідовності в багатьох генераторах псевдовипадкових чисел використовується лише частина бітів результату. Наприклад, в стандарті ISO/IEC 9899 на мові Сі приведений (але не вказаний в якості обов'язкового) приклад функції rand(), що примусово відкидає молодші 16 і один старший розряд.

#define RAND_MAX 32767 static unsigned long int next = 1;int rand(void){  next = next * 1103515245 + 12345;  return (unsigned int)(next/65536) % (RAND_MAX + 1);}void srand(unsigned int seed){  next = seed;}

Саме в такому вигляді функція rand() використовується в компіляторах Watcom C/C++. Відомі числові параметри інших алгоритмів, що застосовуються в різних компіляторах і бібліотеках.

Sourcemмножник aдоданок cвикористані біти
Numerical Recipes[8]23216645251013904223
Borland C/C++232226954771bits 30..16 in rand(), 30..0 in lrand()
glibc (used by GCC)[9]231110351524512345bits 30..0
ANSI C: Watcom, Digital Mars, CodeWarrior, IBM VisualAge C/C++ [10]231110351524512345bits 30..16
C99, C11: Suggestion in the ISO/IEC 9899 [11]232110351524512345bits 30..16
Borland Delphi, Virtual Pascal2321347758131bits 63..32 of (seed * L)
Microsoft Visual/Quick C/C++232214013 (343FD16)2531011 (269EC316)bits 30..16
Microsoft Visual Basic (6 and earlier)[12]2241140671485 (43FD43FD16)12820163 (C39EC316)
RtlUniform from Native API[13]231 − 12147483629 (7FFFFFED16)2147483587 (7FFFFFC316)
Apple CarbonLib, C++11's minstd_rand0[14]231 − 1168070see MINSTD
C++11's minstd_rand[14]231 − 1482710see MINSTD
MMIX by Donald Knuth26463641362238467930051442695040888963407
Newlib26463641362238467930051bits 63...32
VAX's MTH$RANDOM,[15] old versions of glibc232690691
Java2482521490391711bits 47...16
Раніше в багатьох компіляторах:
RANDU231  655390

Можливість використання в криптографії

Хоча лінійний конгруентний метод породжує статистично хорошу псевдовипадкову послідовність чисел, він не є криптографічно стійким. Генератори на основі лінійного конгруентного методу передбачувані, тому їх не можна використовувати в криптографії. Вперше генератори на основі лінійного конгруентного методу були зламані Джимом Рідсом (Jim Reeds), а потім Джоан Бояр (Joan Boyar). Їй вдалося також виявити недоліки квадратичних і кубічних генераторів. Інші дослідники розширили ідеї Бояр, розробивши способи виявлення недоліків будь-якого поліноміального генератора. Таким чином, було доведено, що генератори на основі конгруентних методів не підходять для використання в криптографії. Однак генератори на основі лінійного конгруентного методу зберігають свою корисність для некриптографічних додатків, наприклад, для моделювання. Вони ефективні і в найбільш використовуваних емпіричних тестах демонструють хороші статистичні характеристики[7].

Див. також

Джерела

Посилання

🔥 Top keywords: Головна сторінкаЧемпіонат Європи з футболу 2024Спеціальна:ПошукВікіпедія:Культурна спадщина та видатні постаті (2024)Збірна України з футболуБріджертониЧемпіонат Європи з футболу 2020YouTubeУкраїнаЧемпіонат Європи з футболуЗбірна Румунії з футболуРебров Сергій СтаніславовичГлобальний саміт мируРадіо «Свобода»ДефолтРумуніяЛунін Андрій ОлексійовичНаціональна суспільна телерадіокомпанія УкраїниДень батькаДовбик Артем ОлександровичШевченко Андрій МиколайовичЯрмоленко Андрій МиколайовичЧемпіонат Європи з футболу 2024 (кваліфікаційний раунд)Мудрик Михайло Петрович138-ма зенітна ракетна бригада (Україна)FacebookЄрмак Андрій БорисовичСексВійськові звання України22-га окрема механізована бригада (Україна)Зінченко Олександр ВолодимировичТериторіальний центр комплектування та соціальної підтримкиДумками навиворіт 2Чемпіонат Європи з футболу 2016Список операторів систем розподілу України2024 у телебаченніMegogoСписок українських жіночих іменКиїв