【发布时间】:2015-04-15 17:17:19
【问题描述】:
有没有人碰巧知道使用 BigInteger 的 C# Sieve of Atkin 算法?据我了解,这是目前存在的最著名的素数分解算法。
我目前有这个功能:
/// <summary>
/// Finds prime numbers using the Sieve of Atkins algorithm.
/// </summary>
/// <param name="max">The limit of the prime list.</param>
/// <returns>The list of prime numbers.</returns>
public List<int> FindPrimes(int max)
{
var isPrime = new bool[max + 1];
var sqrt = (int) Math.Sqrt(max);
Parallel.For(1, sqrt, x =>
{
var xx = x * x;
for (int y = 1; y <= sqrt; y++)
{
var yy = y * y;
var n = 4 * xx + yy;
if (n <= max && (n % 12 == 1 || n % 12 == 5))
isPrime[n] ^= true;
n = 3 * xx + yy;
if (n <= max && n % 12 == 7)
isPrime[n] ^= true;
n = 3 * xx - yy;
if (x > y && n <= max && n % 12 == 11)
isPrime[n] ^= true;
}
});
var primes = new List<int>() { 2, 3 };
for (int n = 5; n <= sqrt; n++)
{
if (isPrime[n])
{
primes.Add(n);
int nn = n * n;
for (int k = nn; k <= max; k += nn)
isPrime[k] = false;
}
}
for (int n = sqrt + 1; n <= max; n++)
if (isPrime[n])
primes.Add(n);
return primes;
}
但是我想要一个看起来更像下面的函数签名,这样它就可以接受一个数字来测试并在数字是素数时输出 true。
public bool IsPrime(BigInteger number) { ... }
【问题讨论】:
-
这个问题专门询问BigInteger。另外,该问题的答案是使用简单的试除法。
-
我同意。我已经对你的问题摸不着头脑了:)
-
由于算法的性质,看起来我可能需要切换到阿特金斯以外的其他东西,因为它依赖于以前的因素。接收任意大数并有效地将其处理为素数的能力是我们的目标,而 int 迅速突破了任意属性。
标签: c# math primes prime-factoring