基础数论入门
2017-08-12 17:02
134 查看
(一)定理和性质
一、裴蜀定理
如果 a,b∈Na,b∈N , (a,b)=d(a,b)=d 那么一定存在 x,yx,y 使得 d|(a∗x+b∗y)d|(a∗x+b∗y)证明:非常简单,鉴于可能有数论刚入门的OIer所以这里简单证明一下:
因为(a,b)=d(a,b)=d
所以我们就可以假设 a=p∗da=p∗d , b=q∗db=q∗d
那么a∗x+b∗y=p∗d∗x+q∗d∗y=d∗(p∗x+q∗y)a∗x+b∗y=p∗d∗x+q∗d∗y=d∗(p∗x+q∗y) 得证
二、整除的性质
a|c,b|c,(a,b)=1⇒ab|ca|c,b|c,(a,b)=1⇒ab|ca|bc,(a,b)=1⇒a|ca|bc,(a,b)=1⇒a|c
p|ab⇒p|a或p|bp|ab⇒p|a或p|b
正确性显然
三、同余
a≡b(mod m)⇐⇒m|(a−b)a≡b(mod m)⇐⇒m|(a−b)a≡b(mod m),a≡b(mod n)⇒a≡b(mod [m,n])a≡b(mod m),a≡b(mod n)⇒a≡b(mod [m,n])
(k,m)=d,k∗a≡k∗a′(mod m)⇒a≡a′(mod md)(k,m)=d,k∗a≡k∗a′(mod m)⇒a≡a′(mod md)
第二个式子证明:
(a−b)=x∗m=y∗n=k∗[m,n](a−b)=x∗m=y∗n=k∗[m,n]
第三个式子证明:
k=q∗d,m=p∗dk=q∗d,m=p∗d
k∗a−k∗a′=c∗mk∗a−k∗a′=c∗m
a−a′=c∗mk=c∗mq∗d=cq∗mda−a′=c∗mk=c∗mq∗d=cq∗md
四、逆元
如果(b,m)=1(b,m)=1,那么存在b−1b−1 使得b∗b−1≡1(mod m)b∗b−1≡1(mod m)P.S:这个-1次方只是表示逆元一个符号 并不是真的-1次方 但是可以把它当成-1次方在同余中进行运算
五、剩余系
任何m个分别属于m个剩余类的数组组成剩余系六、φ
所有的n满足0<n≤m0<n≤m,(n,m)=1(n,m)=1 构成了一个模m的简化剩余系,简称缩系记录这样的n的个数为φ(m)φ(m)
七、关于缩系的一个定理
如果(m,m′)=1(m,m′)=1,a取遍模m的缩系,a’取遍模m’的缩系,那么a∗m′+a′∗ma∗m′+a′∗m 取遍模m∗m′m∗m′的缩系证明自己yy一下好啦
八、欧拉定理
如果(a,m)=1(a,m)=1,那么aφ(m)≡1(mod m)aφ(m)≡1(mod m)证明:
当x取遍模m的缩系时,ax也取遍模m的缩系(这个自己yy一下,具体证明不太会说qwq)
所以我们可以得出∏x≡∏a∗x(mod m)∏x≡∏a∗x(mod m)
∏a∗x≡aφ(m)∏x∏a∗x≡aφ(m)∏x
用处:如果(a,m)=1(a,m)=1,abmod mabmod m可以转化成 ab mod φ(m)mod mab mod φ(m)mod m
如果(a,m)≠1(a,m)≠1,ab≡amin(b mod φ(m)+φ(m),b) mod mab≡amin(b mod φ(m)+φ(m),b) mod m
九、拉格朗日定理
对于一个次数为n的多项式F(x),F(x)≡0(mod p)F(x)≡0(mod p)至多min(n,p)min(n,p)个解。十、二次剩余
对于一个奇素数p,如果存在x使得x2≡a(mod p)x2≡a(mod p),那么称a为p的二次剩余。如果ap−12≡1(mod p)ap−12≡1(mod p),那么a为p的二次剩余。
如果ap−12≡−1(mod p)ap−12≡−1(mod p),那么a为p的二次非剩余。
十一、威尔逊定理
(p−1)!≡−1(mod p)(p−1)!≡−1(mod p)证明:2到p-2这些数都存在逆元,可以两两匹配
十二、阶
如果(a,m)=1(a,m)=1 那么记x为最小的正整数使得ax≡1(mod m)ax≡1(mod m)结论:x|φ(m)x|φ(m)
证明:反证法,设有一个最小的x , )=q∗x+r" role="presentation">φ(m)=q∗x+rφ(m)=q∗x+r ,
则 aq∗x+r≡1(mod m)aq∗x+r≡1(mod m)
ax≡1(mod m)ax≡1(mod m) 推出 ar≡1(mod m)ar≡1(mod m)
因为x是最小的满足条件的正整数 ,r<xr<x ,所以r=0r=0
十三、原根
如果g(mod m)g(mod m) 的阶为φ(m)φ(m) 那么g为m的原根g0,g1,…,gφ(m)−1g0,g1,…,gφ(m)−1 构成了模m的缩系。
只有1,2,4,pa,2pa1,2,4,pa,2pa存在原根。
十四、其他
φ(p∗e)=(p−1)∗p∗e−1φ(p∗e)=(p−1)∗p∗e−1φ(m)=m∗∏p|m(1−1/p)φ(m)=m∗∏p|m(1−1/p)(容斥原理求φ)
(二)算法
一、辗转相除法
直接贴代码吧,证明网上有详解,这里不再赘述int gcd(int a,int b) { if (b==0) return a; else return gcd(b,a%b); }
二、扩展欧几里得算法
用处:求解形如a∗x+b∗y=gcd(a,b)a∗x+b∗y=gcd(a,b)的二元方程和线性同余方程(a∗x≡b(mod m)a∗x≡b(mod m) 等价于 a∗x+m∗y=ba∗x+m∗y=b)
推导:假设解出一组解(p,q)(p,q)
p∗a+q∗b=gcd(a,b)p∗a+q∗b=gcd(a,b)
= gcd(b,a mod b)=p∗b+q∗(a mod b)=p∗b+q∗(a−(ab)∗b)gcd(b,a mod b)=p∗b+q∗(a mod b)=p∗b+q∗(a−(ab)∗b)
= p∗b+q∗a−q∗(ab)∗b=(p−q∗(ab))∗b+q∗ap∗b+q∗a−q∗(ab)∗b=(p−q∗(ab))∗b+q∗a
代码
int extended_gcd(int a,int b,int &x,int &y) { int ret,tmp; if (!b) { x=1;y=0;return a; } ret=extended_gcd(b,a%b,x,y); tmp=x; x=y; y=tmp-a/b*y; return ret; }
一个神奇的小结论:
对方程a∗x+b∗y=ca∗x+b∗y=c,一组整数解为 (x0,y0)(x0,y0) ,
则它的任意整数解可以写成 (x0+k∗b′,y0−k∗a′)(x0+k∗b′,y0−k∗a′) ,其中a′=agcd(a,b)a′=agcd(a,b),b′=bgcd(a,b)b′=bgcd(a,b)
证明:
如果我们现在有解(x1,y1)(x1,y1),任取另外一组解(x2,y2)(x2,y2),则
a∗x1+b∗y1=a∗x2+b∗y2=gcd(a,b)a∗x1+b∗y1=a∗x2+b∗y2=gcd(a,b)
变形可以得到a∗(x1–x2)=b∗(y2–y1)a∗(x1–x2)=b∗(y2–y1)
两边同时除以gcd(a,b)gcd(a,b)
得到a′∗(x1–x2)=b′∗(y2–y1)a′∗(x1–x2)=b′∗(y2–y1)
因为(a′,b′)=1(a′,b′)=1,所以 (x1−x2)(x1−x2) 一定是b’的倍数
取x1−x2=k∗b′x1−x2=k∗b′,得y2−y1=k∗a′y2−y1=k∗a′
三、求逆元
由于aφ(m)≡1(mod m)aφ(m)≡1(mod m) 那么a−1≡aφ(m)−1(mod m)a−1≡aφ(m)−1(mod m)如果m为素数,那么答案为am−2am−2
否则解线性同余方程
四、线性求1到n的逆元
设f(i)=i! mod p,g(i)=i!−1 mod pf(i)=i! mod p,g(i)=i!−1 mod pg(i)=g(i+1)∗(i+1)g(i)=g(i+1)∗(i+1)
i−1=f(i−1)∗g(i)i−1=f(i−1)∗g(i)
算出fnfn然后求出fnfn的逆元gngn,递推即可。
五、线性同余方程组(CRT)
形如x≡ai(modmi)x≡ai(modmi)解法:增量法
假设一开始的方程 x≡a1(mod p1),x≡a2(mod p2)x≡a1(mod p1),x≡a2(mod p2)
那么有 p1t+a1≡a2(mod p2)p1t+a1≡a2(mod p2)
p1t≡a2−a1(mod p2)p1t≡a2−a1(mod p2)
p1t+p2y=a2−a1p1t+p2y=a2−a1
可以通过扩欧解出一个解t0t0
t≡t0(mod p2gcd(p2,p1))t≡t0(mod p2gcd(p2,p1)) (通过扩欧的小结论得出)
x0=p1t0+a1x0=p1t0+a1
x≡x0(mod lcm(p1,p2))x≡x0(mod lcm(p1,p2)) 满足左边等式的x都是这两个方程符合条件的解
然后加入下一个方程
六、求n!中p的指数
∑i≥1⌊npi⌋∑i≥1⌊npi⌋还有一个O(1)求的公式(可以用于一些奇怪的数位dp)
n−f(n)p−1n−f(n)p−1
f(n) 表示 n在p进制下的数位和
然而公式怎么推的并不会。。。
七、组合数
n,m较小的话 C(n,m)=C(n−1,m)+C(n−1,m−1)C(n,m)=C(n−1,m)+C(n−1,m−1)递推即可(NOIP2017提高组DAY2T1!!!当时就因为不知道递推式吃了亏)n,m较大的话暴力用f(n)∗g(m)∗g(n−m)f(n)∗g(m)∗g(n−m)求就可以(f,g定义参考线性求1到n逆元里的定义)
还有一种更快的方式求组合数 想学习一下的人百度Lucas定理
这里给出公式:
C(n,m)%p=C(n%p,m%p)∗C(np,mp)%pC(n,m)%p=C(n%p,m%p)∗C(np,mp)%p
八、求阶
暴力枚举1到φ(m)判断即可九、求原根
从小到大枚举g然后暴力判断即可十、指数方程
①ax≡b(mod m)ax≡b(mod m)如果m为素数:
使用BSGS(baby-step giant-step)解决
令x=qt−rx=qt−r ( t一般取根号下m上取整)
则 aqt≡b∗ar(mod m)aqt≡b∗ar(mod m)
从0-m 枚举r 算出b∗arb∗ar 的值 填入一个哈希表中
从1-m 枚举q 算出aqtaqt 的值,在哈希表中检索
如果m不是素数:
提取公因数直到gcd(a,m)=1gcd(a,m)=1
可能大家不理解
举个栗子:
假设我们要解一个方程8x≡16(mod 24)8x≡16(mod 24)
8和24不互质
所以我们先提取一个8
变成 8∗8x−1≡16(mod 24)8∗8x−1≡16(mod 24)
然后约一下变成 8x−1≡2(mod 3)8x−1≡2(mod 3)
最后用BSGS求解得x=2
如果(a,m)≠(a,m,b)(a,m)≠(a,m,b)的话无解
②xa≡b(mod m)xa≡b(mod m)
如果m为素数:
如果gcd(a,φ(m))=1gcd(a,φ(m))=1,那么求出a模φ(m)的逆元a−1a−1
xa∗a−1≡x≡ba−1(mod m)xa∗a−1≡x≡ba−1(mod m)
直接解x即可
否则:
先求出m的原根g
解出一个s符合 gs≡b(mod m)gs≡b(mod m)
假设 x=gtx=gt
那么 gat≡gs(mod m)gat≡gs(mod m)
由原根的性质得到:at≡s(mod φ(m))at≡s(mod φ(m))
解出t即可
如果m不为素数:
分解m然后用CRT合并
当出现2^n时,因为它没有原根,所以说枚举答案即可
十一、二次剩余
形如 x2≡b(mod p)x2≡b(mod p)判断一个数是不是另一个数的二次剩余,只需要计算bp−12%pbp−12%p是否等于1即可
复杂度O(p)
还有一种O(log n)的算法叫做cipolla’s algorithm,然而我并不会这种算法,而且这种算法貌似非常冷门,只有维基百科上才能查到…
至于二次剩余的用处嘛…据说可以用来卡常数
十二、Miller-rabin
一个判断一个数是不是素数的算法并不会写…直接背代码就好2333
十三、Pollard-rho
分解质因数也不会写…也可以直接背代码QwQ
(三)数论函数
一、积性函数
对于gcd(a,b)=1gcd(a,b)=1,如果 f(a∗b)=f(a)∗f(b)f(a∗b)=f(a)∗f(b) 那么f(x) 为积性函数常见的积性函数 d(x),σ(x),id(x),e(x),l(x),μ(x)d(x),σ(x),id(x),e(x),l(x),μ(x)
d(x)=∑a|x1d(x)=∑a|x1
σ(x)=∑a|xaσ(x)=∑a|xa
id(x)=xid(x)=x
l(x)=1l(x)=1
e(x)=1(x=1)e(x)=1(x=1)
e(x)=0(x≠1)e(x)=0(x≠1)
二、狄利克雷卷积
两个数论函数f(x),g(x)f(x),g(x),令h=f∗gh=f∗g则 h(x)=∑a|xf(a)g(xa)h(x)=∑a|xf(a)g(xa)
几条性质:
①卷积满足交换律,结合律。
②两个积性函数的卷积还是积性函数
③f∗e=ff∗e=f
三、莫比乌斯函数
μ(n)=−1kμ(n)=−1k (k为n分解质因数后不同质因数的个数)如果n有平方因子那么μ(n)=0μ(n)=0
如何n=1n=1那么μ(n)=1μ(n)=1
μ∗l=eμ∗l=e
即∑d|nμ(d)=e(n)∑d|nμ(d)=e(n) (这个结论大家自己想一下,可以借助杨辉三角辅助理解)
四、莫比乌斯反演
1.如果F(n)=∑d|nf(d)F(n)=∑d|nf(d) 那么 f(n)=∑d|nμ(d)∗F(nd)f(n)=∑d|nμ(d)∗F(nd)推导:
F=f∗lF=f∗l
F∗μ=f∗l∗μ=f∗e=fF∗μ=f∗l∗μ=f∗e=f
2.如果F(n)=∑n|df(d)F(n)=∑n|df(d) 那么 f(n)=∑n|dμ(dn)∗F(d)f(n)=∑n|dμ(dn)∗F(d)
五、线性筛素数
思想:每个合数只被它最小的素因子访问到代码:
void get_prim(int n) { vis[1]=1; for (int i=2;i<=n;i++) { if (!vis[i]) { cnt++;prim[cnt]=i; } for (int j=1;j<=cnt&&i*prim[j]<=n;j++) { vis[i*prim[j]]=1; if (i%prim[j]==0) break; //看不懂这一步的去重新理解思想 } } }
扩展:通过线性筛可以线性求出一个积性函数的值。
欢迎各位神犇前来交流qwq
相关文章推荐
- 数论题目入门 基础积攒
- Android基础入门教程——9.2 MediaPlayer播放音频与视频
- JQuery入门基础
- oc基础入门之foundation常用结构体
- java-基础入门-泛型数组列表-解决运行时动态更改数组的问题
- JVM从入门到基础(一) 一JVM介绍
- C#做的一个加密/解密的类 - 清清月儿 .NET万花筒 Asp.net技术 Asp.net教程 Asp.net源码 Asp.net基础 Asp.net控件 Asp.net入门 - CSDNBlog
- Android零基础入门第39节:ListActivity和自定义列表项
- SpringSecurity身份验证基础入门
- 音视频开发入门基础及视频会议即时通讯开源技术选择
- WebRTC开发基础(WebRTC入门系列3:RTCDataChannel)
- hadoop入门六(基础知识入门)
- 寄存器(CPU工作原理)07 - 零基础入门学习汇编语言12
- Ubuntu 16.04 中文版安装基础入门教程(图文),ubuntu16.04
- C++零基础入门学习(函数模版)
- 第二章 微服务网关基础组件 - zuul入门
- 围观窗体与组件06 - 零基础入门学习Delphi30
- Python基础入门教程
- TensorFlow入门基础知识(五)tf.add_n()的用法