Линейный конгруэнтный генератор (lcg) . Ss+1 = (aS + c) mod m* В учебных целях хочу попробовать взломать функцию random языка программирования Pawn. Условия такие: Функция random(37) генерирует числа от 0 до 36. На выходе у нас числа 1 19 10 7 33 10 18 12 31 . В интернете я нашел коэффициент m этого LCG . m = 2^31 . Также есть код который дает нам возможно предугадать следующие числа , при условии , что мы знаем все 3 коэффициента .
#include <stdio.h>
#include <time.h>
#define SIZE 6
unsigned long int seed = 1;
unsigned int lcg() {
int a = 16807;
int c = 12345;
unsigned int m = 2147483648;
seed = (seed * a) % m;
return seed;
}
int main() {
unsigned int mods[SIZE] = {1 , 19 , 10 , 7 , 33 , 10};
int cur = 0;
while(cur < 6) {
if(mods[cur] == lcg() % 37) { cur++; }
else { cur = 0; }
}
while(1){
printf("%u\n", lcg() % 37);
getchar();
}
return 0;
}
Как узнать отсутствующие коэффициенты? Слышал про метод LLL , но совершенно не понимаю как он работает , и как его приметь здесь.