public void IsPrime() { for (int i = 1; i <= 100; i++) { Test(i); } Test(1000000000037); // 10^12 Test(1000000000039); Test(1L << 40); Test((1L << 40) - 1); void Test(long n) { Assert.AreEqual(Primes.Factorize(n).Length == 1, Primes.IsPrime(n)); } }
public void Sample() { // 素因数分解 Console.WriteLine(string.Join(" * ", Primes.Factorize(2020))); // 2 * 2 * 5 * 101 // 約数の列挙 Console.WriteLine(string.Join(" ", Primes.Divisors(2020))); // 1 2 4 5 10 20 101 202 404 505 1010 2020 // 素数判定 Console.WriteLine(Primes.IsPrime(1000000007)); // True // n 以下の素数の列挙 Console.WriteLine(string.Join(" ", Primes.GetPrimes(100))); // 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 // m 以上 M 以下の素数の列挙 Console.WriteLine(string.Join(" ", Primes.GetPrimes(1000000000, 1000000100))); // 1000000007 1000000009 1000000021 1000000033 1000000087 1000000093 1000000097 }
public void Divisors() { for (int i = 1; i <= 100; i++) { Test(i); } Test(6983776800); Test(9311702400); Test(1000000000037); // 10^12 Test(1000000000039); Test(1L << 40); Test((1L << 40) - 1); void Test(long n) { var actual = Primes.Divisors(n); var length = Primes.Factorize(n).GroupBy(p => p).Aggregate(1L, (x, g) => x * (g.LongCount() + 1)); Assert.AreEqual(length, actual.Length); } }
public void Factorize() { for (int i = 1; i <= 100; i++) { Test(i); } Test(6983776800); Test(9311702400); Test(1000000000037); // 10^12 Test(1000000000039); Test(1L << 40); Test((1L << 40) - 1); void Test(long n) { var actual = Primes.Factorize(n); Console.WriteLine($"{n} = {string.Join(" * ", actual)}"); Assert.AreEqual(n, actual.Aggregate(1L, (x, y) => x * y)); } }