Exemple #1
0
        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();
        }