Если я испробовал это правильно, ваш код пытается найти наибольшее число между 0 и maxNumber. Используйте Сито Эратосфена для нахождения всех простых чисел между 0 и квадратным корнем из maxNumber. Затем вы можете перебирать от maxNumber до 0 для числа, неделимого всеми простыми числами, которые вы только что нашли.
EDIT: Пробовал эту
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--;
}
и найти maxPrime менее чем за 3 секунды для MAXNUMBER = 600881475134 (распараллеливание, потому что я думал, что это займет много времени)
Входы для когда он висит? Я не смотрел тяжело, но вы уверены, что это не просто * очень долгое время? O (N^2) очень длинна для достаточно больших N. –
Какова ценность 'maxNumber'? –
Сито Эратосфена: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes –