一些基础的数论知识
来源:互联网 发布:网易云音乐推荐算法 编辑:程序博客网 时间:2024/05/16 02:24
Preface
- 这个专题主要用于记录一些比较基础的,有意义的,数学知识,且不做深入研究,等有时间,再把对应的习题,及一些深入拓展的知识补上.
1.GCD与LCM
这是一个非常简单的知识点.
通常定义如下:
(n,m) 表示n,m 的最大公约数.[n,m] 表示n,m 的最小公倍数.
1.1 GCD
- 我们求GCD有很多种方法,常见的有以下几种:
1.1.1 GCD辗转相除法
原理:
GCD(X,Y)=GCD(X,X−Y) 时间复杂度证明:一次
mod 至少会减半,所以级别为log2
1.1.2 二进制算法(更相减损术)
先去除所有的公共
2 因子,然后通过GCD(x,y)=GCD(x,x−y) 来做,时间复杂度堪忧.另外,还有一种方法叫做:Stein
1.1.3 LCM
- 求
LCM(a,b) 可以直接用a∗b/GCD(a,b) 得到.
1.2 扩展GCD
- 拓展gcd是用于给定一组
(x,y) ,让你求(p,q) ,使得p∗x+q∗y=gcd(x,y)
1.2.1 用GCD拓展求
这个很好求,我们直接在回溯时,让
x=y,y=x−a/b∗y 即可.证明:
a′x+b′y=Gcd(a′,b′) b′x+(a′−a′/b′∗b′)y=Gcd(a′,b′)=Gcd(a,b) ay+b(x−a/b∗y)=Gcd(a,b)
1.2.2 求解线性同余方程
我们要求
a∗x+b∗y=c ,前提是GCD(a,b)|c 我们可以先用拓展gcd求得一组解,然后乘上
c/GCD(a,b) 即可.
1.2.3 线性同于方程的最小正整数解
设
(x,y) 为a∗x+b∗y=c 的一组解.其通解为
(x+b∗n,y−a∗n) ,故如果相求x 的最小整数解,直接用(x%b+b)%b 即为答案.y 同理.
2.逆元
逆元的定义:若
a⋅x≡1(mod m) ,前提GCD(x,m)=1 我们知道,因为
(ans∗a∗x)≡1(mod m) ,所以,我们不乘a ,相当于除了个a ,故(ans∗x)≡1(mod m) 等于除了一个a
2.1 扩展GCD求解
- 根据逆元的定义,我们可以把问题转化为
a⋅x+b⋅m=1 ,因为gcd(x,m)=1 ,所以方程一定有解.
2.2 费马小定理
当然,还有一种方法,可以求逆元,那就是费马小定理.
费马的证明很好证,运用完全剩余系的性质即可.
2.3 线性求逆元
- 当然,这同时也是一种
O(log2n) 的方法求逆元.
3.中国剩余定理
- 中国剩余定理是用来求
x≡a1(mod m1) x≡a2(mod m2) …… x≡an(mod mr)
模线性方程组的解.
满足,
m1,m2……mr 两两互质,且M=∏mi .则满足条件的解
x 为:
证明是很显然的:
任意一个式子带进去模
mi ,其余aj∗Mj∗M−1j 的会被mod掉,而Mi∗M−1i=1 .需要注意的地方有,我们每次算完
Mi∗Mi−1 时并不能mod mi ,这样子其余的Mj 才能被当前的mi 给模掉.
费马小定理求逆元
#include <iostream>#include <cstdio>#include <cstring>#define ll long long#define Maxn 1000#define fo(i,a,b) for (i=a;i<=b;i++)using namespace std;ll n,i,ans,M;ll p[Maxn],m[Maxn];ll ksm(ll x,ll y,ll p){ if (y==-1) return 0; ll ans=1; while (y){ if (y&1) ans=(ans*x)%p; x=(x*x)%p; y>>=1; } return ans;}int main(){ scanf("%lld",&n); fo(i,1,n) scanf("%lld%lld",&m[i],&p[i]); M=1; fo(i,1,n) M*=m[i]; fo(i,1,n) ans = (ans + (M/m[i]) * ksm(M/m[i],m[i]-2,m[i]) * p[i]) % M; printf("%lld",(ans%M+M)%M);}
EXgcd 求逆元
#include <iostream>#include <cstdio>#include <cstring>#define ll long long#define Maxn 1000#define fo(i,a,b) for (i=a;i<=b;i++)using namespace std;ll n,i,ans,M;ll p[Maxn],m[Maxn];void Exgcd(ll a,ll b,ll &x,ll &y){ if (b==0){ x=1, y=0; return; } Exgcd(b,a%b,x,y); ll t=x; x=y, y=t-y*(a/b);}int main(){ scanf("%lld",&n); fo(i,1,n) scanf("%lld%lld",&m[i],&p[i]); M=1; fo(i,1,n) M*=m[i]; fo(i,1,n) { ll x,y, Mi=M/m[i]; Exgcd(Mi,m[i],x,y); ans = (ans + Mi * x * p[i]) % M; } printf("%lld",(ans%M+M)%M);}
4.求斐波那契通项公式的一种简单方法
5.欧拉函数
三个重要性质:
φ(pk)=pk−pk−1=(p−1)∗pk−1 φ(x∗y)=φ(x)∗φ(y)|x,y互质 此性质证明稍微复杂
可以构造一个
n∗m 的矩阵,每一个数都可以用km+r|(1<=r<=m,1<=k<n) 表示.那么对于每一列,因为
gcd(km+r,m)=gcd(r,m) ,所以有φ(m) 列可能与n∗m 互质.同理,每一列中
n 个数模n 之后可以构成一个完全剩余系,其中恰好有φ(n) 个数与n 互质,既然模n 后与n 互质,那么不模肯定也互质,同理,不互质的不模也不互质.所以总共有
φ(n)∗φ(m) 个数与n∗m 互质,即φ(n∗m)=φ(n)∗φ(m)
③
φ(n)=n∗∏ri=1(1−1pi) - 这个通过前两个定理可以很容易证明.
欧拉定理:
对于互质的正整数
a,n ,有aφ(n)≡1(mod n) 证明:
第一步:
令Zn=x1,x2,...,xφ(n) 则S={(a∗x1)mod n,(a∗x2)mod n,...,(a∗xφ(n))mod n} Zn=S
①因为a,n 互质,xi(1≤i≤φ(n)) 与n 互质, 所以a∗xi 与n 互质,所以(a∗xi) mod n∈Zn
②若i≠j , 那么xi≠xj ,且由a,n 互质可得(a∗xi) mod n≠(a∗xj) mod n 第二步:
- 由消去律可得
aφ(n)≡1mod n
莫比乌斯反演
- 学之前,以为这是一个很高深的东西,但其实,只要仔细推一下,问一下大佬,并不是很难…
基本公式
f(n)=∑d|ng(d)⇒g(n)=∑d|nf(nd)∗μ(d) 证明需要用到两个基本性质
莫比乌斯函数
μ 的定义如下μ(n) 中,将n 分解质因式,n=pq11∗pq22∗⋯∗pqkk 只要存在一个
qi>2 ,那么μ(n)=0 否则
μ(n)=(−1)k
两个基本性质
性质一
- 对于任意正整数
n ,有∑d|nμ(d)=⎧⎩⎨0,1,n>1n=1 - 证明只需运用
μ 的性质以及组合数即可.
- 对于任意正整数
性质二
μ(n) 为积性函数证明只需分类讨论一下.
反演的证明:
- 根据性质一可得当
d=n 时,式子∑i|ndμ(i) 值为1 ,其余为0 ,所以得证.
一个变形
f(i)=∑d=1nig(d∗i)⇒g(i)=∑d=1nif(d∗i)μ(d) 证明同样可以参照上面,一样的思路.
g(i)=∑d=1nif(d∗i)μ(d) ⇓ g(i)=∑d=1niμ(d)f(d∗i) ⇓ g(i)=∑d=1niμ(d)∑d′=1nd∗ig(d′∗d∗i) 令T=d′∗d ⇓ g(i)=∑T=1nig(T∗i)∑d|Tμ(d) 同理,由性质一可得当T=1时,
∑d|Tμ(d) 值为1,其余为0,所以得证.其中,最后一步的式子,我是这么理解的:
首先,
T 的取值范围一定是在1∼n/i 的.其次,对于这样的一个
T ,有多少个d 可以更新它呢?显然,就是
d|T 个.
6.同余
剩余类:
整数除
n 后得到n 个不同的余数,即{0,1,2,...,n−1 }.把所有被
n 除后余数相同的一些数称为n 的一个剩余类,可知对于整数n ,有且只有n 个剩余类.
完全剩余系:
- 从
n 的n 个剩余类当中每类选取1 个数出来,组成的序列称为n 的完全剩余系.
- 从
简化剩余系(即既约剩余系):
- 在模数与
n 互质的剩余类中每类选取1 个数出来,组成的序列称为n 的简化剩余系.
- 在模数与
有关同余的一些性质:
定理①:若
m|(a−b) ,则a≡b (mod m) - 可设
a=xm+r,b=ym+r ,即可得证.$
- 可设
通过定理①,可以得出如下性质:
性质1、有a≡b (mod m),则有b≡a (mod m) 性质2、有a≡b (mod m),b≡c (mod m),则有a≡c (mod m) 性质3、有a≡b (mod m),c≡d (mod m),则有ac≡bd (mod m) 及a+c≡b+d (mod m) 性质4、有a≡b (mod m),则有an≡bn (mod m) 性质5、有ac≡bc (mod m),(c,m)=1,则有a≡b (mod m) 证明:
ac−bc≡0 (mod m),则(a−b)c≡0 (mod m) ∵(c,m)=1. ∴(a−b)≡0 (mod m)
- 一些基础的数论知识
- 基础的数论知识
- 一些基础的知识
- 基础数论知识总结
- 一些基础的JAVA知识
- 数论中的一些基础算法
- Java里的一些基础的知识
- java的一些基础的知识
- 【信息安全】一些数论小知识
- 一些数论知识(不定期更新)
- 云计算的一些基础入门知识
- 一些flex技术开发的基础入门知识
- android service一些基础的知识
- jsp的一些基础语法知识
- c# winform的一些基础学习知识
- SQL一些最基础的知识
- JS 的一些基础小知识
- 一些数论的公式
- PageHelper5.0.0分页插件与mybatis的集成
- spring httpMessageConverter 和 @ResponseBody
- 页面布局 --- 两列均分布局
- 基于Bmob,环信easeUI的校园二手交易市场——用户管理(含头像),数据管理,文件管理(图片管理),聊天功能的开发
- 看你的linux编译系统是32位还是64位最简单的方法以及不同数据类型占用字节个数
- 一些基础的数论知识
- 【Linux C 多线程编程】互斥锁与条件变量
- 八小时实现迷你版vuejs之二:vuejs 架构
- 倒排索引
- 李开复给中国大学生的七封公开信(其六)
- uboot学习(1)
- 【fjsd 1261】整数拆分
- [NOIP2017模拟]游戏
- Python 操作MongoDB数据库