文章目录
数学蒟蒻表示这也太难了(sad)
更相减损术
g c d ( a , b ) = g c d ( a , b − a ) gcd(a,b)=gcd(a,b-a) gcd(a,b)=gcd(a,b−a)
证 明 : 证明: 证明:
若有
g
c
d
(
a
,
b
)
=
d
gcd(a,b)=d
gcd(a,b)=d,则有
a
=
k
1
d
,
b
=
k
2
d
a=k_1d,\ b=k_2d
a=k1d, b=k2d,且
k
1
k_1
k1与
k
2
k_2
k2一定互质,即
g
c
d
(
k
1
,
k
2
)
=
1
gcd(k_1,k_2)=1
gcd(k1,k2)=1。
设
g
c
d
(
a
,
b
−
a
)
=
x
d
gcd(a,b-a)=xd
gcd(a,b−a)=xd,也就是
g
c
d
(
k
1
d
,
(
k
2
−
k
1
)
d
)
=
x
d
gcd(k_1d,(k_2-k_1)d)=xd
gcd(k1d,(k2−k1)d)=xd,化简为
g
c
d
(
k
1
,
k
2
−
k
1
)
=
x
gcd(k_1,k_2-k_1)=x
gcd(k1,k2−k1)=x。
同样的,可以设
k
1
=
t
1
x
,
k
2
−
k
1
=
t
2
x
k_1=t_1x,\ k_2-k_1=t_2x
k1=t1x, k2−k1=t2x。
有
k
1
=
t
1
x
,
k
2
=
(
t
1
+
t
2
)
x
k_1=t_1x,\ k_2=(t_1+t_2)x
k1=t1x, k2=(t1+t2)x。
因为前面有 g c d ( k 1 , k 2 ) = 1 gcd(k_1,k_2)=1 gcd(k1,k2)=1,所以此处 x x x只能等于 1 1 1。
所以,有 g c d ( a , b ) = g c d ( a , b − a ) gcd(a,b)=gcd(a,b-a) gcd(a,b)=gcd(a,b−a)。
并且,该定理可以推广到多个数,即
g
c
d
(
a
,
b
,
c
,
.
.
.
)
=
g
c
d
(
a
,
b
−
a
,
c
−
b
,
.
.
.
)
gcd(a,b,c,...)=gcd(a,b-a,c-b,...)
gcd(a,b,c,...)=gcd(a,b−a,c−b,...)。
简单证明:
g
c
d
(
a
,
b
,
c
)
=
g
c
d
(
a
,
g
c
d
(
b
,
c
)
)
=
g
c
d
(
a
,
b
,
c
−
b
)
=
g
c
d
(
g
c
d
(
a
,
b
)
,
c
−
b
)
=
g
c
d
(
a
,
b
−
a
,
c
−
b
)
gcd(a,b,c)=gcd(a,gcd(b,c))\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =gcd(a,b,c-b)\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =gcd(gcd(a,b),c-b)\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =gcd(a,b-a,c-b)
gcd(a,b,c)=gcd(a,gcd(b,c)) =gcd(a,b,c−b) =gcd(gcd(a,b),c−b) =gcd(a,b−a,c−b)。
辗转相除法(欧几里得算法gcd)
g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a\ mod\ b) gcd(a,b)=gcd(b,a mod b)
证
明
:
证明:
证明:
设
a
=
k
b
+
r
a=kb+r
a=kb+r,则
g
c
d
(
b
,
a
m
o
d
b
)
=
g
c
d
(
b
,
r
)
gcd(b,a\ mod\ b)=gcd(b,r)
gcd(b,a mod b)=gcd(b,r)
若
g
c
d
(
a
,
b
)
=
d
gcd(a,b)=d
gcd(a,b)=d,则有
d
∣
a
d|a
d∣a且
d
∣
b
d|b
d∣b,而
r
=
a
−
k
b
r=a-kb
r=a−kb,所以一定也有
d
∣
r
d|r
d∣r。
所以
g
c
d
(
b
,
r
)
=
d
gcd(b,r)=d
gcd(b,r)=d
证得: g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a\ mod\ b) gcd(a,b)=gcd(b,a mod b)
扩展欧几里得算法(exgcd)
快速幂
快速幂是用来快速的求得 a b a^b ab。
简
单
推
理
:
简单推理:
简单推理:
将b按二进制权展开,有
b
=
k
n
2
n
+
k
n
−
1
2
n
−
1
+
.
.
.
+
k
1
2
1
+
k
0
2
0
b=k_n2^n+k_{n-1}2^{n-1}+...+k_12^1+k_02^0
b=kn2n+kn−12n−1+...+k121+k020
k
k
k的取值要么是
0
0
0,要么是
1
1
1。
则
a
b
=
a
k
n
2
n
+
k
n
−
1
2
n
−
1
+
.
.
.
+
k
1
2
1
+
k
0
2
0
a^b=a^{k_n2^n+k_{n-1}2^{n-1}+...+k_12^1+k_02^0}
ab=akn2n+kn−12n−1+...+k121+k020
因为
a
2
i
∗
a
2
i
=
a
2
i
+
1
a^{2^i}*a^{2^i}=a^{2^{i+1}}
a2i∗a2i=a2i+1,由这个性质可以快速的计算
a
b
a^b
ab。
具体操作是:
以
3
45
3^{45}
345为例 \2,954,312,706,550,833,698,643
45
=
(
101101
)
2
45=(101101)_2
45=(101101)2
从二进制的低位到高位计算。
初始时答案
a
n
s
=
1
ans=1
ans=1,目前的次方数为
p
=
3
2
0
p=3^{2^0}
p=320
如果二进制第0位是1,让
a
n
s
=
a
n
s
∗
p
ans=ans*p
ans=ans∗p。
如果是
0
0
0就不需要乘。
每操作完一位后,让
p
=
p
∗
p
p=p*p
p=p∗p,此时
p
=
3
2
1
p=3^{2^1}
p=321,然后进行下一位的判断。
.
最后得到
a
n
s
=
3
2
0
∗
3
2
2
∗
3
2
3
∗
3
2
5
ans=3^{2^0}*3^{2^2}*3^{2^3}*3^{2^5}
ans=320∗322∗323∗325。
如果一个一个乘,我们需要乘
45
45
45次,而快速幂只需要
l
o
g
2
45
log_245
log245次。
逆元
线性同余方程
线性同余方程就是给出一个这种形式的方程,求出x:
a
x
≡
b
(
m
o
d
m
)
ax\equiv b\ \ (mod\ \ m)
ax≡b (mod m)
等价于求:
a
x
=
m
y
+
b
ax=my+b
ax=my+b
a
x
−
m
y
=
b
ax-my=b
ax−my=b(因为y是一个未知数,可以把y前面的负号合并到y里面,不影响x的值)
也就是:
a
x
+
m
y
=
b
ax+my=b
ax+my=b
由exgcd知,一定有 a x 0 + m y 0 = d ax_0+my_0=d ax0+my0=d,( d d d是 g c d ( a , m ) gcd(a,m) gcd(a,m))。
a x 0 + m y 0 = d ax_0+my_0=d ax0+my0=d
两边同时乘一个
b
d
\frac{b}{d}
db:
b
d
∗
a
x
0
+
m
y
0
=
b
d
∗
d
\frac{b}{d}*ax_0+my_0=\frac{b}{d}*d
db∗ax0+my0=db∗d
也就是:
a
(
b
d
x
0
)
+
m
(
b
d
y
0
)
=
b
a(\frac{b}{d}x_0)+m(\frac{b}{d}y_0)=b
a(dbx0)+m(dby0)=b
得到一组特解为:
{
x
=
b
d
x
0
y
=
b
d
y
0
\begin{cases} x=\frac{b}{d}x_0\\y=\frac{b}{d}y_0 \end{cases}
{x=dbx0y=dby0
通解为:
设有一组特解
x
0
,
y
0
x0,y0
x0,y0
{
x
=
x
0
+
k
m
d
y
=
y
0
−
k
a
d
\begin{cases} x=x_0+k\frac{m}{d}\\y=y_0-k\frac{a}{d} \end{cases}
{x=x0+kdmy=y0−kda
注意:这里的 x 0 , y 0 x_0,y_0 x0,y0不是上面的 x 0 , y 0 x_0,y_0 x0,y0。
约数和质数
2、线性筛法简单证明:
线性筛法的思想是对于每一个数,只用它的最小的质因子去筛它。
例,求 1 1 1~ n n n内的所有质数。
具体执行是:
首先,按顺序枚举
2
2
2—>
n
n
n的每一个数。
枚举到
i
i
i的时候,如果
i
i
i没有被
1
1
1~
i
−
1
i-1
i−1中的任何一个质数筛掉,说明
i
i
i本身就是一个质数,那 么将
i
i
i加入质数集合中,如果被筛掉了(说明不是质数),就不需要加。
接下来,在质数集合中从小到大枚举现有的所有质数。
枚举到
p
j
p_j
pj时,令
x
=
p
j
∗
i
x=p_j*i
x=pj∗i。
如果
i
%
p
j
!
=
0
i\%p_j!=0
i%pj!=0,说明
p
j
p_j
pj一定是
p
j
∗
i
p_j*i
pj∗i的最小质因子,将它筛去(因为它不是质数)。
否则,
i
%
p
j
=
=
0
i\%p_j==0
i%pj==0,说明
p
j
p_j
pj一定是
i
i
i的最小质因子(因为
p
j
p_j
pj是从小到大枚举的,当第一次出现
i
%
p
j
=
=
0
i\%p_j==0
i%pj==0的情况时,一定成立),也是
p
j
∗
i
p_j*i
pj∗i的最小质因子,同样把它筛掉,然后停止枚举(也就是,当出现了
i
%
p
j
=
=
0
i\%p_j==0
i%pj==0的情况后,就不在往下枚举了)。
我们可以证明,对于任意一个数
x
x
x,设
x
x
x的最小质因子是
p
p
p。
当上面的
i
i
i枚举到
x
p
\frac{x}{p}
px的时候,
x
x
x一定会在这个时候被筛去。所以不会存在某一个数被漏掉的情况。
欧拉函数
费马小定理与欧拉定理
费马小定理:
如果
p
p
p是一个质数,而整数
a
a
a与
p
p
p互质,则有
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p-1}≡1(mod\ p)
ap−1≡1(mod p)
欧拉定理:
对于任意互质的
a
a
a和
n
n
n,有
a
φ
(
n
)
≡
1
(
m
o
d
n
)
a^{\varphi(n)}\equiv1\ (mod\ n)
aφ(n)≡1 (mod n)
其中
φ
(
n
)
\varphi(n)
φ(n)是
n
n
n的欧拉函数。
(费马小定理是欧拉定理的一个特例,即 n n n为质数的时候)。
证
明
:
证明:
证明:
设所有与
n
n
n互质的数的集合
S
=
S=
S={
x
1
,
x
2
,
.
.
.
,
x
φ
(
n
)
x_1,x_2,...,x_{\varphi(n)}
x1,x2,...,xφ(n)},共
φ
(
n
)
\varphi(n)
φ(n)个。
在设另一个集合
Z
=
Z=
Z={
y
1
,
y
2
,
.
.
.
,
y
φ
(
n
)
y_1,y_2,...,y_{\varphi(n)}
y1,y2,...,yφ(n)},其中,
y
i
=
a
x
i
(
m
o
d
n
)
y_i=ax_i\ (mod\ n)
yi=axi (mod n)。
则有:在模n的意义下,集合 S = Z S=Z S=Z。
W
h
y
?
Why?
Why?
因为
a
a
a与
n
n
n也是互质的,所以对于每一个
y
i
y_i
yi,都有
y
i
y_i
yi与n互质,且它们都是互不相同的。而与
n
n
n互质的数就
φ
(
n
)
\varphi(n)
φ(n)个,集合Z正好也有
φ
(
n
)
\varphi(n)
φ(n)个与
n
n
n互质的数。所以,这
φ
(
n
)
\varphi(n)
φ(n)个数就是那
φ
(
n
)
\varphi(n)
φ(n)个数,集合
S
S
S与集合
Z
Z
Z表示的其实都是同一个集合。
所以,有
y
1
∗
y
2
∗
.
.
.
∗
y
φ
(
n
)
≡
x
1
∗
x
2
∗
.
.
∗
x
φ
(
n
)
(
m
o
d
n
)
a
φ
(
n
)
∗
x
1
∗
x
2
∗
.
.
∗
x
φ
(
n
)
≡
x
1
∗
x
2
∗
.
.
∗
x
φ
(
n
)
(
m
o
d
n
)
\ \ \ \ \ \ \ \ \ \ \ y_1*y_2*...*y_{\varphi(n)} \equiv x_1*x_2*..*x_{\varphi(n)}\ \ (mod\ n)\\ a^{\varphi(n)}*x_1*x_2*..*x_{\varphi(n)} \equiv x_1*x_2*..*x_{\varphi(n)}\ \ (mod\ n)
y1∗y2∗...∗yφ(n)≡x1∗x2∗..∗xφ(n) (mod n)aφ(n)∗x1∗x2∗..∗xφ(n)≡x1∗x2∗..∗xφ(n) (mod n)
化简一下有:
a
φ
(
n
)
≡
1
(
m
o
d
n
)
a^{\varphi(n)} \equiv 1\ \ (mod\ n)
aφ(n)≡1 (mod n)。
中国剩余定理与扩展中国剩余定理
代码展示请看这里。
中国剩余定理是指:
解这样一个同余方程组,其中
m
1
,
m
2
,
.
.
.
,
m
n
m_1,m_2,...,m_n
m1,m2,...,mn两两互质。
{
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)\\ .....\\ x\equiv a_n\ (mod\ m_n) \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡a1 (mod m1)x≡a2 (mod m2).....x≡an (mod mn)
做法:
令
M
=
m
1
∗
m
2
∗
.
.
.
∗
m
n
M=m_1*m_2*...*m_n
M=m1∗m2∗...∗mn。
在模
M
M
M的意义下,方程只有一个解。
再令
M
i
=
M
m
i
M_i=\frac{M}{m_i}
Mi=miM,对于每一个
M
i
M_i
Mi,求出
M
i
−
1
M_i^{-1}
Mi−1(指
M
i
M_i
Mi模
m
i
m_i
mi的逆元)。
(如果上面的模数不是两两互质的,会存在有的
M
i
M_i
Mi 的逆元求不出来)
则可以构造出:
x
=
a
1
M
1
M
1
−
1
+
a
2
M
2
M
2
−
1
+
.
.
.
+
a
n
M
n
M
n
−
1
(
m
o
d
M
)
x=a_1M_1M_1^{-1}+a_2M_2M_2^{-1}+...+a_nM_nM_n^{-1}\ (mod\ M)
x=a1M1M1−1+a2M2M2−1+...+anMnMn−1 (mod M)
简单证明:
检查该解是否满足上面的
n
n
n个线性同余方程。
对于第一个方程:
x
≡
a
1
(
m
o
d
m
1
)
x\equiv a_1\ (mod\ m_1)
x≡a1 (mod m1)。
因为
M
1
−
1
是
M
1
在
模
m
1
下
的
逆
元
M_1^{-1}是M_1在模m_1下的逆元
M1−1是M1在模m1下的逆元。所以,在模
m
1
m_1
m1的情况下,
M
1
M
1
−
1
=
1
M_1M_1^{-1}=1
M1M1−1=1。所以解
x
x
x的第一项
a
1
M
1
M
1
−
1
m
o
d
m
1
=
a
1
a_1M_1M_1^{-1}\ mod\ m_1=a_1
a1M1M1−1 mod m1=a1,而除此之外,其他的任意一个
M
i
(
i
!
=
1
)
M_i(i!=1)
Mi(i!=1),
M
i
M_i
Mi都是
m
1
m_1
m1的倍数,它们在模
m
1
m_1
m1的情况下都是等于
0
0
0的。所以整个式子模
m
1
m_1
m1是等于
a
1
a_1
a1的。
同样的,对于其他方程也可以得出类似的结论。
所以,该式子是正确的。
中国剩余定理要求 m 1 , m 2 , . . . , m n m_1,m_2,...,m_n m1,m2,...,mn两两互质,如果不互质怎么办那?这里就要用到扩展中国剩余定理了。
鸽。
扩展中国剩余定理的做法完全不同于上面,它是采用了两两合并的思想。
对于
n
n
n个线性同余方程组,它每次合并两个,合并
n
−
1
n-1
n−1次之后就剩下了一个方程,之后在解就十分简单了。
来看一看它是怎么样合并的。
{ 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)\\ .....\\ x\equiv a_n\ (mod\ m_n) \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡a1 (mod m1)x≡a2 (mod m2).....x≡an (mod mn)
我们只看前两个方程:
{
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
\begin{cases} x\equiv a_1\ (mod\ m_1)\\ x\equiv a_2\ (mod\ m_2) \end{cases}
{x≡a1 (mod m1)x≡a2 (mod m2)
对于这两个方程,改写一下方程的表示,可以这样写:
x
=
k
1
m
1
+
a
1
(1)
x=k_1m_1+a_1 \tag1
x=k1m1+a1(1)
x
=
k
2
m
2
+
a
2
(2)
x=k_2m_2+a_2 \tag2
x=k2m2+a2(2)
于是有:
k
1
m
1
+
a
1
=
k
2
m
2
+
a
2
k_1m_1+a_1=k_2m_2+a_2
k1m1+a1=k2m2+a2
整理一下:
k
1
m
1
−
k
2
m
2
=
a
2
−
a
1
k_1m_1-k_2m_2=a_2-a_1
k1m1−k2m2=a2−a1(其中,
k
1
k_1
k1和
k
2
k_2
k2是未知量)
可以用exgcd先求出一组
k
1
k_1
k1和
k
2
k_2
k2的解,记为
k
′
k^{'}
k′ 和
k
′
′
k^{''}
k′′。
这里要判断一下,如果
g
c
d
(
m
1
,
m
2
)
gcd(m_1,m_2)
gcd(m1,m2)不能整除
(
a
2
−
a
1
)
(a_2-a_1)
(a2−a1)方程是无解的。
那么
k
1
k_1
k1和
k
2
k_2
k2的通解形式可以表示为:
{
k
1
=
k
′
+
k
m
2
d
k
2
=
k
′
′
+
k
m
1
d
\begin{cases} k_1=k^{'}+k\frac{m_2}{d}\\ k_2=k^{''}+k\frac{m_1}{d} \end{cases}
{k1=k′+kdm2k2=k′′+kdm1
(
d
d
d是
g
c
d
(
m
1
,
m
2
)
gcd(m_1,m_2)
gcd(m1,m2),
k
k
k是任意整数)。
那么仅对于
(
1
)
(1)
(1)方程和
(
2
)
(2)
(2)方程来说,
x
x
x的通解就是:
x
=
(
k
′
+
k
m
2
d
)
m
1
+
a
1
x=(k^{'}+k\frac{m_2}{d})m_1+a_1
x=(k′+kdm2)m1+a1,(将
k
1
k_1
k1的通解带入到
(
1
)
(1)
(1)方程中)
化简一下有:
x
=
m
1
k
′
+
k
m
1
m
2
d
+
a
1
x=m_1k^{'}+k\frac{m_1m_2}{d}+a_1
x=m1k′+kdm1m2+a1
我们可以发现,
m
1
m
2
d
\frac{m_1m_2}{d}
dm1m2就是
m
1
m_1
m1和
m
2
m_2
m2的最小公倍数,记为
[
m
1
,
m
2
]
[m_1,m_2]
[m1,m2]。
于是有
x = k [ m 1 , m 2 ] + m 1 k ′ + a 1 x=k[m_1,m_2]+m_1k^{'}+a_1 x=k[m1,m2]+m1k′+a1,其中 [ m 1 , m 2 ] [m_1,m_2] [m1,m2]和 m 1 k ′ + a 1 m_1k^{'}+a_1 m1k′+a1都是定值。分别记为 m = [ m 1 , m 2 ] , a = m 1 k ′ + a 1 m=[m_1,m_2],a=m_1k^{'}+a_1 m=[m1,m2],a=m1k′+a1。
那么最终可以化为:
x
=
k
m
+
a
(3)
x=km+a\tag3
x=km+a(3)
然后观察一下 ( 3 ) (3) (3)式与 ( 1 ) (1) (1)式和 ( 2 ) (2) (2)式,可以惊奇的发现,它们好像是一样的?!
最终,两个方程就合并成了一个方程,我们只用方程 ( 3 ) (3) (3)就可以代表方程 ( 1 ) (1) (1)和方程 ( 2 ) (2) (2)。
合并完之后, n n n个方程变成了 n − 1 n-1 n−1个方程,然后继续合并,直到方程数为 1 1 1。