数论算法
质数
试除法-判定 O(sqrt(n))
1 | bool is_prime(int x) |
试除法-分解质因数 O(log n) - O(sqrt(n))
1 | void divide(int x) |
朴素筛法求素数
1 | int primes[N], cnt; // primes[]存储所有素数 |
线性筛法求素数
介绍参考文末引用文章
1 | int primes[N], cnt; // primes[]存储所有素数 |
试除法求约数
1 | vector<int> get_divisors(int x) |
求欧拉函数
欧拉函数是求小于等于n的数中与n互质的数的数目
1 | int phi(int x) // phi 是欧拉函数/fa/读音 |
筛法求欧拉函数
法一
1 | int primes[N], cnt; // primes[]存储所有素数 |
法二
来自博客园
需要用到如下性质
p为质数
$phi(p)=p-1$ 因为质数 p 除了 1 以外的因数只有 p,故 1 至 p 的整数只有 p 与 p 不互质
如果i mod p = 0, 那么 $phi(i * p)=phi(i) * p$
若i mod p ≠0, 那么 $phi( i * p )=phi(i) * ( p-1 )$
1 |
|
快速幂
原理:$A^{n}=(A^{n/2})^2$
如果是偶数幂,计算平方根次幂
如果是奇数幂,计算$n - 1$次幂
递归实现(伪代码)
1 | int binpow(int a,int n){ |
利用十进制转二进制的原理,可以进行非递归运算
非递归优化(C++)(位运算)
1 | int binpow(int a,int n){ |
GCD 最大共因子
1 | 方法1 gcd(a,b)=gcd(b,a mod b) if b == 0 return |
可扩展至 gcd(a,b,c,…,n)