【wqy】数论(未完
又双叒叕来清理数论==
整除
base
定义:
定义:对于两个正整数\(p\)和\(q\),若存在正整数\(x\),满足\(px=q\),则称\(p\)整除\(q\) ,记作\(p|q\)。
整除的相关性质:
自反性:\(p|p\)
传递性:\(p|q,q|r\to p|r\)
反对称性:\(p|q,q|p\to p=q\)
带余除法(欧几里得除法)
定义:对于正整数\(a,b\),存在唯一一对整数\((q,r)\),满足\(a=bq+r\)且\(0 \le r<b\)。称\(q\)为商,\(r\)为余数
存在性:存在\(a\Rightarrow\) 存在\(a+1\) \(a+l=bq+r+1\)
唯一性:\(a=bq_1+r_1=bq_2+r_2\) \(b(q_1-q_2)=r_2-r_1\Rightarrow b|r_2-r_1\) 而\(0\le r_1,r_2<|b|\) $\therefore r_2-r_1=0\Rightarrow $ 唯一
取整
下取整: 𝑥 = max{𝑘 ∈ 𝑍|𝑘 ≤ 𝑥}
上取整: 𝑥 = min{𝑘 ∈ 𝑍|𝑘 ≥ 𝑥}
取模
对于正整数𝑎, 𝑏,定义模运算为\(a\ mod\ b = a − ⌊\frac ab⌋b\)
注意在C++中,除法返回的结果是向0取整
欧几里得算法
最大公约数与最小公倍数
gcd 𝑥, 𝑦 = max{𝑣| 𝑣 𝑥 ∧ 𝑣 𝑦 }
lcm 𝑥, 𝑦 = min{𝑣| 𝑥 𝑣 ∧ 𝑦 𝑣 }
欧几里得算法:
当𝑦 ≠ 0时,有\(gcd(x,y)=gcd(y,x\ mod\ y)\)
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
扩展欧几里得算法
裴蜀定理:不定方程𝑎𝑥 + 𝑏𝑦 = 𝑐有解,当且仅当gcd 𝑥, 𝑦 |𝑐。
证明&求解:
必要性显然
充分性证明可以考虑在求解gcd的时候递归构造解。
\(\begin{align*}ax+by&=c\\b'x+a'(x\ mod\ y)&=c\\a'(x-|\frac xy|y)+b'y&=c\\a'x+(b'-a'|frac xy|)y&=x\end{align*}\)
每一次令\(a=a',b=b'-a'\lfloor\frac xy\rfloor\) 边界条件是当\(y=0\)时 \(a=\frac cx,b=0\)
void exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=1,y=0;return;}
exgcd(b,a%b,x,y);
ll t=x;x=y,y=t-(a/b)&y;
}
质数
base
- 定义:对于一个大于1的整数\(x\),如果它不被任何1 < 𝑦 < 𝑥的整数𝑦整除,那么称𝑥为质数或素数,否则称\(x\)为合数
- 定理:质数有无穷多个
证明:若有有限个质数\(p_1,p_2...p_m\),则令\(n=\Pi_{i=1}^mp_i\),则\(n+1\)不能被\(p1...p_m\)整除,所以\(n+1\)也是质数 - 设\(\le n\)的质数有\(\pi(n)\)个,则\(\pi(n)=O(\frac n{log\ n})\)
- 算数基本定理:任何正整数都能唯一表示成一些质数的幂的乘积
欧拉筛
尝试让一个合数只在枚举到它最小的质因子的时候被筛掉。
回顾埃氏筛的过程,当到达\(i\)时,我们顺次枚举当前的所有质数,并且筛掉这个质数乘\(i\)
因为要让这个质数是筛掉的合数的最小质因子,所以如果𝑖这个数包含\(p\)这个质因子,那么大于\(p\)的所有质数就不用枚举了,因为如果继续枚举得到的数最小质因子都会小于当前枚举的质数
比如现在有\(2,3,5\)这三个质数,现在\(i\)是6,那么枚举到\(2\)的时候发现\(2\)是\(6\)的质因子,所以后面的\(3\)和\(5\)都不用枚举了,因为\(3 × 6,5 × 6\)的最小质因子是\(2\),而不是\(3\)和\(5\)
void prime(int N){
memset(prime,0,sizeof(prime));
memset(v,0,sizeof(v));
for(int i=2;i<=N;++i){
if(!v[i]) v[i]=i,prime[++num_prime]=i;
for(int j=1;j<=num_prime&&i*prime[j]<=n;++j)
v[i*prime[j]]=prime[j];
if(!(i%prime[j])) break;
}
}
素性测试
定义法:\(O(n)\) 试除法:\(O(\sqrt n)\)或\(O(\frac{\sqrt n}{log \ n } )\)
Miller_Rabin:\(O(klogn)\)
Miller_Rabin素性测试
费马小定理:\(a_{p-1}\equiv1(mod\ p)\)
费马小定理的逆定理:\(\forall a\in[1,p-1],a^{p-1}\equiv1(mod\ p)\to p\) 是质数? 不一定成立
对于任何和\(n\)互质的数,\(a^{n-1}\equiv1\ mod\ n\)的合数被称为Carmichael Number
最小的Carmichael Number是\(561=11*51\),显然这个算法错误率很高
二次探测定理:
若\(p\)为质数 则对任意正整数\(x\),若\(x^2\equiv1(mod\ p)\)
则\(x\equiv 1\)或\(x\equiv p-1\equiv -1\)
这个定理的逆定理是成立的,可以用这个来判定素数找若干个满足\(x^2\equiv 1\)的整数\(x\),检查\(x\)是否为\(1\)或\(p-1\)
\(a^{p-1}\equiv1(mod\ p)\) \(a^{p-1}\)就是一个满足条件的\(x^2\)
我们可以将指数不断除以2,直到𝑎𝑘变成𝑝 − 1。当然也有可能一直是。
令\(p-1=k*2^r,t_i=k*2^i\),则若\(a^{t_i}\equiv1\),则\(a^{t_i}\equiv 1\)或\(a^{t_{i=1}}\equiv p-1\)
我们可以先用快速幂求出\(t_0\),然后每次求平方,如果它变成1了而上一个是\(p-1\),或者乘到最后它也没变成1,则\(p\)是一个合数
根据某玄学定理,单词探测正确率为34,实际应用中只需要探测前几个质数。
bool check(int p,ll n){
if(p==n) return 1;
if(qpow(p,n-1,n)!=1) return 0;
ll s=0,k=n-1;
while(!(k&1)) k>>=1,++s;
ll last=qpow(p,k,n);
for(int i=1;i<=s;++i){
ll nw=last*last%n;
if(nw==1) return last==n-1||last==1;
last=nw;
}
return 0;
}
Pollard_Rho质因数分解
对于一个合数\(n\),尝试找到一个因子\(d\),递归分解\(d\)和\(nd\),若\(n\)通过了素性测试那就停止分解
那么怎么找到这个因子呢?
直接随机?期望\(O(n)\)
随机一个数然后与\(n\)求gcd?\(O\sqrt n\)(为啥我们不直接暴力呢)
设𝑝是𝑛最小的质因子,如果我们找到了两个数𝑎, 𝑏,满足𝑎 ≡ 𝑏(mod 𝑝)但是𝑎 ≠ 𝑏 ,那么gcd 𝑛, 𝑎 − 𝑏 一定是𝑝的倍数。
根据生日悖论,每次随机一个数𝑥,期望随机𝑂 𝑝 次,就能找到两个数字模𝑝同余。
但是这样我们需要存储𝑂 𝑝 = 𝑂 𝑛14 个数(这公式有毒),内存开不下。
于是Floyd告诉我们,只需要存两个数就够了!
一般情况下,我们的伪随机数生成器是𝑥 = 𝑥02 +𝑎 mod 𝑛,这样的生成器生成的伪随机数一定是成环的。
想象两个小孩在一个环上跑步,第一个小孩一次跑一步,第二个小孩一次跑两步,那么这两个小孩一定会相遇。
所以,我们可以每次令𝑥1 = 𝑓 𝑓 𝑥1 , 𝑥2 = 𝑓 𝑥2 ,这样当两个数字的差与𝑛的gcd ≠ 1,即这两个数模𝑝相等时,我们便找到了𝑛的一个约数。
由生日悖论得出,找到一个约数的时间复杂度是𝑂 𝑛14 的。
特别需要注意的是这两个数字模𝑛同余的时候,这时候需要重新随机。
void Pollard_Rho(ll x){
if(Miller_Rabin(x)) return;
while(1){
ll a=rand()%x,v1=a,v2=f(a,x);
while(v1!=v2){
ll d=gcd(x,(v2-v1+x)%x);
if(d>1&&d!=x){
Pollard_Rho(max(d,x/d));
Pollard_Rho(min(d,x/d));
return;
}
v1=f(v1,x),v2=f(f(v2,x),x);
}
}
}
同余
base
定义: 满足以下四个性质的集合 𝑆,⋅ 叫做群:
封闭性:定义一种乘法运算⋅,使得∀𝑎, 𝑏 ∈ 𝑆,𝑎 ⋅ 𝑏 ∈ 𝑆。
结合律: 𝑎 ⋅ 𝑏 ⋅ 𝑐 = 𝑎 ⋅ 𝑏 ⋅ 𝑐
单位元:∃𝑒 ∈ 𝑆, ∀𝑎 ∈ 𝑆, 𝑎 ⋅ 𝑒 = 𝑎
逆元:∀𝑎 ∈ 𝑆, ∃𝑎−1 ∈ 𝑆, 𝑎 ⋅ 𝑎−1 = 𝑒
举例:\({-1,1},Q^*,R^*\)
群的性质:
单位元唯一,若存在两个单位元𝑒1, 𝑒2,则𝑒1 = 𝑒1𝑒2 = 𝑒2。
逆元唯一,若𝑎存在两个逆元𝑏, 𝑐,则\(b=b*(a*c)=(b*a)*c=c\)
模𝑝意义下的剩余系:一个不能被\(p\)整除的整数\(n\),对一个质数\(p\)取模:\(1,2,3,…,p − 1\)
这\(p-1\)个数字构成了一个群
乘法运算定义为模意义下的乘法
满足结合律 单位元是1 对于任意一个数,都有乘法逆元
费马小定理:任意一个数都存在逆元,那么我们很自然的想到,如何求出一个数的逆元
方法一:exgcd,等价于求\(ax-bp=1\)的解
方法二:费马小定理。证明用群
∀𝑎 ∈ 1, 𝑝 − 1 , 𝑎𝑝−1 ≡ 1 mod 𝑝
𝑎𝑝−2⋅ 𝑎 ≡ 1 mod 𝑝
也就是说,𝑎𝑝−2就是𝑎的乘法逆元。