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); }
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(); }
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); }