void FermaEntry(long number, long cycles)
        {
            try
            {
                long a, b;
                bool prime = true;
                for (int i = 0; i < cycles; i++)
                {
                    a = (long)rnd.Next(2, (int)number - 1);
                    b = CryptographyMath.PowerSearch(a, number - 1, number);

                    if (b != 1)
                    {
                        MessageBox.Show("Число  " + number.ToString() + " скорее всего составное");
                        prime = false;
                        break;
                    }
                }

                if (prime)
                {
                    MessageBox.Show("Число  " + number.ToString() + " вероятно простое");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка:" + ex.Message);
            }
        }
Пример #2
0
        void PollardPMinusOneEntry(long number, long b)
        {
            try
            {
                long a = 2, p;
                for (int j = 2; j <= b; j++)
                {
                    a = CryptographyMath.PowerSearch(a, j, number);
                }

                p = CryptographyMath.ExtendedGCD(a - 1, number)[0];
                if (p != 1 || p != number)
                {
                    MessageBox.Show(p.ToString() + " - делитель " + number.ToString());
                }
                else
                {
                    MessageBox.Show("Увы, попробуй ещё раз");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка:" + ex.Message);
            }
        }
Пример #3
0
        void RabinMillerEntry(long number)
        {
            try
            {
                long baseNum            = (long)rnd.Next(2, (int)number - 2);
                long s                  = 0; // степень двойки
                long t                  = 0; // нечетное число, n-1 = 2^s*t
                bool searchRequired     = true;
                long primeSearchCounter = 0;

                // если число n чётное или НОД(baseNum, n)!=1, то оно составное
                if (number % 2 == 0 || CryptographyMath.ExtendedGCD(baseNum, number)[0] != 1)
                {
                    MessageBox.Show("Число " + number.ToString() + " скорее всего составное");
                }
                else
                {
                    t = (number - 1);
                    //представляем число n - 1 в таком виде: n-1 = 2^s*t,  находим s и t
                    while (searchRequired)
                    {
                        if (t % 2 == 0)
                        {
                            s++;
                            t = (number - 1) / (long)Math.Pow(2, s);
                        }
                        else
                        {
                            searchRequired = false;
                        }
                    }

                    //если baseNum^t = 1 (mod n), или baseNum^((2^r)*t) = -1 (mod n) при 0<=r<s , то n псевдопростое по основанию baseNum
                    for (int i = 0; i < s; i++)
                    {
                        long atn = CryptographyMath.PowerSearch(baseNum, t, number);                                                 // возводим а в степень t по модулю n

                        if ((Math.Abs(atn) == 1) || (CryptographyMath.PowerSearch(atn, (long)Math.Pow(2, i), number) == number - 1)) // вместо того, чтобы писать Stepen(atn, (long) Math.Pow(2, i), n) == -1
                        {
                            MessageBox.Show("Число " + number.ToString() + " вероятно простое");
                            break;
                        }
                        else
                        {
                            primeSearchCounter += 1;
                        }
                    }
                    //если ни при одном r (0<=r<s) не выполняется baseNum^((2^r)*t) = -1 (mod n), то n составное
                    if (primeSearchCounter == s)
                    {
                        MessageBox.Show(" Число " + number.ToString() + " составное");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка:" + ex.Message);
            }
        }