首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何用算法高效寻找素数?

预计阅读时间:5 分钟 素数的定义很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。 不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。...首先你用 isPrime 函数来辅助的思路就不够高效;而且就算你要用 isPrime 函数,这样实现也是存在计算冗余的。 先来简单说下如果你要判断一个数是不是素数,应该如何写算法。...高效实现 countPrimes 高效解决这个问题的核心思路是和上面的常规思路反着来: 首先从 2 开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8…...我们可以稍微优化一下,让j从i的平方开始遍历,而不是从2 * i开始: for (int j = i * i; j < n; j += i) isPrim[j] = false; 这样,素数计数的算法就高效实现了...其最终结果是 O(N * loglogN),有兴趣的读者可以查一下该算法的时间复杂度证明。 以上就是素数算法相关的全部内容。怎么样,是不是看似简单的问题却有不少细节可以打磨呀? 反向思考方能出其不意!

2K40

素数推断算法(高效率)

大家好,又见面了,我是全栈君 chuanbindeng 的 素数推断算法 关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。...} 这就是最一般的求解n以内素数的算法。复杂度是o(n*sqrt(n)),假设n非常小的话,这样的算法(事实上这是不是算法我都怀疑,没有水平。...在程序设计竞赛中就必需要设计出一种更好的算法要求能在几秒钟甚至一秒钟之内找出n以内的全部素数。于是就有了素数筛法。 (我表达得不清楚的话不要骂我,见到我的时候扁我一顿我不说一句话。。。)...相比于一般的筛法,增加这两个优化后的筛法要高效非常多。高兴去的同学能够试着自己编敲代码看一看效率。我这里 有程序,须要的能够向我要。不懂得也能够问我。...这上面的全部的素数筛选的算法都能够再进一步化为二次筛选法,就是欲求n以内的素数,就先把sqrt(n)内的素数求 出来,用已经求得的素数来筛出后面的合数。

33110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    算法专题:如何用算法高效寻找素数?

    不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。...首先你用isPrime函数来辅助的思路就不够高效;而且就算你要用isPrime函数,这样实现也是存在计算冗余的。 先来简单说下如果你要判断一个数是不是素数,应该如何写算法。...高效实现 countPrimes 高效解决这个问题的核心思路是和上面的常规思路反着来: 首先从 2 开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8…...我们可以稍微优化一下,让j从i的平方开始遍历,而不是从2 * i开始: for (int j = i * i; j < n; j += i) isPrim[j] = false; 这样,素数计数的算法就高效实现了...其最终结果是 O(N * loglogN),有兴趣的读者可以查一下该算法的时间复杂度证明。 以上就是素数算法相关的全部内容。怎么样,是不是看似简单的问题却有不少细节可以打磨呀?

    67520

    高效判断素数方法

    孪生素数: 所谓孪生素数指的是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了。 若n≥6且n-1和n+1为孪生素数,那么n一定是6的倍数。...证明: ∵ n-1和n+1是素数 ┈┈┈┈┈ ① ∴ n-1和n+1是奇数 ∴ n是偶数,即n是2的倍数 ┈┈┈┈┈ ② 假设n不是3的倍数,得: n=3x+1 或 n=3x+2, 如果n=3x+1,则...由上面的规律可以推出下面结论: 若x≧1且n=6x-1或n=6x+1不是素数,那么n一定不是2和3的倍数。...∴n一定不是2和3的倍数。 素数出现规律: 当n≧5时,如果n为素数,那么n mod 6 = 1 或 n mod 6 = 5,即n一定出现在6x(x≥1)两侧。...3(2x+1),2(3x+2),它们一定不是素数,所以素数一定出现在6x的两侧。

    1.1K40

    素数筛选算法

    灵机一闪,思绪回到了大二算法课上,老师讲过一种叫做“筛法”的东东,不过好像记不太清了,我再想想… 半分钟后… 回来了,我感到它们全都回来了!...嗯…毫不留情,莫非还有更优的算法? “您容我再想想哈~”,陪着笑脸说完,双手抱头痛苦思考状/(ㄒoㄒ)/~~ 我的神呐…还有啥,还能怎么筛?...咋一看,算法阐述起来和普通的筛法并无二致,实际上,两者最重要的区别就在于: 有无重复筛除? 为什么有这个问题呢?...)证明这个算法的时间复杂度和正确性,要从以下两个方面: 每个数至少被访问一次 对于质数,一定会在 $i$ 的循环中访问到,并确定为质数。...因此整个算法的复杂度是 $O(n)$ 的。 面试结果 ---- hmmmmmmmm… 当然,很愉快的,即使是在面试官迟到了1小时的情况下,TT还是很给面子,没让我过,我记住了,哼!

    1.1K20

    五分钟小知识:如何用算法高效寻找素数?

    不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。...首先你用 isPrime 函数来辅助的思路就不够高效;而且就算你要用 isPrime 函数,这样实现也是存在计算冗余的。 先来简单说下如果你要判断一个数是不是素数,应该如何写算法。...高效实现 countPrimes 高效解决这个问题的核心思路是和上面的常规思路反着来: 首先从 2 开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8…...我们可以稍微优化一下,让j从i的平方开始遍历,而不是从2 * i开始: for (int j = i * i; j < n; j += i) isPrim[j] = false; 这样,素数计数的算法就高效实现了...其最终结果是 O(N * loglogN),有兴趣的读者可以查一下该算法的时间复杂度证明。 以上就是素数算法相关的全部内容。怎么样,是不是看似简单的问题却有不少细节可以打磨呀? ?

    45020

    漫画:高效的布隆算法

    x星球经过和y星球的激战后,x星球已经无法居住,重建需要很长的时间,因此迁移到why星球上。 ? ? ps: 假设每个人ip代表不同的用户。 ?...每段均为最大值的ip为255.255.255.255,8位正好可以表示一个255大小的数字,因此每8位表示一个数字,ip一共是4段,正好32位。 ?...ps:f1,f2,f3代表3个不同的hash函数。箭头指向的地方代表通过hash函数计算出的hash值同时也是在位图中的位置。 ? ? ? ? ? ?...ps:另外一般情况下不能从布隆过滤器中删除元素,由于有一些字符串计算的hash值可能会相同,此时我们会想到,把每个位置存上对应的次数,删除元素的时候同时减1,前面我们说过会有误判的情况,所以要安全的删掉元素不是这么简单...end:本文主要讲解布隆过滤器的算法思想,具体的实现我们可以去看guava中的BloomFIlter。 文章转载自公众号 JAVA小咖秀 , 作者 小小小咖

    43620

    漫画:高效的布隆算法

    转自:JAVA小咖秀 作者:小小小咖 x星球经过和y星球的激战后,x星球已经无法居住,重建需要很长的时间,因此迁移到why星球上。 ? ? ps: 假设每个人ip代表不同的用户。 ?...每段均为最大值的ip为255.255.255.255,8位正好可以表示一个255大小的数字,因此每8位表示一个数字,ip一共是4段,正好32位。 ?...ps:f1,f2,f3代表3个不同的hash函数。箭头指向的地方代表通过hash函数计算出的hash值同时也是在位图中的位置。 ? ? ? ? ? ?...ps:另外一般情况下不能从布隆过滤器中删除元素,由于有一些字符串计算的hash值可能会相同,此时我们会想到,把每个位置存上对应的次数,删除元素的时候同时减1,前面我们说过会有误判的情况,所以要安全的删掉元素不是这么简单...end:本文主要讲解布隆过滤器的算法思想,具体的实现我们可以去看guava中的BloomFIlter。

    45040

    Knuth高效洗牌算法

    仔细分析发现,这个算法非常精巧,每次遍历都是将当前的数i和已经在数组中的随机一个数m[j]进行交换,最终达到了公平随机整个数组的作用。虽然只有短短3行代码,却让人有种震撼的感觉。...顿时觉得golang很NB,确实很高效。...网上搜索了一下高效洗牌算法,又发现python里面也有这样的函数,这样写的: for(int i = N - 1; i >= 0 ; i -- ) swap(arr[i], arr[rand(0..., i)]) // rand(0, i) 生成 [0, i] 之间的随机整数 而这个算法的出处竟然来自于TAOCP!...算法就是大名鼎鼎的 Knuth-Shuffle,即 Knuth 洗牌算法。 看似简单的问题,竟然又扯出Knuth,大意了。 能把一件小事情做到极致的人,可以称之为艺术家。Knuth名副其实。

    73220

    素数的筛法

    素数的筛法有很多种 在此给出常见的三种方法 以下给出的所有代码均已通过这里的测试 埃拉托斯特尼筛法 名字好长 :joy:  不过代码很短 思路非常简单,对于每一个素数,枚举它的倍数,它的倍数一定不是素数...看来这种算法还是不够优秀 下面我们来探索一下他的优化 另外,这种算法的时间复杂度:$O(n*logn)$ 埃拉托斯特尼筛法优化版 根据唯一分解定理 每一个数都可以被分解成素数乘积的形式 那我们枚举的时候...果然,加了优化之后这种算法快了不少 可以证明,它的复杂度为: 这种算法已经非常优秀了,但是对于 这种极端数据,还是有被卡的风险 那么,还有没有更快的筛法呢? 答案是肯定的!...,那么两个素数的乘积一定没有被筛过,可以避免重复筛 当i不是素数的时候 程序中有一句非常关键的话 1 if(i%prime[j]==0) break; 这句话可以保证:本次循环只能筛出不大于 的数...可以看出这种算法的时间效率是非常高的! 时间复杂度:严格 总结 在一般情况下,第二种筛法已经完全够用。 第三种筛法的优势不仅仅在于速度快,而且还能够筛积性函数,像欧拉函数,莫比乌斯函数等。

    1.3K60
    领券