Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是测试特殊素数的最快方法和新方法吗?_C++_Algorithm_Math_Primes - Fatal编程技术网

C++ 这是测试特殊素数的最快方法和新方法吗?

C++ 这是测试特殊素数的最快方法和新方法吗?,c++,algorithm,math,primes,C++,Algorithm,Math,Primes,示例代码: bool is_special_prime (int N) { QHash<int, int> o; struct A_functor { int operator()(unsigned int n) { return n >> __builtin_ctz(n);} }A; int k = A(N + 1); if(k == 1) return 0; o[k] = k; int t = (N - 5) >&

示例代码:

bool is_special_prime (int N) {
  QHash<int, int> o;
  struct A_functor
  {
    int operator()(unsigned int n) { return n >> __builtin_ctz(n);}
  }A;
  int k = A(N + 1);
  if(k == 1)
    return 0;
  o[k] = k;
  int t = (N - 5) >> 1;
  for(int i = 0; i < t; i++) {
      k = A(N + k);
      if(k == 1 || o.contains(k))
        return 0;
      o[k] = k;
  }
  return 1;
}
bool是特殊素数(int N){
qo;
结构A_函子
{
int运算符()
}A;
int k=A(N+1);
如果(k==1)
返回0;
o[k]=k;
int t=(N-5)>>1;
for(int i=0;i

这样可以测试大于最新最大素数2^57885161的数字吗− 1?

您正在传递
int
类型,该类型可以在32位系统上保存范围
-2^31到2^31-1
的数字。您不能使用它来测试您提到的一些顺序

这样可以测试大于最新最大素数2^57885161的数字吗− 1号

如果您使用的平台
int
的宽度至少为57885162位,那么可以(假设您的算法是正确的,我没有检查)

现在,让我们严肃地说几秒钟:现在的消费级计算机最多使用64位宽的整数,你可以看到,从假设的平台上看,这是一个相当长的距离


如果你想执行这样的计算,你需要用BigNum库替换
int

你读过Lucas Lehmer吗?听起来,在你找到测试素数的新的、更快的方法之前,你还有更多的研究要做。首先尝试使用bignum库实现Lucas Lehmer

您的算法迭代次数高达N/2,远不是很快,实际上非常慢(比素数seive慢得多)。它也找不到一个大于2^32或2^64的素数,也就是比2^57885161小一点的素数。你知道为什么这么慢吗?它不能返回1,直到它在小于N/2的i值上循环


我还没有检查您的代码是否准确地确定素数。

也许您可以解释一下该算法的作用,以及为什么您认为它可以用作素数测试?即使如此,这里可能没有足够的前沿数字理论家来验证您的算法是否正确和新颖。大概,
N
是潜在梅森素数(例如57885161)的指数,而不是素数本身(对于
int
,它显然太大了)。它是正确的和新颖的。这种方法与int无关,这只是示例代码。如果你知道它是正确的和新颖的,你为什么在这里问一些模糊的问题,而不是发表你开创性的研究?如果没有,那么你需要问一个更清楚的问题;如果不知道单字母变量代表什么以及算术的位数应该实现什么,代码有点难以理解。我说它是正确的和新颖的,但我不确定,所以我问。@miket我想说试试math.stackexchange.com,但在提问之前,您必须通过解释进一步扩展您的答案(因此接受涵盖所有经验范围的问题,而math.stackexchange只允许高级问题)。这是与范围无关的示例代码,您知道如果测试数大于最新的最大素数2^57885161− 你需要更多的东西。是的,我以前读过卢卡斯·莱默。它最多迭代N/2次,但只进行加法和右移。你知道Lucas Lehmer需要大规模的squre。@miket但是Lucas Lehmer只需要
O(logn)
算术运算。即使是简单的乘法和除法实现,它也会将加法和移位吹出水面− 1 Lucas Lehmer需要3年,如果使用最快的计算机,新的只需要不到1秒。@miket这是因为你的测试明确排除了表
2^n-1
中的所有数字作为第一步。所以在这些方面,它当然很快。但这对确定这样一个数字是否是素数毫无帮助。它也非常快地排除了一些其他特殊形式,但一般来说需要很长时间才能完成。按平方根进行试除平均算法复杂度较低。