扩展欧几里得
简单的欧几里得较为简单,这里就不过多赘述。
扩展欧几里得
已知
a
a
a,
b
b
b的最小公约数为gcd,对于方程
a
∗
x
+
b
∗
y
=
g
c
d
a*x+b*y=gcd
a∗x+b∗y=gcd,已知其特解
x
0
x_0
x0,
y
0
y_0
y0那么就可得到通解为
x
=
x
0
+
b
g
c
d
⋅
t
x = x_0 + \frac{b}{gcd}\cdot t
x=x0+gcdb⋅t
y
=
y
0
−
a
g
c
d
⋅
t
y=y_0 - \frac{a}{gcd}\cdot t
y=y0−gcda⋅t
考虑通过欧几里得算法计算
a
a
a和
b
b
b最小公约数达到递归边界时
a
n
=
g
c
d
a_n=gcd
an=gcd,
b
n
=
0
b_n=0
bn=0那么此时
x
n
=
1
x_n=1
xn=1,
y
n
=
0
y_n=0
yn=0,
a
n
⋅
x
n
+
b
n
⋅
y
n
=
g
c
d
a_n\cdot x_n+b_n\cdot y_n=gcd
an⋅xn+bn⋅yn=gcd
再考虑欧几里得算法进行两层递归时
a
i
⋅
x
i
+
b
i
⋅
y
i
=
g
c
d
a_i\cdot x_i +b_i\cdot y_i=gcd
ai⋅xi+bi⋅yi=gcd
b
i
⋅
x
i
+
1
+
(
a
i
%
b
i
)
⋅
y
i
+
1
=
g
c
d
b_i\cdot x_{i+1}+(a_i \% b_i)\cdot y_{i+1}=gcd
bi⋅xi+1+(ai%bi)⋅yi+1=gcd
展开第二个式子得到
a
i
⋅
y
i
+
1
+
b
i
⋅
(
x
i
+
1
−
a
i
/
b
i
⋅
y
i
+
1
)
=
g
c
d
a_i\cdot y_{i+1}+b_i\cdot (x_{i+1}-a_i/b_i\cdot y_{i+1})=gcd
ai⋅yi+1+bi⋅(xi+1−ai/bi⋅yi+1)=gcd
联立上述式子则可得到
x
i
=
y
i
+
1
+
1
x_i=y_{i+1}+1
xi=yi+1+1
y
i
=
b
i
⋅
(
x
i
+
1
−
a
i
/
b
i
⋅
y
i
+
1
)
y_i=b_i\cdot (x_{i+1}-a_i/b_i\cdot y_{i+1})
yi=bi⋅(xi+1−ai/bi⋅yi+1)
通过从递归边界开始进行反推则可得到一个
x
0
x_0
x0,
y
0
y_0
y0的特解
在具体做题时判断形如
a
⋅
x
+
b
⋅
y
=
c
a\cdot x+b\cdot y=c
a⋅x+b⋅y=c的式子是否有解的条件,即判断
c
c
c是否能被
a
a
a和
b
b
b的最小公约数整除
代码如下:
ll exgcd(ll a,ll b,ll &x1,ll &y1){
if(b==0){
x1 = 1;
y1 = 0;
return a;
}
ll ret = exgcd(b, a%b, x1, y1);
ll temp = x1;
x1 = y1;
y1 = temp - a/b*y1;
return ret;
}
乘法逆元
对于一个 a × b ≡ 1 ( m o d p ) a\times b\equiv1(\mod p) a×b≡1(modp)将b称为a的乘法逆元,记 b b b为 i n v ( a ) inv(a) inv(a)
扩展欧几里得求乘法逆元
当 g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1时对于 a × b ≡ 1 ( m o d p ) a\times b\equiv1(\mod p) a×b≡1(modp)可转换为 a b − p y = 1 ab-py=1 ab−py=1,如此则可通过 e x g c d exgcd exgcd求出 a a a的乘法逆元b来,注意最后要将 b b b转换成最小正整数。
费马小定理求乘法逆元
费马小定理为如果
p
p
p是一个质数,且整数
a
a
a不是
p
p
p的倍数,那么满足式子:
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p-1}\equiv1(\mod p)
ap−1≡1(modp)
简单证明一:考虑到
p
p
p是一个质数,且整数
a
a
a不是
p
p
p的倍数。那么
{
a
,
2
a
,
3
a
,
4
a
.
.
.
(
p
−
1
)
a
}
\{a,2a,3a,4a...(p-1)a\}
{a,2a,3a,4a...(p−1)a}是
p
p
p的一个完全剩余系,故
1
×
2
×
3
×
.
.
.
×
(
p
−
1
)
≡
a
×
2
a
×
3
a
×
.
.
.
×
(
p
−
1
)
a
(
m
o
d
p
)
1\times 2\times 3\times... \times(p-1) \equiv a\times2a\times3a\times...\times(p-1)a (\mod p)
1×2×3×...×(p−1)≡a×2a×3a×...×(p−1)a(modp)
即
(
p
−
1
)
!
≡
(
p
−
1
)
!
a
p
−
1
(p-1)! \equiv(p-1)!a^{p-1}
(p−1)!≡(p−1)!ap−1又因为
g
c
d
(
(
p
−
1
)
!
,
p
)
=
1
gcd((p-1)!,p)=1
gcd((p−1)!,p)=1所以等式两边可以约去
(
p
−
1
)
!
(p-1)!
(p−1)!,最后得到
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p-1}\equiv1(\mod p)
ap−1≡1(modp)
简单证明二:运用下述欧拉定理即可得证
所以在前提条件为
p
p
p是一个质数,且整数
a
a
a不是
p
p
p的倍数时可以得到
i
n
v
(
a
)
=
a
p
−
2
inv(a)=a^{p-2}
inv(a)=ap−2
线性递推求乘法逆元
求阶乘的乘法逆元
若已知
i
n
v
(
n
!
)
inv(n!)
inv(n!),则由式子
i
n
v
(
(
n
−
1
)
!
)
⋅
(
n
−
1
)
!
≡
1
(
m
o
d
p
)
inv((n-1)!)\cdot(n-1)!\equiv1(\mod p)
inv((n−1)!)⋅(n−1)!≡1(modp)
化为
i
n
v
(
(
n
−
1
)
!
)
⋅
(
n
−
1
)
!
⋅
n
⋅
i
n
v
(
n
!
)
≡
n
⋅
i
n
v
(
n
!
)
(
m
o
d
p
)
inv((n-1)!)\cdot(n-1)!\cdot n \cdot inv(n!)\equiv n\cdot inv(n!)(\mod p)
inv((n−1)!)⋅(n−1)!⋅n⋅inv(n!)≡n⋅inv(n!)(modp)
即可得到递推式
i
n
v
(
(
n
−
1
)
!
)
≡
n
⋅
i
n
v
(
n
!
)
(
m
o
d
p
)
inv((n-1)!)\equiv n\cdot inv(n!)(\mod p)
inv((n−1)!)≡n⋅inv(n!)(modp)
编写代码时可先通过扩展欧几里得或费马小定理得到
i
n
v
(
n
!
)
inv(n!)
inv(n!)再进行递推
递推的乘法逆元
对于当前的所求元素
i
i
i,考虑其和模数
p
p
p的关系为
p
=
a
⋅
i
+
b
p=a\cdot i+b
p=a⋅i+b
那么
a
⋅
i
+
b
≡
0
(
m
o
d
p
)
a\cdot i+b\equiv 0(\mod p)
a⋅i+b≡0(modp)
等式两边同时乘以
i
n
v
(
i
)
inv(i)
inv(i),
i
n
v
(
b
)
inv(b)
inv(b)得到
a
⋅
i
n
v
(
b
)
+
i
n
v
(
i
)
≡
0
(
m
o
d
p
)
a\cdot inv(b) +inv(i)\equiv 0(\mod p)
a⋅inv(b)+inv(i)≡0(modp)
那么
i
n
v
(
i
)
≡
−
a
⋅
i
n
v
(
b
)
(
m
o
d
p
)
inv(i)\equiv -a\cdot inv(b)(mod\ p)
inv(i)≡−a⋅inv(b)(mod p)
最后得到递推式为
i
n
v
(
i
)
≡
−
⌊
p
i
⌋
⋅
i
n
v
(
p
%
i
)
inv(i) \equiv-\lfloor \frac{p}{i}\rfloor\cdot inv(p\%i)
inv(i)≡−⌊ip⌋⋅inv(p%i)
中国剩余定理
考虑这样的一个式子
{
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
⋯
x
≡
a
n
(
m
o
d
m
n
)
\begin{cases} x\equiv a_1(\mod m_1)\\ x\equiv a_2(\mod m_2)\\ \cdots\\ x\equiv a_n(\mod m_n) \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡a1(modm1)x≡a2(modm2)⋯x≡an(modmn)
中国剩余定理给出了该式子有解的条件以及解的构造方法
若
m
1
,
m
2
⋯
,
m
n
m_1,m_2\cdots,m_n
m1,m2⋯,mn互质,则该方程组有解。
可通过如下方式得到它的解
令
M
=
∏
i
=
1
n
m
i
,
M
i
=
M
m
i
∀
i
∈
{
1
,
2
,
⋯
,
n
}
M=\prod\limits_{i=1}^nm_i,M_i=\frac{M}{m_i} \forall i\in\{1,2,\cdots,n\}
M=i=1∏nmi,Mi=miM∀i∈{1,2,⋯,n}
设
t
i
M
i
≡
1
(
m
o
d
m
i
)
t_iM_i\equiv1(\mod m_i)
tiMi≡1(modmi)即
t
i
t_i
ti是
M
i
M_i
Mi在模
m
i
m_i
mi意义下的逆元,同时满足
t
i
M
i
≡
0
(
m
o
d
m
j
,
j
≠
i
)
t_iM_i\equiv0(\mod m_{j,j\neq i})
tiMi≡0(modmj,j=i)
则可得到该式子解的通式为
x
=
a
1
t
1
M
1
+
a
2
t
2
M
2
+
⋯
+
a
n
t
n
M
n
+
k
M
,
k
∈
Z
x=a_1t_1M_1+a_2t_2M_2+\cdots+a_nt_nM_n+kM,k\in\mathbb{Z}
x=a1t1M1+a2t2M2+⋯+antnMn+kM,k∈Z
又因为
M
i
和
m
i
M_i和m_i
Mi和mi互质,所以一定能用扩展欧几里得算法求出这样的
t
i
t_i
ti
扩展中国剩余定理
扩展中国剩余定理是
m
1
,
m
2
⋯
,
m
n
m_1,m_2\cdots,m_n
m1,m2⋯,mn不互质的情况下的求解,证明也不是很难,暂且占坑吧,写出其合并两个式子时的通式如下
设
g
c
d
=
g
c
d
(
m
i
,
m
i
+
1
)
gcd=gcd(m_i,m_{i+1})
gcd=gcd(mi,mi+1)
x
≡
(
i
n
v
(
m
1
g
c
d
,
m
2
g
c
d
)
⋅
a
2
−
a
1
g
c
d
)
%
m
2
g
c
d
⋅
m
1
+
a
1
(
m
o
d
m
1
⋅
m
2
g
c
d
)
x\equiv (inv(\frac{m1}{gcd},\frac{m2}{gcd})\cdot\frac{a_2-a_1}{gcd})\%\frac{m_2}{gcd}\cdot m_1+a_1(\mod \frac{m_1\cdot m_2}{gcd})
x≡(inv(gcdm1,gcdm2)⋅gcda2−a1)%gcdm2⋅m1+a1(modgcdm1⋅m2)
欧拉定理
欧拉函数
欧拉函数:对于一个正整数n,小于n且和n互质的正整数个数(包括1)的个数,记为
ϕ
(
n
)
\phi(n)
ϕ(n)。
欧拉函数的通式为
ϕ
(
n
)
=
n
(
1
−
1
p
1
)
(
1
−
1
p
2
)
.
.
.
(
1
−
1
p
n
)
\phi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_n})
ϕ(n)=n(1−p11)(1−p21)...(1−pn1)其中
p
1
p_1
p1,
p
2
p_2
p2…
p
n
p_n
pn是n的所有质因数。
ϕ
(
n
)
=
n
∏
i
=
1
n
(
1
−
1
p
i
)
\phi (n) = n\prod\limits_{i=1}^n(1-\frac{1}{p_i})
ϕ(n)=ni=1∏n(1−pi1)
欧拉定理
若
g
c
d
(
a
,
m
)
=
1
,
gcd(a,m)=1,
gcd(a,m)=1,则
a
ϕ
(
m
)
=
1
(
m
o
d
m
)
a^{\phi{(m)}}=1(\mod m)
aϕ(m)=1(modm)
所以采用欧拉定理进行降幂
扩展欧拉定理
a x ≡ a x m o d ϕ ( m ) + ϕ ( m ) ( m o d m ) a^x\equiv a^{x\mod \phi{(m)}+\phi{(m)}}(\mod m) ax≡axmodϕ(m)+ϕ(m)(modm)