【发布时间】:2012-09-29 19:08:13
【问题描述】:
所以我创建了以下方法来查找不超过某个数字的所有素数。关于如何加快速度的任何建议?
我这样称呼它;
interval = (value + NOOFTHREADS - 1) / NOOFTHREADS;
int max = interval * NOOFTHREADS;
tickets = new List<int>(NOOFTHREADS);
for (int i = 1; i <= NOOFTHREADS; i++)
{
tickets.Add(i * (max / NOOFTHREADS));
}
Enumerable.Range(1, NOOFTHREADS)
.AsParallel()
.ForAll(_ => findPrimes());
带有一些全局变量;
static List<int> vals = new List<int>();
static List<int> tickets;
static int interval = new int();
以及方法;
public static void findPrimes()
{
int myTicket;
lock (tickets)
{
myTicket = (int)tickets.Last();
tickets.RemoveAt(tickets.Count - 1);
}
var max = myTicket;
int min = max - interval +1;
int num;
var maxSquareRoot = Math.Sqrt(max);
var eliminated = new System.Collections.BitArray(max + 1);
eliminated[0] = true;
eliminated[1] = true;
for (int i = 2; i < (max) / 2; i++)
{
if (!eliminated[i])
{
if (i < maxSquareRoot)
{
num = ((min + i -1 )/i)*i;
if (num == i)
num = num + i;
for (int j =num; j <= max; j += i)
eliminated[j] = true;
}
}
}
for (int b = (int)min; b < max; b++)
{
if (!eliminated[b])
lock(vals)
vals.Add(b);
}
}
【问题讨论】:
-
如果您的编辑是为了表明您希望进一步加快速度,那应该是一个新问题。然而,正常的步骤是 1. 从筛子中消除偶数,这是一个大约 2 的因子,很简单; 2. 也消除 3 的倍数,这是大约 1.5 的进一步因子,并且仍然相对容易; 3. 消除更多小素数的倍数,随着回报的减少越来越困难 - 或使用由其他人认真调整的库,例如Kim Walisch 的 primeSieve (C++) 或 Daniel Bernstein 的 primegen (C)。
标签: c# math parallel-processing primes