예제 #1
0
        public static PrimeNumberState IsPrime(BigInteger number)
        {
            if (number <= 3)
            {
                return(PrimeNumberState.Prime);
            }

            if (number.IsEven)
            {
                return(PrimeNumberState.Composite);
            }

            if (!NumbersAnalys.IsFermatNumber(number))
            {
                throw new Exception("It is not a fermat number!");
            }

            if (!int.TryParse(BigInteger.Divide(BigInteger.Subtract(number, 1), 2).ToString(), out var exp))
            {
                throw new Exception("Can't parse to int");
            }

            var sub = BigInteger.Subtract(BigInteger.Pow(number, exp), -1);

            var remainder = BigInteger.Remainder(sub, number);

            return(remainder == 0 ? PrimeNumberState.Prime : PrimeNumberState.Composite);
        }
예제 #2
0
        private void AnalysButton_Click(object sender, RoutedEventArgs e)
        {
            if (!BigInteger.TryParse(NumberInput.Text, out var number))
            {
                var result = MessageBox.Show("Incorrect input!", "Error", MessageBoxButton.OK);

                if (result == MessageBoxResult.OK)
                {
                    NumberInput.Clear();
                }

                return;
            }

            Busy.Visibility = Visibility.Visible;
            var primeResult = NumbersAnalys.AnalysNumber(number);

            var window = new PrimalityTestChoose(primeResult, number);

            Busy.Visibility = Visibility.Hidden;

            window.ShowDialog();
        }
예제 #3
0
        private static PrimeNumberState PrimeTest(BigInteger number, CancellationToken token)
        {
            if (number.IsEven)
            {
                return(number == 2 ? PrimeNumberState.Prime : PrimeNumberState.Composite);
            }

            if (!NumbersAnalys.IsMersenneNumber(number))
            {
                throw new Exception("Not a Mersenne number");
            }

            var num = BigInteger.Log(number + 1, 2);
            var s   = new BigInteger(4);

            for (var i = 3; i <= num; i++)
            {
                token.ThrowIfCancellationRequested();

                s = (BigInteger.ModPow(s, 2, number) - 2) % number;
            }

            return(s == BigInteger.Zero ? PrimeNumberState.Prime : PrimeNumberState.Composite);
        }