初等数论
前言
感觉最近状态不是很好,写一篇笔记吧,
但是有感觉不知道写什么好,就写一篇总结吧 qwq
正文
- 基础筛法
其实就是每一步都判断一次,再加一步的优化;
bool isprime(int x){
if(x<=1) return 0;
for(int i=2;i<=sqrt(x);i++){
if(x%i==0) return 0;
}
return 1;
}
- 埃氏筛法
时间复杂度:
还可以,但是还是有些慢,
主要的原理就是从 2 开始,把每一个数的倍数都进行一次标记;
void isprime() {
bool p[1000001];
memset(p, 0, sizeof(p));
p[0] = p[1] = false;
for (int i = 2; i <= sqrt(n); i++) {
if (p[i]) {
for (int j = 2 * i; j <= n; j += i) {
p[i] = false;
}
}
}
}
- 线性筛(欧式筛)
时间复杂度:
从小到大不断累计因子;
void init() {
phi[1] = 1;
for (int i = 2; i < MAXN; ++i) {
if (!vis[i]) {
phi[i] = i - 1;
pri[cnt++] = i;
}
for (int j = 0; j < cnt; ++j) {
if (1ll * i * pri[j] >= MAXN) break;
vis[i * pri[j]] = 1;
if (i % pri[j]) {
phi[i * pri[j]] = phi[i] * (pri[j] - 1);
} else {
// i % pri[j] == 0
// 换言之,i 之前被 pri[j] 筛过了
// 由于 pri 里面质数是从小到大的,所以 i 乘上其他的质数的结果一定会被
// pri[j] 的倍数筛掉,就不需要在这里先筛一次,所以这里直接 break
// 掉就好了
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
}
}
}
表示 到 中,与 互质的正整数的个数;
定义:
其中, 、 ……直到 都是 的质因数;
因为懒,所以请直接食用那篇文章;
int ph[1000001];
void phi(int n) {
for (int i = 2; i <= n; i++) {
ph[i] = i;
}
for (int i = 2; i <= n; i++) {
for (int j = i; j <= n; j++) {
ph[j] = ph[j] / i * (i - 1);
}
}
}
,欧几里得算法,所谓的辗转相除
int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
当然,提到了欧几里得算法,就可以来看一眼拓展欧几里得,
给定任意两数 和
来看下面这个等式(当然如果你愿意也可以叫不定方程):
我们管解这个方程(其实是一种丢番图方程)的算法叫做拓展欧几里得;
如果求出来了一组特解
就可以求出来这个方程的通解
;
求出来这玩意其实就是为了来求一个叫做逆元
的东西;
顺便提一下逆元,
这个式子中, 我们称 是 关于 的乘法逆元;
int gcd(int a, int b,int &x,int &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
int ans = gcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * y;
return ans;
}
感觉自己没那个水平写成那样,再引用一篇
结尾
差不多就这些吧,想不出来写点啥了,如果有可以补充欢迎留言
本文作者:zsdqwq
本文链接:https://www.cnblogs.com/wo-de-bo-ke-wo-zuo-zhu/p/Legends_never_die.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步