当前位置: 首页 > 知识库问答 >
问题:

使用GCD查找从1到N的所有素数(筛选eratothenes的另一种方法)

斜瑞
2023-03-14

查找从1到N的所有素数。

我知道我们通常使用厄拉多塞的筛子来处理这个问题,我有一个使用gcd的替代方法,我想听听你的意见。

我的方法-

如果所有质数都被处理到任何迭代,则保留一个保持变量。如果这个var的gcd,那么数字i==1。这意味着数字是co-prime,所以i必须是prime。

For ex: gcd(210,11) == 1,所以11是素数。{210=2*3*5*7}

伪代码:

Init num_list={contains numbers 2 to N} [since 0 and 1 arent prime nos.]
curr_gcd = 2, gcd_val=1
For i=3;i<=N;i++
    gcd_val=__gcd(curr_gcd,i)
    if gcd_val == 1 //(prime)
          curr_gcd = curr_gcd * i
    else //(composite so remove from list)
         numList.remove(i)

或者,我们也可以有一个列表,并将质数推送到该列表中。SC=O(N)TC=O(N-log(N))[TC使用欧氏方法计算gcd=

这看起来对吗,或者我在这里计算TC不正确。请就此发表你的看法。蒂亚!

共有2个答案

郎喜
2023-03-14

也许你的方法理论上是正确的,但很明显,它并不优秀。

它的效率比SoE差,它需要的数据范围太大。所以也许它看起来很优雅,但很难使用。

在我看来,“找出从1到N的所有素数”已经是一个众所周知的问题,这意味着它的解决方案是经过深思熟虑的。

起初,也许我们用蛮力来处理它。

int primes[N],cnt;//store all prime numbers
bool st[N];//st[i]:whether i is rejected
void get_primes(int n){
    for(int i=2;i<=n;i++){
        if(st[i]) continue;
        primes[cnt++]=i;
        for(int j=i+i;j<=n;j+=i){
            st[j]=true;
        }
    }
}

这是一个O(n^2)时间算法。太慢了,无法忍受。

请便。我们有SOE,它使用O(nlognlogn)时间。

但是我们有一个更好的算法叫做“线性筛”,它只用O(n)时间,正如它的名字一样。我是这样用C语言实现的。

int primes[N],cnt;
bool st[N];
void get_primes(int n){
    for(int i=2;i<=n;i++){
        if(!st[i]) primes[cnt++]=i;
        for(int j=0;primes[j]*i<=n;j++){
            st[primes[j]*i]=true;
            if(i%primes[j]==0) break;
        }
    }    
}

这个O(n)算法被我用来爱上这种出现在主要IT公司和许多OJ中的算法问题。

拓拔俊德
2023-03-14

看起来我的方法的时间复杂度更接近O(log^2(n)),正如许多人在评论中指出的那样。

此外,随着N的增加,curr_gcd变量会变得非常大,并且肯定会溢出int和long大小限制。

感谢所有回复的人!

 类似资料:
  • 我想了解从另一个数组的所有元素中筛选一个数组的最佳方法。我尝试了筛选函数,但我不知道如何给它我想要删除的值。 类似内容: 如果过滤器功能不是有用的,你将如何实现它? 编辑:我检查了可能重复的问题,对于那些容易理解javascript的人来说,它可能很有用。如果答案被检查为好,事情就会变得简单。

  • 问题内容: 好吧,这是我很多次遇到的难题-给定一组12个球,其中一个有缺陷(重量较小或较大)。您可以称量3次以找出有缺陷的产品,并告诉您称重的是更少还是更多。 存在解决此问题的方法,但是我想知道我们是否可以通过算法确定给定一组“ n”个球是否需要使用光束平衡来确定哪一个有缺陷以及如何(更轻或更重)。 问题答案: 可以在这里找到Jack Wert的精彩算法 http://www.cut-the-kn

  • 问题内容: 我试图遍历2个数组,外部数组则比另一个数组更长。它将循环遍历第一个,如果第二个数组不包含该int,它将返回false。但是我不知道该怎么做。这是我到目前为止所拥有的: 运行时出现此错误: 我想知道是否可以不使用嵌套循环(如上)来完成。我知道我做错了,如果有人可以在此问题上提供帮助,那就太好了。我也不确定要在Java文档中寻找什么类。 问题答案: 您可以检查较大的数组是否包含较小数组中的

  • 本文向大家介绍查找两个数字的GCD,包括了查找两个数字的GCD的使用技巧和注意事项,需要的朋友参考一下 在数学中,最大公约数(GCD)是最大可能的整数,该整数将两个整数相除。条件是数字必须为非零。 我们将遵循欧几里得算法来找到两个数字的GCD。 输入输出 算法 输入:两个数字a和b。 输出: a和b的GCD。 示例 输出结果

  • 问题内容: 我有一组〜36,000个多边形,代表该国家的一个分区(〜县)。我的python脚本收到很多点:pointId,经度,纬度。 对于每个点,我想发送回pointId,polygonId。对于每个点,循环进入所有多边形并使用myPoint.within(myPolygon)效率很低。 我想匀称的库提供了一种更好的方式来准备多边形,以便找到一个点的多边形成为树路径(国家,地区,子地区…) 到目

  • 问题内容: 注意: 下面的版本2使用Eratosthenes筛。有几个答案可以帮助我解决最初提出的问题。我选择了Eratosthenes的Sieve方法,实现了该方法,并适当地更改了问题标题和标签。感谢所有提供帮助的人! 介绍 我写了这个花哨的小方法,它生成一个整数数组,该数组包含小于指定上限的质数。它工作得很好,但我有一个担心。 方法 我的顾虑 我担心的是,我创建的数组对于该方法将返回的最终元素