作者的话:
不想看数学公式的人,不可能完全弄懂数论。出来混,迟早是要还的。
我不知道小学生怎么样,但我觉得初中生应该是能看懂的,毕竟我也才初中。由于水平有限,如有错误请指正,谢谢!
定义
连乘:
a1+a2+...+an=∑i=1nai
连加:
a1×a2×...×an=∏i=1nai
全称量化:
∀ 1⩽i⩽n,i2≠0⇔对于所有满足1⩽i⩽n的 i,满足i2≠0
集合:
R
实数集合
Q
有理数集合
Z
整数集合
N
自然数集合
N∗
正整数集合
整除:
a|b⇔a是b的约数
a/|b⇔a不是b的约数
最大公因数:
[a,b]=lcm(a,b)
最小公倍数:
(a,b)=gcd(a,b)
取整:
⌊x⌋⇔x下取整
⌈x⌉⇔x上取整
同余:
a≡b(mod m)⇔a mod m=b mod m
逆元:如果
(a,m)=1
,则存在
a−1
使得
a×a−1≡1(mod m)
,
a−1
即为
a
的逆元。
欧拉函数:
ϕ(n)=
小于等于
n
且与
n
互质的数的个数。即
ϕ(n)=∑i=1n[gcd(i,n)=1]
性质:
∀i∈prime,ϕ(i)=i−1
积性函数:如果对于任意满足
p,q∈N∗,gcd(p,q)=1
的
p
和
q
f(q×p)=f(q)×f(p)
均成立。则
f
是积性函数。
莫比乌斯函数:
μ(x)=⎧⎩⎨1,(−1)k,0,x=1x=p1p2...pk,∀ pi≠pj(pi为x的唯一分解)others
模运算:
a mod b=a−⌊a/b⌋×b
,即
a
除
b
的余数。
性质
整除的性质
1.a|c,b|c,(a,b)=1⇒ab|c
2.a|bc,(a,b)=1⇒a|c
3.p|ab⇒(p|a)∨(p|b)
正确性显然
同余的性质
1.a≡b(mod m)⇔m|(a−b)
2.a≡b(mod m)⇔a−b≡0(mod m)
3.a≡b(mod m)⇔ac≡bc(mod m)
4.若(c,p)=1
,则
ac≡bc(mod p)⇒a≡b(mod p)
。
5.若a≡b(mod p),ac≡bd(mod p)
,则
c≡d(mod p)
。
6.a≡b(mod m),a≡b(mod n)⇒a≡b(mod [m,n])
证明:(a−b)=xm=yn=k×[m,n]
7.(k,m)=d,k×a≡k×a′(mod m)⇒a≡a′(mod md)
证明:∵(k,m)=d
∴必然存在 k 和 m 使得 k=q×d,m=p×d
∴k×a−k×a′=c×m
∴a−a′=c×mk=c×mq×d=cq×md
∑
的性质
∑i((∑jaj)bi)=∑i(∑j(ajbi))=∑j(aj∑ibi)
证明:乘法分配律
a=[1,2,3],b=[4,5,6]
∑i((∑jaj)bi)=(1+2+3)∗4+(1+2+3)∗5+(1+2+3)∗6
=1∗4+2∗4+3∗4+1∗5+2∗5+3∗5+1∗6+2∗6+3∗6
=∑i(∑j(ajbi))
=(4+5+6)∗1+(4+5+6)∗2+(4+5+6)∗3
=∑j(aj∑ibi)
快速幂
∵xp={(xp2)2(x⌊p2⌋)2×x,p≡0(mod 2),p≡1(mod 2)
因此可以二分
long long pow_mod(long long x, long long n, long long mod){
long long res=1;
while(n>0){
if(n&1)
res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res;
}
时间复杂度:
Θ(log2p)
二分乘法
∵x×p={2(x×p2)2(x×⌊p2⌋)+x,p≡0(mod 2),p≡1(mod 2)
因此可以二分
unsigned long long mul_mod(long long a,long long b,long long m) {
unsigned long long ans=0;
a%=m;
while(b) {
if(b&1) {
ans=(ans+a)%m;
b--;
}
b>>=1;
a=(a+a)%m;
}
return ans;
}
时间复杂度:
Θ(log2p)…
有什么用吗?如果
x×p
会爆
long long
呢?
欧几里得算法
结论:
(a,b)=(b,a mod b)
证明:
a
可以表示成
a=kb+r
,则
r=a mod b
设
d
是
a,b
的一个公约数,则有
d|a,d|b
,而
r=a−kb
,因此
d|r
∴d
是
(b,a mod b)
的公约数
设
a
和
b
的公约数集合为
A
,
b
和
a mod b
的公约数集合为
B
。
则
A=B
,故
(a,b)=(b,a mod b)
裴蜀定理
结论:如果
a,b∈N,(a,b)=d
那么一定存在
x,y
使得
d|(ax+by)
证明:
∵ gcd(a,b)=d
∴
必然存在
p
和
q
使得
a=p×d,b=q×d
∴ ax+by=(p×d)x+(q×d)y=d(p×x+q×y)
∴ d|(ax+by)
扩展欧几里得算法
直接作用:在执行欧几里得算法的时候可以顺便求出型如
ax+by=(a,b)
的不定方程的通解。
由原欧几里得算法可得:
(a,b)=(b,a mod b)
对于型如
ax+by=(a,b)
的不定方程,根据裴蜀定理,原不定方程一定有解。
∴ax+by=(a,b)=(b,a mod b)=bx′+(a mod b)y′
又∵ a mod b=a−⌊a/b⌋×b
∴ ax+by=bx′+(a−⌊a/b⌋×b)y′=bx′+ay′−⌊a/b⌋×by′=ay′+bx′−⌊a/b⌋×by′=ay′+b(x′−⌊a/b⌋×y′)
∴ x=y′,y=x′−⌊a/b⌋×y′
然后就可以愉快地递归啦。
边界条件
x=1,y=0[b=0]
其实还可以化简,即在递归的时候,计算exgcd(b,a%b,y,x)
这样回来的时候
y′
的值就已经放在
x
里了,然后再把y-=a/b*x
就行了,当然也可以直接算。
int exgcd(int a,int b,long long &x,long long &y) {
if(!b)
return x=1,y=0,a;
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
时间复杂度:
O(12×ln2×lnmin(a,b))π2+1.47)≈O(lnmin(a,b))
欧拉定理
结论:若存在
p
和
a
,满足
p,a∈N∗,(p,a)=1
,则
aϕ(p)≡1(mod p)
证明:考虑
p
条同余式,其中
∀ i⩽ϕ(p),mi<p
。
a×x1≡m1(mod p)(1)
a×x2≡m2(mod p)(2)
...
a×xϕ(p)≡mϕ(p)(mod p)(ϕ(p))
定义
X={xi|1⩽i⩽ϕ(p)},M={mi|1⩽i⩽ϕ(p)}
引理 1:
|M|=ϕ(p)
证明:假设存在
i
和
j
,满足
i>j,mi=mj
则
(i)−(j)
得
a(xi−xj)≡0(mod p)
又∵(a,p)=1
∴xi−xj≡0(mod p)
又∵xi−xj<p
∴xi−xj/|p
∴xi−xj≢0(mod p)
,矛盾
∴
不存在
i
和
j
,满足
i>j,mi=mj
∴|M|=ϕ(p)
引理 2:
∀mi,mi∈X
证明:
∵(a,p)=1,(xi,p)=1
∴(a×xi,p)=1
由欧几里得算法得:(p,(a×xi) mod p)=1
∴(mi,p)=1
∴mi∈X
又∵|M|=|X|=ϕ(p)
∴M=X
把
ϕ(p)
条式子乘起来,得
∏i=1ϕ(p)(a×xi)≡∏i=1ϕ(p)mi(mod p)
⇒aϕ(p)×∏i=1ϕ(p)xi≡∏i=1ϕ(p)mi(mod p)
又∵∏i=1ϕ(p)xi≡∏i=1ϕ(p)mi(mod p)
∴aϕ(p)≡1(mod p)
费马小定理
结论:若存在
a
和
p
,满足
(a,p)=1
,则
ap−1≡1(mod p)
证明:
∵∀p∈prime,ϕ(p)=p−1
∴ap−1≡1(mod p)(欧拉定理)
逆元
扩展欧几里得
a×x≡1(mod p)中,x=a−1
转化为不定方程ax−by=1
用扩展欧几里得解不定方程即可,若
(a,p)=1
,则求得的
x
即为
a−1
。
但要注意,
x
可能小于
0
,但满足
x≡x+p(mod p)
,因此,把
x
加上一个
p
即可。
long long inv(long long a,long long n) {
long long x,y;
long long d=exgcd(a,n,x,y);
return d==1?(x+n)%n:-1;
}
时间复杂度:
Θ(lnp)
费马小定理
∵
当
p∈prime
时,
ap−1≡1(mod p),(a,p)=1
∴ap−1×a−1≡1×a−1(mod p)
∴ap−2≡a−1(mod p)
∴a−1≡ap−2(mod p)
因此
a
的逆元即
ap−2 mod p
。
#define inv(x,mod) (pow_mod(x,mod-2,mod))
时间复杂度:
Θ(log2(mod−2))
欧拉定理
∵
当
(a,p)=1
时,
aϕ(p)≡1(mod p)
。
∴aϕ(p)×a−1≡1×a−1(mod p)
∴aϕ(p)−1≡a−1(mod p)
∴a−1≡aϕ(p)−1(mod p)
因此
a
的逆元即
aϕ(p)−1 mod p
。
时间复杂度:
Θ(求ϕ(n)的时间+log2(ϕ(p)−1))
线性求逆元
显然地,
1−1≡1(mod p)
对于
i(i>1)
,必然存在
k
和
r
,使得
p=k×i+r
,满足
r<i,1<i<p
。
∵p≡0(mod p)
∴k×i+r≡0(mod p)
∴(k×i+r)×(i−1×r−1)≡0×(i−1×r−1)(mod p)
∴k×i×i−1×r−1+r×i−1×r−1≡0(mod p)
∴k×r−1+i−1≡0(mod p)
∴i−1≡−k×r−1(mod p)
又∵k=⌊pi⌋,r=p mod i
∴i−1≡−⌊pi⌋×(p mod i)−1(mod p)
∴i−1≡p−⌊pi⌋×(p mod i)−1(mod p)
因为在计算
i
之前,
(p mod i)−1
一定已经被算出来了,因此可以愉快地递推了。
代码
(inv[i]表示i−1)
:
inv[1]=1;
for(int i=2;i<=n;i++)
inv[i]=((long long)(mod-mod/i)*inv[mod%i])%mod;
时间复杂度:
Θ(n)
神奇“逆元”
逆元都必须在当
(a,p)=1
时才存在,那如果题目没有保证
(a,p)=1
呢?可以用下面的式子。
结论:
ab mod p=a mod (bp)b
证明:
ab mod p=ab−⌊abp⌋×p
=ab−⌊abp⌋×p
=ab−⌊abp⌋×b×pb
=ab−⌊abp⌋×bpb
=a−⌊abp⌋×bpb
=a mod (bp)b
但
pb
可能爆
long long
,因此在计算时需要用到二分乘法。