【日記】Eratosthenes Sieve
阿新 • • 發佈:2018-11-10
原理:
偶數不可能是素數,素數的倍數也不可能是素數。
參考wiki——https://en.wikipedia.org/wiki/Eratosthenes
因為空間開銷是Ω(n),所以當n比較大時,效率會很低。
private static readonly int ERATOSTHENES_THREADHOLD = 10_000; /// <summary> /// 埃拉托色尼篩法。如果<paramref name="n"/>為素數返回true,否則返回false。 /// </summary> public static bool Eratosthenes(int n) { if (n > ERATOSTHENES_THREADHOLD) throw new ArgumentOutOfRangeException("n is too large"); if (n < 2) return false; if (n == 2) return true; if (IsEven(n)) return false; var flags = new bool[n + 1]; Array.Fill(flags, true, 2, flags.Length - 2); for(var i = 2; i <= (int)Math.Sqrt(flags.Length); ++i) { if (flags[i]) { for(var j = i*i; j < flags.Length; j += i) { flags[j] = false; } } } return flags[n]; } public static bool IsEven(int n) => (n & 1) == 0;