/// <summary> /// Miller-Rabin test /// </summary> /// <param name="n">number to check</param> /// <param name="k">number of checks</param> /// <returns>true - probably prime, false - not prime</returns> public static bool MillerRabin(BigInteger n, BigInteger k) { BigInteger s = 0; BigInteger s2 = 1; int r; BigInteger a, d, i, prime; Random rand = new Random(); if (n < 4) { return(true); } if (n % 2 == 0) { return(false); } // calculate s and d while ((s2 & (n - 1)) == 0) { s += 1; s2 <<= 1; } d = n / s2; // try k times for (i = 0; i < k; i++) { a = NumberConverter.BitsArraystoString(ng.GetNumber(128)) + 1; if (power_modulo_fast(a, d, n) != 1) { prime = 0; for (r = 0; r <= s - 1; r++) { if (power_modulo_fast(a, powerOf2[r] * d, n) == n - 1) { prime = 1; break; } } if (prime == 0) { return(false); } } } return(true); }
public static int[] GenerateMessage() { NumberGenerator ngg = new NumberGenerator(); return(ngg.GetNumber(128)); }