var timer = new Stopwatch();
timer.Start();
ListThePrimes();
timer.Stop();
TimeSpan timeTaken = timer.Elapsed;
string foo = timeTaken.ToString(@"m\:ss\.fff");
MessageBox.Show("The sum is " + sum + ". It took this program " + foo + " seconds to run.");
如果有人可以让我知道是否有更有效的方法来执行此操作。
您需要优化如何获得质数,您的方式极低效率。这样做的常见方法是使用eratosthenes的sive。使用此方法,我可以轻松地获得最高100000毫秒的所有质数。总结它们是微不足道的。
var n = 100000;
var a = Enumerable.Range(0,n+1).Select(_ => true).ToArray();
for(var i=2;i<Math.Sqrt(n);i++)
{
if(a[i])
{
for(var j = i*i;j<=n;j += i)
{
a[j] = false;
}
}
}
var result = a.Select( (x,i) => new {IsPrime = x,Prime = i})
.Where(x => x.IsPrime && x.Prime > 1)
.Sum(x => x.Prime);
Console.WriteLine(result);
基本上,我们正在求和所有数字f(n,1),然后减去所有是prime p,f(n/p,p)的倍数的所有数字,但是我们将所有是p.q倍数的数字减去所有数字对于两个素数。因此,我们需要添加F(N/(P.Q),P.Q)。但是随后我们仔细计数数字是P.Q.R等的倍数
非平方数字的möbius函数为零,否则具有正确的符号。 thus,∑_p f(p)= ∑_n [µ(n).n]。(n/n)。(n/n+1)/2(隐含整数除法)。然后,我们可以使用dirichlet双曲线方法