如果我尝试正确,您的代码正在尝试找到 0 和 maxNumber 之间的最大素数。使用 Eratosthenes 筛法找出介于 0 和 maxNumber 平方根之间的所有素数。然后,您可以从 maxNumber 迭代到 0,以获得一个不能被您刚刚找到的所有素数整除的数字。
编辑:试过这个
var sqrtMax = (int)Math.Sqrt(maxNumber);
var primeCandidates = Enumerable.Range(2, sqrtMax-1)
.ToDictionary(number => number, isComposite => false);
foreach (var number in primeCandidates.Keys.ToArray())
{
if (primeCandidates[number])
{
continue;
}
Parallel.ForEach(Enumerable.Range(2, sqrtMax / number - 1).Select(times => number * times),multiples=>
primeCandidates[multiples] = true);
}
var primeList = primeCandidates.Where(number => !number.Value).Select(pair=>pair.Key).ToArray();
var maxPrime = maxNumber;
while (primeList.AsParallel().Any(prime=> maxPrime%prime==0))
{
maxPrime--;
}
对于 maxNumber = 600881475134,它在不到 3 秒的时间内找到 maxPrime(并行化是因为我认为这需要很长时间)