浅析数论--埃氏筛/欧拉筛/杜教筛
一个合数的约数总是成对出现的,如果
只需要判断较小的那一个数能否整除n就行了,即只需枚举
为何不用
(1)试除法判断素数
bool is_prime(int x) { if (x < 2) return false; for (int i = 2; i <= x / i; i ++ )//核心代码 if (x % i == 0) return false; return true; }
(2)试除法分解质因数(唯一分解定理)
void divide(int x) { for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) { int s = 0; while (x % i == 0) x /= i, s ++ ; cout << i << ' ' << s << endl; } if (x > 1) cout << x << ' ' << 1 << endl; cout << endl; }
(3)一个合数分解而成的质因数最多只包含一个大于 的质因数。
反证法,若
可以被分解成两个大于 的质因数,则这两个质因数相乘的结果大于 ,与事实矛盾
(4)当枚举到某一个数 的时候, 的因子里面已经不包含 里面的数,
如果
(5)算数基本定理(唯一分解定理):任何一个大于1的自然数 ,如果 不为质数,那么 可以唯一分解成有限个质数的乘积
这样的分解称为
此定理可推广至更一般的交换代数和代数数论。
(6)质因子(或质因数)在数论里是指能整除给定正整数的质数。根据算术基本定理,不考虑排列顺序的情况下,
每个正整数都能够以唯一的方式表示成它的质因数的乘积。
(7)两个没有共同质因子的正整数称为互质。因为 没有质因子, 与任何正整数(包括 本身)都是互质。
(8)只有一个质因子的正整数为质数。
(1)做法:把
(2)原理:假定有一个数p是质数
(3)调和级数:当
(4)底数越大,
(5)时间复杂度:约为
(1)质数定理:
(2)原理:在朴素筛法的过程中只用质数项去筛.
(3)时间复杂度:粗略估计:
(4)
(1)若
(2)思考:一:线性筛法为什么是线性的?
二:线性筛法的原理是什么?
(3)核心:
(4)原理:
然后每一个数都只有一个最小质因子,因此每个数都只会被筛一次,因此线性筛法是线性的.
(5)枚举到if(i%primes[j]==0) break;
(6)因为从小到大枚举的所有质数,所以当i%primes[j]!=0
时,primes[j]
一定小于
primes[j]
一定是primes[j]*i
的最小质因子.
(7)因为是从小到大枚举的所有质数,所以当i%primes[j]==0
时,primes[j]
一定是
而primes[j]
又是primes[j]
的最小质因子,因此primes[j]
是i*primes[j]
的最小质因子.
(8)关于
注:首先要把握住一个重点:我们枚举的时候是从小到大枚举的所有质数
1.当i%primes[j]==0
时,因为是从小到大枚举的所有质数,所以primes[j]
就是i的最小质因子,而primes[j]
又是其本身
primes[j]
的最小质因子,因此当i%primes[j]==0
时,primes[j]
是primes[j]i
的最小质因子.
2.当i%primes[j]!=0
时,因为是从小到大枚举的所有质数,且此时并没有出现过有质数满足i%primes[j]==0
,
因此此时的primes[j]
一定小于i的最小质因子,而primes[j]
又是其本身primes[j]
的最小质因子,
所以当i%primes[j]!=0
时,primes[j]
也是primes[j]i
的最小质因子.
3.综合1,2得知,在内层primes[j]
都是primes[j]i
的最小质因子,因此st[primes[j]i]=true
语句就是用primes[j]i
这个数的最小质因子来筛掉这个数.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具