|
| 1 | +using System; |
| 2 | + |
| 3 | +namespace Unity.Utility |
| 4 | +{ |
| 5 | + public static class Prime |
| 6 | + { |
| 7 | + public static readonly int[] Numbers = { |
| 8 | + 1, 3, 7, 11, 17, 23, 29, 37, 47, 59, 71, 89, 107, 131, 163, 197, 239, 293, |
| 9 | + 353, 431, 521, 631, 761, 919, 1103, 1327, 1597, 1931, 2333, 2801, 3371, 4049, |
| 10 | + 4861, 5839, 7013, 8419, 10103, 12143, 14591, 17519, 21023, 25229, 30293, 36353, |
| 11 | + 43627, 52361, 62851, 75431, 90523, 108631, 130363, 156437, 187751, 225307, 270371, |
| 12 | + 324449, 389357, 467237, 560689, 672827, 807403, 968897, 1162687, 1395263, 1674319, |
| 13 | + 2009191, 2411033, 2893249, 3471899, 4166287, 4999559, 5999471, 7199369, 10000019}; |
| 14 | + |
| 15 | + |
| 16 | + public static int GetPrime(int min) |
| 17 | + { |
| 18 | + if (min < 0) throw new ArgumentException("Capacity Overflow"); |
| 19 | + |
| 20 | + foreach (var prime in Numbers) |
| 21 | + { |
| 22 | + if (prime >= min) return prime; |
| 23 | + } |
| 24 | + |
| 25 | + for (var i = min | 1; i < Int32.MaxValue; i += 2) |
| 26 | + { |
| 27 | + if (IsPrime(i) && (i - 1) % 101 != 0) |
| 28 | + return i; |
| 29 | + } |
| 30 | + |
| 31 | + return min; |
| 32 | + } |
| 33 | + |
| 34 | + public static bool IsPrime(int candidate) |
| 35 | + { |
| 36 | + if ((candidate & 1) != 0) |
| 37 | + { |
| 38 | + var limit = (int)Math.Sqrt(candidate); |
| 39 | + for (var divisor = 3; divisor <= limit; divisor += 2) |
| 40 | + { |
| 41 | + if (candidate % divisor == 0) |
| 42 | + return false; |
| 43 | + } |
| 44 | + return true; |
| 45 | + } |
| 46 | + return candidate == 2; |
| 47 | + } |
| 48 | + } |
| 49 | +} |
0 commit comments