【发布时间】:2010-08-13 21:27:00
【问题描述】:
我知道素数发现已经得到很好的研究,并且有很多不同的实现。我的问题是,使用提供的方法(代码示例),我该如何分解工作?它将运行的机器有 4 个四核超线程处理器和 16GB 内存。我意识到可以进行一些改进,特别是在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;
}
}
}
我看到了 2 种基本方案:1)使用所有线程来测试单个数字,这可能对更高的素数非常有用,但我真的想不出如何实现它,或者 2)使用每个线程来测试单个可能的素数,当下一个要测试的数字大于找到的最高素数的平方时,这可能会导致找到不连续的素数串并遇到未使用的资源问题。
对我来说,这两种情况都只是在构建素数列表的早期阶段才具有挑战性,但我并不完全确定。这样做是为了个人练习打破这种工作。
【问题讨论】:
标签: multithreading parallel-processing primes