数论
文章目录
一、数学基础
-
素数
- 如果大于 1 1 1 的正整数 p p p 仅有的正因子是 1 1 1 和 p p p , 称 p p p 为素数(prime)。
- 大于 1 1 1 又不是素数的正整数称为合数。
- 如果 n n n 是合数, 则 n n n 必有一个小于或等于 n \sqrt n n 的素因子。
-
算术基本定理
- 每个正整数都可以惟一地表示成素数的乘积,其中素数因子从小到大依次出现(这里的“乘积”可以有0个、1个或多个素因子)。
- 定理证明:详见百度百科
- 换句话说, 任意正整数
n
n
n 可以写成如下形式(其中
a
1
,
a
2
,
a
3
a_1,a_2,a_3
a1,a2,a3 等为非负整数,这个定理也叫做惟一分解定理 )。
n = 2 a 1 × 3 a 2 × 5 a 3 × 7 a 4 ⋯ n=2^{a_1}\times3^{a_2}\times5^{a_3}\times7^{a_4}\cdots n=2a1×3a2×5a3×7a4⋯ - 推论:如果质数 p p p 是 a b ab ab 的因子,那么 p p p 或者是 a a a 的因子,或者是 b b b 的因子。
-
求N以内的素数
- 模拟:略
- 筛法:
- 埃拉托斯特尼筛法
O
(
n
log
log
n
)
O(n\log\log n)
O(nloglogn) :给出
2
—
N
2—N
2—N 是自然数表,从前往后筛掉合数,剩下的就是素数。步骤如下:
- 首先找到 2 2 2 为素数,则 2 2 2 的倍数一定是合数,筛掉;
- 后面第一个没有筛掉的数一定是素数,即
3
3
3 ,同样筛掉
3
3
3 的倍数,以此类推,直到筛掉所有合数为止。
- 欧拉筛法
O
(
n
)
O(n)
O(n) :我们发现按照上面的方法进行筛除会有重复的情况,可以不重复吗?答案是肯定的!
难点在于:
为什么这里要 break?先可以得出一个结论,此时的 p r i [ j ] pri[j] pri[j] 为 i ⋅ p r i [ j ] i\cdot pri[j] i⋅pri[j] 的最小质因数。现设 x = p 1 ⋅ a x=p_1\cdot a x=p1⋅a 为合数,且 p 1 p_1 p1 为其最小的质因子, a a a 为质数或合数,若为质数,则设 a = 1 × p ′ ( a ′ = 1 ) a=1\times p'(a'=1) a=1×p′(a′=1),否则设 a = a ′ ⋅ p ′ a=a'\cdot p' a=a′⋅p′ , p ′ p' p′ 为质数(因为任意一个合数都可以表示成一个质数和另一个数的乘积)。则 x = ( p 1 ⋅ a ′ ) ⋅ p ′ = p 1 ⋅ ( a ′ ⋅ p ′ ) x=(p_1\cdot a')\cdot p'=p_1\cdot(a'\cdot p') x=(p1⋅a′)⋅p′=p1⋅(a′⋅p′) ,且可以知道 p 1 ⋅ a ′ ≤ p ′ ⋅ a ′ p_1\cdot a'\leq p'\cdot a' p1⋅a′≤p′⋅a′ ,即合数 p 1 ⋅ a ′ p_1\cdot a' p1⋅a′ 小于合数 p ′ ⋅ a ′ p'\cdot a' p′⋅a′ ,且 p 1 ≤ p ′ p_1\leq p' p1≤p′ ,故得出结论,即比一个合数数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到。
在上面实现代码中, i i i 在 [ 2 , m ] [2,m] [2,m] 间循环,在 i = p 1 ⋅ a i=p_1\cdot a i=p1⋅a 时,若满足 i m o d p r i [ j ] = 0 i\: mod\: pri[j]=0 imodpri[j]=0 而不break的话,有可能在后面遇到一个 p r i [ k ] pri[k] pri[k] ,使得某个数 x ′ = p 1 ′ ⋅ a ′ ⋅ p r i [ k ] x'=p_1'\cdot a'\cdot pri[k] x′=p1′⋅a′⋅pri[k] ,在之后 i = a ′ ⋅ p r i [ k ] i=a'\cdot pri[k] i=a′⋅pri[k] 时,还会再和 p 1 ′ p_1' p1′ 相乘重新进行 f l a g [ i ⋅ p r i [ j ] ] = 1 flag[i \cdot pri[j]] = 1 flag[i⋅pri[j]]=1 ; 赋值,这样就造成了重复赋值,降低了效率,如果break了,则不会出现这样的情况。
- 埃拉托斯特尼筛法
O
(
n
log
log
n
)
O(n\log\log n)
O(nloglogn) :给出
2
—
N
2—N
2—N 是自然数表,从前往后筛掉合数,剩下的就是素数。步骤如下:
-
整数的整除性
- a a a 除以非 0 0 0 整数 b b b 商为整数,且余数为零。 (我们就 a a a 能被 b b b 整除或说 b b b 能整除 a a a ,记作 b ∣ a b|a b∣a )
- 可整除性的基本性质
- 若 a ∣ b a|b a∣b , a ∣ c a|c a∣c , 则 a ∣ ( b + c ) a|(b+c) a∣(b+c)
- 若 a ∣ b a|b a∣b , 那么对所有整数 c c c , a ∣ b c a|bc a∣bc
- 若 a ∣ b a|b a∣b , b ∣ c b|c b∣c , 则 a ∣ c a|c a∣c ,整除关系具有传递性
-
除法和同余
- 令 a a a 为整数, d d d 为正整数,那么有惟一的整数 q q q 和 r r r ,其中 0 ≤ r < d 0\leq r<d 0≤r<d ,使得 a = d q + r a=dq+r a=dq+r
- 可以用这个定理来定义除法: d d d 叫除数, a a a 叫被除数, q q q 叫商, r r r 叫余数。
- 如果两个数 a a a , b b b 除以一个数 c c c 的余数相等,说 a a a 和 b b b 关于模 c c c 同余,记作 a ≡ b ( m o d c ) a≡b\pmod{c} a≡b(modc)
- a ≡ b ( m o d c ) a≡b\pmod{c} a≡b(modc) 成立的充要条件是 c ∣ ( a − b ) c|(a-b) c∣(a−b)
-
最大公约数和最小公倍数
- 令 a a a 和 b b b 是不全为 0 0 0 的两个整数,能使 d ∣ a d|a d∣a 和 d ∣ b d|b d∣b 的最大整数称为 a a a 和 b b b 的最大公约数,用 g c d ( a , b ) gcd(a,b) gcd(a,b) 表示,或者记为 ( a , b ) (a,b) (a,b)。
- 令 a a a 和 b b b 是不全为 0 0 0 的两个整数,能使 a ∣ d a|d a∣d 和 b ∣ d b|d b∣d 的最小整数称为 a a a 和 b b b 的最小公倍数,用 l c m ( a , b ) lcm(a,b) lcm(a,b) 表示,或者记为 [ a , b ] [a,b] [a,b] 。
- 定理:
a
b
=
g
c
d
(
a
,
b
)
⋅
l
c
m
(
a
,
b
)
ab = gcd(a,b)\cdot lcm(a,b)
ab=gcd(a,b)⋅lcm(a,b)
- 证明:
使用惟一分解定理. 设
a = p 1 a 1 ⋅ p 2 a 2 ⋯ p n a n b = p 1 b 1 ⋅ p 2 b 2 ⋯ p n b n a=p_1^{a_1}\cdot p_2^{a_2} \cdots p_n^{a_n}\quad b=p_1^{b_1}\cdot p_2^{b_2}\cdots p_n^{b_n} a=p1a1⋅p2a2⋯pnanb=p1b1⋅p2b2⋯pnbn
则有
l c m ( a , b ) = p 1 m a x ( a 1 , b 1 ) ⋅ p 2 m a x ( a 2 , b 2 ) ⋯ p n m a x ( a n , b n ) lcm(a,b) =p_1^{max(a_1,b_1)}\cdot p_2^{max(a_2,b_2)}\cdots p_n^{max(a_n,b_n)} lcm(a,b)=p1max(a1,b1)⋅p2max(a2,b2)⋯pnmax(an,bn)
g c d ( a , b ) = p 1 m i n ( a 1 , b 1 ) ⋅ p 2 m i n ( a 2 , b 2 ) ⋯ p n m i n ( a n , b n ) gcd(a,b) =p_1^{min(a_1,b_1)}\cdot p_2^{min(a_2,b_2)}\cdots p_n^{min(a_n,b_n)} gcd(a,b)=p1min(a1,b1)⋅p2min(a2,b2)⋯pnmin(an,bn)
显然 m a x ( x , y ) ⋅ m i n ( x , y ) = x y max(x,y)\cdot min(x,y)=x y max(x,y)⋅min(x,y)=xy
故 a b = g c d ( a , b ) ⋅ l c m ( a , b ) ab = gcd(a,b)\cdot lcm(a,b) ab=gcd(a,b)⋅lcm(a,b)
- 证明:
-
取模运算的一些性质
- ( a + b ) m o d m = ( a m o d m + b m o d m ) m o d m (a+b)\bmod m=(a\bmod m+b\bmod m)\bmod m (a+b)modm=(amodm+bmodm)modm
- ( a − b ) m o d m = ( ( a m o d m − b m o d m ) m o d m + m ) m o d m ( a > b ) (a-b)\bmod m=((a\bmod m-b\bmod m)\bmod m+m)\bmod m\quad(a>b) (a−b)modm=((amodm−bmodm)modm+m)modm(a>b)
- ( a × b ) m o d m = ( a m o d m × b m o d m ) m o d m (a\times b)\:mod\:m=(a\bmod m\times b\bmod m)\bmod m (a×b)modm=(amodm×bmodm)modm
二、欧几里德算法
-
欧几里德算法(gcd)–辗转相除法
- 利用公式
g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a, b)=gcd(b, a\bmod b) gcd(a,b)=gcd(b,amodb)
求解 g c d ( a , b ) gcd(a,b) gcd(a,b) ,时间复杂度为 O ( log b ) O(\log b) O(logb) - 证明:
- 第一步:令 c = g c d ( a , b ) c=gcd(a,b) c=gcd(a,b),则设 a = m c a=m c a=mc , b = n c b=nc b=nc
- 第二步:可知 r = a − k b = m c − k n c = ( m − k n ) c r =a-kb=m c-knc=(m-kn)c r=a−kb=mc−knc=(m−kn)c
- 第三步:根据第二步结果可知c也是r的因数
- 第四步:可以断定
m
−
k
n
m-kn
m−kn 与
n
n
n 互素
【否则,可设
m − k n = x d n = y d ( d > 1 ) m-kn=xd\qquad n=yd\qquad (d>1) m−kn=xdn=yd(d>1)
则 m = k n + x d = k y d + x d = ( k y + x ) d m=kn+xd=kyd+xd=(ky+x)d m=kn+xd=kyd+xd=(ky+x)d
则 a = m c = ( k y + x ) d c b = n c = y c d a=mc=(ky+x)d c\qquad b=n c=ycd a=mc=(ky+x)dcb=nc=ycd
故 g c d ( a , b ) ≥ c d gcd(a,b)≥cd gcd(a,b)≥cd,而非 c c c ,与前面结论矛盾】
从而可知 g c d ( b , r ) = c gcd(b,r)=c gcd(b,r)=c,继而 g c d ( a , b ) = g c d ( b , r ) gcd(a,b)=gcd(b,r) gcd(a,b)=gcd(b,r),得证
- 利用公式
-
裴蜀定理
- 定理内容:对于不完全为 0 0 0 的非负整数 a a a, b b b, g c d ( a , b ) gcd(a,b) gcd(a,b)表示 a a a, b b b 的最大公约数,必然存在整数对 x x x, y y y ,使得 g c d ( a , b ) = a x + b y gcd(a,b)=ax+by gcd(a,b)=ax+by。
- 证明:详见百度百科
- 推论: a a a, b b b 互质的充要条件是存在整数 x x x, y y y 使 a x + b y = 1 ax+by=1 ax+by=1。
-
n
n
n 个整数间的裴蜀定理:
- 设 a 1 , a 2 , a 3 , ⋯ , a n a_1,a_2,a_3,\cdots,a_n a1,a2,a3,⋯,an 为 n n n 个整数, d d d 是它们的最大公约数,那么存在整数 x 1 , x 2 , x 3 , ⋯ , x n x_1,x_2,x_3,\cdots,x_n x1,x2,x3,⋯,xn 使得 x 1 ⋅ a 1 + x 2 ⋅ a 2 + ⋯ + x n ⋅ a n = d x_1\cdot a_1+x_2\cdot a_2+\cdots+x_n\cdot a_n=d x1⋅a1+x2⋅a2+⋯+xn⋅an=d 。
- 特别来说,如果 a 1 , ⋯ , a n a_1,\cdots,a_n a1,⋯,an 互质(不是两两互质),那么存在整数 x 1 , ⋯ , x n x_1,\cdots,x_n x1,⋯,xn 使得 x 1 ⋅ a 1 + x 2 ⋅ a 2 + ⋯ + x n ⋅ a n = 1 x_1\cdot a_1+x_2\cdot a_2+\cdots+x_n\cdot a_n=1 x1⋅a1+x2⋅a2+⋯+xn⋅an=1 。
-
扩展欧几里德算法(exgcd)
-
根据裴蜀定理 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b),怎么求这个特解 x x x , y y y 呢?只需要在欧几里德算法的基础上加点改动就行了。
-
我们注意到:欧几里德算法停止的状态是: a = g c d a = gcd a=gcd , b = 0 b=0 b=0,即当 x = 1 x=1 x=1 , y = 0 y=0 y=0 时,这是最终状态。
-
设 x x x , y y y 和 x 1 x_1 x1 , y 1 y_1 y1 是两组解,且满足:
由
a x + b y = g c d ( a , b ) ax+by = gcd(a,b) ax+by=gcd(a,b)
a x 1 + b y 1 = g c d ( a , b ) = g c d ( b , a m o d b ) = b x 1 + ( a m o d b ) y 1 ax_1+by_1 = gcd(a,b)=gcd(b,a\bmod b)=bx_1+(a\bmod b)y_1 ax1+by1=gcd(a,b)=gcd(b,amodb)=bx1+(amodb)y1
得
a x + b y = b x 1 + ( a m o d b ) y 1 ax+by=bx_1+(a\bmod b)y_1 ax+by=bx1+(amodb)y1
设 k = a b , r = a m o d b k=\frac ab,r=a\bmod b k=ba,r=amodb ,则 r = a − k b r=a-kb r=a−kb
代入上式得
a x + b y = b x 1 + ( a − a b ⋅ b ) y 1 ax+by=bx_1+(a-\frac ab\cdot b)y_1 ax+by=bx1+(a−ba⋅b)y1
a x + b y = a y 1 + b ( x 1 − a b ⋅ y 1 ) ax+by=ay_1+b(x_1-\frac ab\cdot y_1) ax+by=ay1+b(x1−ba⋅y1)
得 x = y 1 y = x 1 − a b ⋅ y 1 x=y_1 \qquad y=x_1-\frac ab\cdot y1 x=y1y=x1−ba⋅y1int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1;y=0; return a; } int temp=exgcd(b,a%b,x,y); int t=x;x=y;y=t-a/b*y; return temp; }
-
-
扩展欧几里德的应用
-
解不定方程 a x + b y = c ( a , b , c , x , y ∈ Z ) ax+by=c\qquad(a,b,c,x,y\in Z) ax+by=c(a,b,c,x,y∈Z)
- 方程 a x + b y = c ax+by=c ax+by=c 并不总是有解,当且仅当 g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)∣c 有解
- 由扩展欧几里得定理知一定存在
x
0
x_0
x0 ,
y
0
y_0
y0 使得
a
x
0
+
b
y
0
=
g
c
d
(
a
,
b
)
ax_0+by_0=gcd(a,b)
ax0+by0=gcd(a,b) 。则可由exgcd求出
x
0
x0
x0 ,
y
0
y0
y0,则
x
1
=
c
d
⋅
x
0
x_1=\frac cd\cdot x_0
x1=dc⋅x0 ,
y
1
=
c
d
⋅
y
0
y_1=\frac cd\cdot y_0
y1=dc⋅y0 为方程
a
x
+
b
y
=
c
ax+by=c
ax+by=c 的一组解,则方程
a
x
+
b
y
=
c
ax+by=c
ax+by=c 的通解为
x = x 1 + b d ⋅ k y = y 1 − a d ⋅ k ( k ∈ Z ) x=x_1+\frac bd\cdot k\qquad y=y_1-\frac a d\cdot k\qquad (k\in Z) x=x1+db⋅ky=y1−da⋅k(k∈Z) - 证明如下:
a x 1 + b y 1 = a x + b y = c ax_1+by_1=ax+by=c ax1+by1=ax+by=c
a ( x 1 − x ) = b ( y − y 1 ) a(x_1-x)=b(y-y_1) a(x1−x)=b(y−y1)
a d ( x 1 − x ) = b d ( y − y 1 ) \frac ad(x_1-x)=\frac bd(y-y_1) da(x1−x)=db(y−y1)
此时 a d a\over d da 和 b d b\over d db 一定互素,因此 x 1 − x x_1-x x1−x 一定是 b d b\over d db 的整数倍,设为 k ⋅ b d k\cdot \frac bd k⋅db ,同理 y − y 1 y-y_1 y−y1一定是 a d a\over d da 的整数倍,设为 k ⋅ a d k\cdot\frac ad k⋅da ,因此任意解为 x 1 + b d ⋅ k x_1+\frac bd\cdot k x1+db⋅k , y 1 − a d ⋅ k y_1- \frac ad \cdot k y1−da⋅k , k k k 取任意整数。
-
解模线性方程
对于线性同余方程: a x ≡ m ( m o d b ) ax≡m\pmod{b} ax≡m(modb) 转化为 a x + b y = m ax+by=m ax+by=m 则可直接求解
-