WikiZero - Лінійний конгруентний метод
open wikipedia design.
Лінійний конгруентний метод - один з методів генерації псевдовипадкових чисел . Застосовується в простих випадках і не володіє криптографічного стійкістю . Входить в стандартні бібліотеки різних компіляторів .
Лінійний конгруентний метод був запропонований Д. Г. Лемером в 1949 році. [1] Суть методу полягає в обчисленні послідовності випадкових чисел X n {\ displaystyle X_ {n}} , вважаючи
X n + 1 = (a X n + c) mod m, {\ displaystyle X_ {n + 1} = (aX_ {n} + c) ~~ {\ bmod {~}} ~ m,}
де m {\ displaystyle m} - модуль (натуральне число, щодо якого обчислює остача від ділення ; m ⩾ 2 {\ displaystyle m \ geqslant 2} ), A {\ displaystyle a} - множник (0 ⩽ a <m {\ displaystyle 0 \ leqslant a <m} ), C {\ displaystyle c} - приріст (0 ⩽ c <m {\ displaystyle 0 \ leqslant c <m} ), X 0 {\ displaystyle X_ {0}} - початкове значення (0 ⩽ X 0 <m {\ displaystyle 0 \ leqslant X_ {0} <m} ).
Ця послідовність називається лінійної конгруентної послідовністю. Наприклад, для m = 10, X 0 = a = c = 7 {\ displaystyle m = 10, X_ {0} = a = c = 7} отримаємо послідовність 7, 6, 9, 0, 7, 6, 9, 0, ... {\ displaystyle 7,6,9,0,7,6,9,0, \ dots} [2]
Лінійна конгруентністю послідовність, певна числами m {\ displaystyle m} , A {\ displaystyle a} , C {\ displaystyle c} і X 0 {\ displaystyle X_ {0}} періодична з періодом, що не перевищує m {\ displaystyle m} . При цьому довжина періоду дорівнює m {\ displaystyle m} тоді і тільки тоді, коли [3] :
- Числа c {\ displaystyle c} і m {\ displaystyle m} взаємно прості ;
- c = a - 1 {\ displaystyle c = a-1} кратно p {\ displaystyle p} для кожного простого p {\ displaystyle p} , Що є дільником m {\ displaystyle m} ;
- c {\ displaystyle c} кратно 4 {\ displaystyle 4} , Якщо m {\ displaystyle m} кратно 4 {\ displaystyle 4} .
Наявність цієї властивості для випадку m = 2 e {\ displaystyle m = 2 ^ {e}} , Де e {\ displaystyle e} - число бітів в машинному слові , Було доведено М. Грінбергом ( англ. M. Greenberg). [4] Наявність цієї властивості для загального випадку і достатність умов були доведені Т. Є. Халлом ( англ. TE Hull) і А. Р. Добелла ( англ. AR Dobell). [5]
Метод генерації лінійної конгруентної послідовності при c = 0 {\ displaystyle c = 0} називають мультиплікативний конгруентний методом, а при c ≠ 0 {\ displaystyle c \ neq 0} - змішаним конгруентним методом. При c = 0 {\ displaystyle c = 0} генеруються числа матимуть менший період, ніж при c ≠ 0 {\ displaystyle c \ neq 0} , Але за певних умов можна отримати період довжиною m - 1 {\ displaystyle m-1} , Якщо m {\ displaystyle m} - просте число. Той факт, що умова c ≠ 0 {\ displaystyle c \ neq 0} може призводити до появи більш довгих періодів, був встановлений В. Е. Томсоном ( англ. WT Thomson) і незалежно від нього А. Ротенбергом ( англ. A. Rotenberg). [2] Щоб гарантувати максимальність циклу повторення послідовності при c = 0 {\ displaystyle c = 0} , Необхідно в якості значення параметра m {\ displaystyle m} вибирати просте число. Найвідомішим генератором подібного роду є так званий мінімальний стандартний генератор випадкових чисел, запропонований Стівеном Парком ( англ. Stephen Park) і Кейтом Міллером ( англ. Keith Miller) в 1988 році. Для нього a = 16807 {\ displaystyle a = 16807} , А m = 2147483647 {\ displaystyle m = 2147483647} . [6] [7]
Найбільш часто практикуються методом генерації послідовностей псевдовипадкових чисел є змішаний конгруентний метод. [ Джерело не вказано 743 дня ]
При виборі числа m {\ displaystyle m} необхідно враховувати наступні умови:
1) число m {\ displaystyle m} має бути досить великим, так як період не може мати більше m {\ displaystyle m} елементів;
2) значення числа m {\ displaystyle m} має бути таким, щоб (a X n + c) mod m {\ displaystyle (aX_ {n} + c) \ mod m} обчислювалося швидко.
На практиці при реалізації методу виходячи із зазначених умов найчастіше вибирають m = 2 e {\ displaystyle m = 2 ^ {e}} , Де e {\ displaystyle e} - число бітів в машинному слові . При цьому варто враховувати, що молодші виконавчі розряди згенерованих таким чином випадкових чисел демонструють поведінку, далеке від випадкового, тому рекомендується використовувати тільки старші розряди. Подібна ситуація не виникає, коли m = w ± 1 {\ displaystyle m = w \ pm 1} , Де w {\ displaystyle w} - довжина машинного слова. В такому випадку молодші розряди X n {\ displaystyle X_ {n}} поводяться так само випадково, як і старші. [2] Вибір множника a {\ displaystyle a} і збільшення c {\ displaystyle c} в основному обумовлений необхідністю виконання умови досягнення періоду максимальної довжини.
Сумно відомий «невдалий» (з точки зору якості вихідної послідовності) алгоритм 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 ++ . Відомі числові параметри інших алгоритмів, що застосовуються в різних компіляторах і бібліотеках.
Можливість використання в криптографії [ правити | правити код ]
Хоча лінійний конгруентний метод породжує статистично хорошу псевдослучайную послідовність чисел, він не є криптографически стійким. Генератори на основі лінійного конгруентного методу є передбачуваними, тому їх не можна використовувати в криптографії. Вперше генератори на основі лінійного конгруентного методу були зламані Джимом Рідс (Jim Reeds), а потім Джоан Бояр (Joan Boyar). Їй вдалося також розкрити квадратические і кубічні генератори. Інші дослідники розширили ідеї Бояр, розробивши способи розтину будь-якого полиномиального генератора. Таким чином, була доведена марність генераторів на основі конгруентних методів для криптографії. Однак генератори на основі лінійного конгруентного методу зберігають свою корисність для некріптографіческіх додатків, наприклад, для моделювання. Вони ефективні і в більшості використовуваних емпіричних тестах демонструють хороші статистичні характеристики [8] .
- ↑ DH Lehmer, Mathematical methods in large-scale computing units, Proceedings of a Second Symposium on Large-Scale Digital Calculating Machinery, 1949, Harvard University Press, Cambridge, Mass., 1951, pp. 141-146. MR 0044899 (13,495f) [1]
- ↑ 1 2 3 Дональд Кнут . Том 2. Получісленние методи // Мистецтво програмування. Указ. соч. - С. 21-37.
- ↑ Кнут Д. Е., Мистецтво програмування. Том 2. Получісленние методи - Вільямс. 2001. с.21-37
- ↑ M. Greenberger, Method in randomness, Comm. ACM 8 (1965), 177-179. [2]
- ↑ TE Hull and AR Dobell «Random Number Generators», SIAM Review 4-3 (1962), 230-254 [3]
- ↑ "Бакнелл Д. М. Фундаментальні алгоритми та структури даних в Delphi. Бібліотека програміста. 2002 год. Журнал Delphi Informant Magazine. Глава 6.
- ↑ Stephen K. Park and Keith W. Miller (1988). Random Number Generators: Good Ones Are Hard To Find. Communications of the ACM 31 (10): 1192-1201 [4]
- ↑ 1 2 Брюс Шнайер . Глава 16. // Прикладна кріптографія.Тріумф.2002. Указ. соч. - С. 275. [5] архівна копія від 28 лютого 2014 на Wayback Machine
- ↑ Numerical recipies in C. The art of scientific computing. 2-nd edition. - Cambridge University Press, 1992. - 925 pp.
- ↑ The GNU C library's rand () in stdlib.h uses a simple (single state) linear congruential generator only in case that the state is declared as 8 bytes. If the state is larger (an array), the generator becomes an additive feedback generator and the period increases. See the simplified code that reproduces the random sequence from this library.
- ↑ A collection of selected pseudorandom number generators with linear structures, K. Entacher, 1997. (неопр.). Дата звернення 16 червня 2012.
- ↑ Last public Committee Draft from April 12, 2011, page 346f (неопр.). Дата звернення 21 грудня 2014.
- ↑ How Visual Basic Generates Pseudo-Random Numbers for the RND Function (неопр.). Microsoft Support. Microsoft. Дата звернення 17 червня 2011 року.
- ↑ In spite of documentation on MSDN , RtlUniform uses LCG, and not Lehmer's algorithm, implementations before Windows Vista are flawed, because the result of multiplication is cut to 32 bits, before modulo is applied
- ↑ 1 2 ISO / IEC 14882: 2011 (неопр.). ISO (2 September 2011). Дата обігу 3 вересня 2011 року.
- ↑ GNU Scientific Library: Other random number generators