初等数论总结

线性筛法

维护一个质数表。
对于每个数a,从小到大枚举所有质数b,将a*b打上标记。如果b|a,停止枚举。
可以证明每个合数会被它的最小的质因子打上标记。
时间复杂度O(n)

拓展欧几里得

如何解方程ax+by=c
a,b,c是常数,x,y是变量,x1,y1是方程的一组解
a1=bb1=a%ba1*x1+b1*y1=c
b*x1+(a-[a/b]*b)*y1=c
a*y1+b*(x1-[a/b]*y1)=c
那么x=y1y=x1-[a/b]y1
时间复杂度O(logn)

Stein算法

辗转相除法求gcd(a,b)时涉及除法和取模,常数太大了。
换成Stein算法吧!

  1. a,b为偶数,则gcd(a,b)=2*gcd(a/2,b/2)
  2. a为奇数,b为偶数,则gcd(a,b)=gcd(a,b/2)
  3. a,b为奇数。假设a>=b,则gcd(a,b)=gcd((a-b)/2,b)
  4. a为0,则返回b

>>1代替/2的操作,用&1代替%2
时间复杂度仍然是O(logn),但是除法和取模换成了位运算。

快速幂

如何求a^b mod p
b为偶数时,a^b ≡ (a^(b/2))^2
b为奇数时,a^b ≡ (a^⌊b/2⌋)^2*a
递归处理a^⌊b/2⌋
时间复杂度O(logb)

线性求逆元

给定质数p,求出1至p-1的逆元。
inv(i) ≡ -[p/i]*inv(p%i)
证明
i*[p/i]+p%i ≡ 0
-i*[p/i] ≡ p%i
i*(-[p/i]* inv(p%i)) ≡ 1
inv(i)=-[p/i]*inv(p%i)
inv[i]=(p-p/i)*inv[p%i]%p

快速求逆元

给定x和p,快速求出x在mod p意义下的逆元.
x*x^(-1) ≡ 1 (mod p)
x*x^(-1)=kp+1
x*x^(-1)+(-p)*k=1
使用拓展欧几里得求解。
拓展欧几里得太麻烦了,有没有更方便的做法?
x*x^(φ(p)-1) ≡ 1 (mod p)
inv(x)=x^(p-2)%p

费马小定理

p是质数,则ap-1 ≡ 1 (mod p)
{a,2a,…,(p-1)a}={1,2,…,p-1}
a* 2a* … * (p-1)a ≡ 1* 2 * … * (p-1)
ap-1*(p-1)! ≡ (p-1)!
ap-1 ≡ 1

欧拉定理

(a,p)=1,则aφ(p) ≡1 (mod p)
φ(p)=nx1…xn1p-1中与p互质的数,{x1a,x2a,…,xna}={x1,x2,…,xn}
x1a* x2a* …* xna ≡ x1* x2* …*xn
an ≡ 1

中国剩余定理

解方程x ≡ai (mod pi),其中pi两两互质。
qij表示pi在模pj意义下的逆元。
x ≡ Σ(ai* π(pj * qji)) (mod p1 * p2 *…pn)
如果pi不互质,将每个pi拆分成质数的幂。
比如把a≡7 (mod 12),拆成a≡1 (mod 3)a≡3 (mod 4)

求欧拉函数

求出φ(1)φ(n)
i= p1a1*… *pkak
φ(i)=i* (1-1/p1)* …* (1-1/pk)=p1a1-1* …* pkak-1* (p1-1)* …*(pk-1)
用线性筛求出每个数的最小质因数xi
xi | i/xi,则φ(i)=φ(i/xi)* xi,否则φ(i)=φ(i/xi)* (xi-1)

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值