检查 Prime 扩展
Check Prime Extension
此方法应检查一个数是否为质数
public static bool IsPrime(this long value)
{
if (value < 2)
{
return false;
}
else
{
int boundary = (int)Math.Floor(Math.Sqrt(value));
return Enumerable.Range(2, boundary-1).AsParallel().Any(x => value % x != 0);
}
}
但并非在所有情况下都有效。例如。根据此方法,9
是素数,但 3x3=9
是错误的。我没有看到方法中的错误。
您可以试试下面的代码,效率更高:
var primes = Enumerable.Range(1, 20)
.Where(i => i != 1 && !Enumerable.Range(2, i - 2).Any(j => i % j == 0));
忽略这不是与 AsParallel() 一起使用的事实,你的问题是
return Enumerable.Range(2, boundary - 1).AsParallel().Any(x => value % x != 0);
应该是
return Enumerable.Range(2, boundary - 1).AsParallel().All(x => value % x != 0);
您应该一直在使用 .All()
,而不是 .Any()
。
反转条件:
return !Enumerable.Range(2, boundary - 1).AsParallel().Any(x => value % x == 0);
此方法应检查一个数是否为质数
public static bool IsPrime(this long value)
{
if (value < 2)
{
return false;
}
else
{
int boundary = (int)Math.Floor(Math.Sqrt(value));
return Enumerable.Range(2, boundary-1).AsParallel().Any(x => value % x != 0);
}
}
但并非在所有情况下都有效。例如。根据此方法,9
是素数,但 3x3=9
是错误的。我没有看到方法中的错误。
您可以试试下面的代码,效率更高:
var primes = Enumerable.Range(1, 20)
.Where(i => i != 1 && !Enumerable.Range(2, i - 2).Any(j => i % j == 0));
忽略这不是与 AsParallel() 一起使用的事实,你的问题是
return Enumerable.Range(2, boundary - 1).AsParallel().Any(x => value % x != 0);
应该是
return Enumerable.Range(2, boundary - 1).AsParallel().All(x => value % x != 0);
您应该一直在使用 .All()
,而不是 .Any()
。
反转条件:
return !Enumerable.Range(2, boundary - 1).AsParallel().Any(x => value % x == 0);