i603034
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Привет, помогите найти ошибку. Пытаюсь написать свой простенький датчик псевдослучайных чисел на основе следующей теоремы: Линейная конгруэнтная последовательность X(n+1) = (a * X(n) + c) % m, определённая числами m, a, c и X(0), имеет период длиной m тогда и только тогда, когда: 1) числа c и m взаимно простые; 2) b = a - 1 кратно p для каждого простого p, являющегося делителем m; 3) b кратно 4, если m кратно 4. У меня почему-то период получается меньше: например, если взять m = 658, то получим a = 659; c = 588535857. => X(n+1) = (659 * X(n) + 588535857) % 658 При X(0) = 0 получается последовательность длины 94. Где что не так? Код: void createRandomFunc(int m, int& b, int& c) { vector<int> primeNumVec(0); // содержит простые числа-делители числа m bool isPrime_b = false; b = 1; c = 1; // Находим все простые числа от 2 до m-1 // Если простое число - делитель m, то помещаем его в primeNumVec, // иначе умножаем на него число c for(int i=2; i<m; i++) { isPrime_b = true; for(int j=2; j<i; j++) { if(i % j == 0) { isPrime_b = false; break; } } if(isPrime_b) { // i - простое число if(m % i == 0) primeNumVec.push_back(i); else { int tmp_n = c * i; if(tmp_n >= 0 && tmp_n < 2000000000) // чтобы исключить переполнение c = tmp_n; } } } // 2) b кратно p для каждого простого p, являющегося делителем m for(int i=0; i < primeNumVec.size(); i++) { b *= primeNumVec[i]; } // 3) b кратно 4, если m кратно 4 if(m % 4 == 0 && b % 4 != 0) { b *= 4; } } |
| Всего записей: 24 | Зарегистр. 14-12-2006 | Отправлено: 01:27 03-03-2008 | Исправлено: i603034, 01:29 03-03-2008 |
|