Я знаю, что первопричина хорошо изучена, и существует множество различных реализаций.Мой вопрос, используя предоставленный метод (пример кода), как я могу разбить работу?Машина, на которой она будет работать, имеет 4 четырехъядерных гиперпоточных процессора и 16 ГБ ОЗУ.Я понимаю, что есть некоторые улучшения, которые могут быть сделаны, особенно в методе IsPrime
.Я также знаю, что проблемы возникнут, когда в списке будет более int.MaxValue
элементов.Меня не волнует ни одно из этих улучшений.Единственное, что меня волнует, это как разбить работу.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Prime
{
class Program
{
static List<ulong> primes = new List<ulong>() { 2 };
static void Main(string[] args)
{
ulong reportValue = 10;
for (ulong possible = 3; possible <= ulong.MaxValue; possible += 2)
{
if (possible > reportValue)
{
Console.WriteLine(String.Format("\nThere are {0} primes less than {1}.", primes.Count, reportValue));
try
{
checked
{
reportValue *= 10;
}
}
catch (OverflowException)
{
reportValue = ulong.MaxValue;
}
}
if (IsPrime(possible))
{
primes.Add(possible);
Console.Write("\r" + possible);
}
}
Console.WriteLine(primes[primes.Count - 1]);
Console.ReadLine();
}
static bool IsPrime(ulong value)
{
foreach (ulong prime in primes)
{
if (value % prime == 0) return false;
if (prime * prime > value) break;
}
return true;
}
}
}
Я вижу две основные схемы: 1) использование всех потоков для проверки одного числа, что, вероятно, отлично подходит для старших простых чисел, ноЯ не могу придумать, как это реализовать, или 2) использовать каждый поток для проверки одного возможного простого числа, что может привести к тому, что будет найдена непоследовательная строка простых чисел и возникнут проблемы с неиспользованными ресурсами, когда следующее число будет проверенобольше, чем квадрат наибольшего найденного простого числа.
Мне кажется, что обе эти ситуации являются сложными только на ранних этапах построения списка простых чисел, но я не совсем уверен.Это делается для личного упражнения по прекращению такого рода работы.