static void Main(string[] args) { //CBasicRandomValue random1 = new CBasicRandomValue(); //random1.computePeriodAsParallel(70368714); //random1.checkFirstApproval(); //CBasicRandomValue rndSource = new CBasicRandomValue(); //random1.checkSecondApproval(rndSource); CLinearCongruentGenerator linearGenerator = new CLinearCongruentGenerator(300); CBasicRandomValue basicGenerator = new CBasicRandomValue(linearGenerator); for (int j = 0; j < 1e6; ++j) basicGenerator.next(); Console.WriteLine("--"); }
public void checkSecondApproval(CBasicRandomValue rndSource) { /** * otherRandomValueSource = rndSource; * numberFactorize(m); * foreach (var prime in fact) * { * Console.WriteLine($"{prime.Key} {prime.Value}"); * } * удостоверяемся, что факторизация модуля это 48 двоек (2^48). * => T должно равняться h(2^48) = 2^46, так как e >= 3. */ // Проверяем, является ли число а первообразным по модулю m: // Исходя из условий первообразности, сразу отбрасываем первые 3 условия, так как e > 3. // Проверим 4ое условие. if (a % 8 == 3 || a % 8 == 5) /* 4ое условие выполняется => максимальный период достигается (T = 2^46)*/ Console.WriteLine("2) Число а — первообразный элемент по модулю m."); else Console.WriteLine("Второе условие не выполнено."); }
protected void findPeriodAsParallel(long k) { CBasicRandomValue random = new CBasicRandomValue(); random.Skip(k - 1); System.Diagnostics.Stopwatch myStopwatch = new System.Diagnostics.Stopwatch(); myStopwatch.Start(); long T = k; long Xk = (multWithModulo(a, random.getState(), m) + c % m) % m; while (Xk != X0 && T <= k + 1000000) { Xk = (multWithModulo(a, Xk, m) + c % m) % m; ++T; if (T % (1 << 20) == 0) { Console.WriteLine($"[{k}] [{myStopwatch.Elapsed}]: {T}"); } } if (Xk == X0) { StreamWriter stream = new StreamWriter($@".\period_{k}.txt", false, Encoding.UTF8); stream.WriteLine($"Period = {T}"); stream.Close(); Console.WriteLine($"[{k}]: Found!"); periodFound = true; } else { Console.WriteLine($"[{k} - {T}] [{DateTime.Now} {myStopwatch.Elapsed}]: Not found."); } readyAsyncResults++; if (readyAsyncResults >= blockSize) computePeriodAsParallel(curStartParallelIndex + blockSize); myStopwatch.Stop(); }