前言
前言同群论的前言 ,不管了,看的是初等数论。
第一章 整数理论
第1节 自然数、整除
自然数定义:显然在小学阶段我们就学过自然数的定义了,这里给出更加完整的定义。
自然数集合N被定义:一种运算,称之为“后继”。该集合的每个元素都满足这种后继关系,这样的元素的集合称为自然数集合。
整除的定义:显然大家是知道的。
设a,b为整数,b不等于0,若存在整数c,使a=bc,则称b可整除a,记作b|a(a除以b的余数为0)。不然,就称b不可整除a。当b可整除a时,称b为a的除数(或因数,约数),a是b的倍数,以及c是b除a所得的商。
公因数数的定义:显然这个也是大家都知道的。
如果 d|a、且d|b, 那么称d为a、b的公因数。记d = GCD(a,b)
最大公因数与最小公倍数:使用gcd
表示最大公因数,使用lcm
表示最小公倍数。
a b = g c d ( a , b ) × l c m ( a , b ) ab=gcd(a,b)\times lcm(a,b) a b = g c d ( a , b ) × l c m ( a , b )
互质的定义:如果 GCD(a, b) = 1
,那么a、b互质
质数定义:若a仅有 1和a(1 ≠ a 1\neq a 1 = a )两个因数,则称a是一质数。
下面是关于整数的基本性质:
若能整除,商唯一。a = b c 1 , a = b c 2 → b c 1 = b c 2 . ∵ b ≠ 0 , ∴ c 1 = c 2 a=bc_1,a=bc_2\rightarrow bc_1=bc_2.\because b\neq 0,\therefore c_1=c_2 a = b c 1 , a = b c 2 → b c 1 = b c 2 . ∵ b = 0 , ∴ c 1 = c 2
若b ∣ a , a ∣ c b|a,a|c b ∣ a , a ∣ c ,则有b ∣ c b|c b ∣ c
b ≠ 0 b\neq0 b = 0 的所有倍数为:0 , ± b , ± 2 b , ± 3 b , . . . 0,\pm b,\pm 2b,\pm 3b,... 0 , ± b , ± 2 b , ± 3 b , . . .
a ≠ 0 a\neq 0 a = 0 ,若 b ∣ a b|a b ∣ a ,则 ∣ b ∣ ≤ ∣ a ∣ |b| \le|a| ∣ b ∣ ≤ ∣ a ∣ ,等号当且仅当b = ± a b=\pm a b = ± a 时成立。a ( ≠ 0 ) a(\neq 0) a ( = 0 ) 的除数只有有限个,a和-a的除数相同。± 1 , ± a \pm1, \pm a ± 1 , ± a 是a的显然除数
第2节 数学归纳法
归纳原理:设S是N的一个子集,如果下面两个条件成立,那么S=N
条件1,1 ∈ S 1\in S 1 ∈ S
条件2,如果n ∈ S n\in S n ∈ S ,则n + 1 ∈ S n+1\in S n + 1 ∈ S
数学归纳法:设P(n)是关于自然数n的一种性质或命题,如果下面两个条件成立,那么P(n)对所有自然数n成立
条件1,当n=1时,P(1)成立
条件2,由P(n)成立必可推出P(n+1)成立
证明:设使P(n)成立的所有自然数n组成的集合时S,S是N的子集,由条件1知1 ∈ S 1\in S 1 ∈ S ;由条件2可知,若n ∈ S n\in S n ∈ S ,则n + 1 ∈ S n+1\in S n + 1 ∈ S ,所以由归纳原理知S = N S=N S = N 。证毕
第二种数学归纳法:设P(n)是关于自然数n的一种性质或命题,如果下面两个条件成立,那么P(n)对所有自然数n成立
条件1,当n=1时,P(1)成立
条件2,对n>1,若所有的自然数 m<n,P(m)成立,则必可推出P(n)成立
证明:反证法,若定理不成立,设T是使P(n)不成立的所有自然数组成的集合,T非空。集合T必有最小自然数t。由于P(1)成立,所以t>1。由条件2(取n=t时)可知,必有自然数m<t使得P(m)不成立。由T的定义可知m ∈ T m\in T m ∈ T ,但这和t的最小性矛盾。证毕。
第3节 同余定理
同余定义 :设a、b为两个整数,m是正整数,若 m 是 a-b 的因数,则称 a与b关于模m同余,记为 a ≡ b ( m o d m ) a\equiv b(\mod m) a ≡ b ( m o d m ) 。
我们把这个公式写一下,相当于 a − b m = k \frac{a-b}{m} = k m a − b = k 、a = k m + b a=km+b a = k m + b 、( a − b ) m o d m = 0 (或 m ∣ ( a − b ) ) (a-b) \mod m = 0(或 m|(a-b)) ( a − b ) m o d m = 0 ( 或 m ∣ ( a − b ) ) ,即a m o d m = b m o d m a\mod m = b\mod m a m o d m = b m o d m
并且有( a − b ) / m = k → a = k m + b (a-b)/m=k \rightarrow a=km+b ( a − b ) / m = k → a = k m + b
同余类 :所有和a模m同余的整数集称为a模m的同余类
a ≡ b ( m o d m ) → d a ≡ d b ( m o d m ) a\equiv b(\mod m)\rightarrow da \equiv db(\mod m) a ≡ b ( m o d m ) → d a ≡ d b ( m o d m )
a ≡ b ( m o d m ) , c ≡ d ( m o d m ) → ( a + c ) ≡ ( b + d ) ( m o d m ) a\equiv b(\mod m),\quad c\equiv d(\mod m)\rightarrow (a+c)\equiv (b+d)(\mod m) a ≡ b ( m o d m ) , c ≡ d ( m o d m ) → ( a + c ) ≡ ( b + d ) ( m o d m )
a ≡ b ( m o d m ) , c ≡ d ( m o d m ) → a c ≡ b d ( m o d m ) a\equiv b(\mod m),\quad c\equiv d(\mod m)\rightarrow ac\equiv bd(\mod m) a ≡ b ( m o d m ) , c ≡ d ( m o d m ) → a c ≡ b d ( m o d m )
如果a ≡ b ( m o d m ) , c ≡ d ( m o d m ) a\equiv b(\mod m), c\equiv d(\mod m) a ≡ b ( m o d m ) , c ≡ d ( m o d m ) ,那么a + c ≡ b + d ( m o d m ) a+c\equiv b+d(\mod m) a + c ≡ b + d ( m o d m ) 并且a c ≡ b d ( m o d m ) ac\equiv bd(\mod m) a c ≡ b d ( m o d m )
证明:
b = a + s m , d = c + t m b=a+sm, d=c+tm b = a + s m , d = c + t m
b + d = ( a + s m ) + ( c + t m ) = ( a + c ) + m ( s + t ) b+d=(a+sm)+(c+tm) =(a+c)+m(s+t) b + d = ( a + s m ) + ( c + t m ) = ( a + c ) + m ( s + t )
b d = ( a + s m ) ( c + t m ) = a c + m ( a t + s c + s t m ) bd = (a+sm)(c+tm) = ac + m(at+sc+stm) b d = ( a + s m ) ( c + t m ) = a c + m ( a t + s c + s t m )
( a + b ) m o d m = ( ( a m o d m ) + ( b m o d m ) ) m o d m (a+b)\mod m = ((a\mod m)+(b\mod m))\mod m ( a + b ) m o d m = ( ( a m o d m ) + ( b m o d m ) ) m o d m 且a b m o d m = ( ( a m o d m ) ( b m o d m ) ) m o d m ab\mod m = ((a\mod m)(b\mod m))\mod m a b m o d m = ( ( a m o d m ) ( b m o d m ) ) m o d m
证明:
∵ a ≡ ( a m o d m ) m o d m , b ≡ ( b m o d m ) m o d m \because a\equiv (a\mod m)\mod m, b\equiv (b\mod m)\mod m ∵ a ≡ ( a m o d m ) m o d m , b ≡ ( b m o d m ) m o d m
∴ a + b ≡ ( ( a m o d m ) + ( b m o d m ) ) m o d m \therefore a+b\equiv ((a\mod m)+(b\mod m) )\mod m ∴ a + b ≡ ( ( a m o d m ) + ( b m o d m ) ) m o d m
a b ≡ ( ( a m o d m ) ( b m o d m ) ) m o d m ab \equiv ((a\mod m)(b\mod m))\mod m a b ≡ ( ( a m o d m ) ( b m o d m ) ) m o d m
a ≡ 1 ( m o d m ) → a k ≡ 1 ( m o d m ) a\equiv 1(\mod m)\rightarrow a^k\equiv 1(\mod m) a ≡ 1 ( m o d m ) → a k ≡ 1 ( m o d m )
证明:a = d m + 1 a = dm+1 a = d m + 1 ,a k = ( d m + 1 ) k = ∑ i = 0 k C n i ( k m ) i = 1 + ∑ i = 1 n C n i ( k m ) i a^k = (dm+1)^k = \sum\limits_{i=0}^k C_n^i (km)^i = 1+\sum\limits_{i=1}^n C_n^i(km)^i a k = ( d m + 1 ) k = i = 0 ∑ k C n i ( k m ) i = 1 + i = 1 ∑ n C n i ( k m ) i
其中,后面那项是可以被m整除的,只剩下1了,所以原式得证
第二章 模运算
第1节 二进制
相信阅读本文的读者,对于二进制应该不陌生,这里仅仅快速提两句。假设数字 a = ( a n − 1 a n − 2 . . . a 2 a 1 a 0 ) 2 a=(a_{n-1}a_{n-2}...a_2a_1a_0)_2 a = ( a n − 1 a n − 2 . . . a 2 a 1 a 0 ) 2 用二进制表示是这样,那么在10进制的计算中有a = a n − 1 × 2 n − 1 + a n − 2 × 2 n − 2 + . . . + a 2 × 2 2 + a 1 × 2 1 + a 0 × 2 0 a=a_{n-1}\times 2^{n-1} + a_{n-2}\times 2^{n-2} + ...+ a_2\times 2^2 + a_1 \times 2^1 + a_0 \times 2^0 a = a n − 1 × 2 n − 1 + a n − 2 × 2 n − 2 + . . . + a 2 × 2 2 + a 1 × 2 1 + a 0 × 2 0 ,其中,a i = 0 o r 1 , 0 ≤ i ≤ n − 1 a_i = 0\ \ or\ \ 1, 0\leq i \leq n-1 a i = 0 o r 1 , 0 ≤ i ≤ n − 1 。
第2节 模指数运算
设想计算 b n m o d m b^n \mod m b n m o d m 的结果,第一反应肯定是把乘以n个b之后然后对m取模,倘若b n m都非常大,那么在计算机中想要计算又该如何呢?接下来介绍在计算机中这个式子应该如何化解,假设 n = ( a n − 1 a n − 2 . . . a 2 a 1 a 0 ) 2 n=(a_{n-1}a_{n-2}...a_2a_1a_0)_2 n = ( a n − 1 a n − 2 . . . a 2 a 1 a 0 ) 2 ,那么在十进制中有 n = a n − 1 × 2 n − 1 + a n − 2 × 2 n − 2 + . . . + a 2 × 2 2 + a 1 × 2 1 + a 0 × 2 0 n=a_{n-1}\times 2^{n-1} + a_{n-2}\times 2^{n-2} + ...+ a_2\times 2^2 + a_1 \times 2^1 + a_0 \times 2^0 n = a n − 1 × 2 n − 1 + a n − 2 × 2 n − 2 + . . . + a 2 × 2 2 + a 1 × 2 1 + a 0 × 2 0 ,进而有
b n = b a n − 1 × 2 n − 1 + a n − 2 × 2 n − 2 + . . . + a 2 × 2 2 + a 1 × 2 1 + a 0 × 2 0 = b a n − 1 2 n − 1 × b a n − 2 2 n − 2 × . . . × b a 1 2 1 × b a 0 2 0 = b a 0 × ( b 2 ) a 1 × ( b 4 ) a 2 × . . . b^n = b^{a_{n-1}\times 2^{n-1} + a_{n-2}\times 2^{n-2} + ...+ a_2\times 2^2 + a_1 \times 2^1 + a_0 \times 2^0} \\
= b^{a_{n-1}2^{n-1}} \times b^{a_{n-2}2^{n-2}} \times...\times b^{a_12^1}\times b^{a_02^0} \\
= b^{a_0} \times (b^{2})^{a_1} \times (b^4)^{a_2} \times ...
b n = b a n − 1 × 2 n − 1 + a n − 2 × 2 n − 2 + . . . + a 2 × 2 2 + a 1 × 2 1 + a 0 × 2 0 = b a n − 1 2 n − 1 × b a n − 2 2 n − 2 × . . . × b a 1 2 1 × b a 0 2 0 = b a 0 × ( b 2 ) a 1 × ( b 4 ) a 2 × . . .
其中,可以去除掉a j = 0 a_j = 0 a j = 0 的项,剩下a i = 1 a_i = 1 a i = 1 的项。
而且,值得注意的是,假设a 2 = 1 a_2=1 a 2 = 1 ,那么第三项其实只是变为( b 4 ) 1 = b 4 (b^4)^1 = b^4 ( b 4 ) 1 = b 4 ,所以对于第三项最终我们的任务会落在如何快速求解b 4 m o d m b^4\mod m b 4 m o d m 上来。
对于第一项,也就是i = 0 i=0 i = 0 时,b a 0 = 1 b^{a_0}=1 b a 0 = 1 。自然可以忽略掉,因此我们把目光放到后面n-1项。后面的项,则可以根据[第一章第3节](# 第3节 模)的公式计算。假设后面剩了m项,每一项的指数都是2的几次方的。对于b 2 i m o d m b^{2^i}\mod m b 2 i m o d m 快速算法可以看下面。因此我们假设剩下b n = 1 b 1 b 2 b 3 b^n = 1b_1 b_2 b_3 b n = 1 b 1 b 2 b 3 剩下了任意的三项。就可以这么计算,把b 1 b 2 b 3 b_1b_2b_3 b 1 b 2 b 3 看作一个整体,进行模运算。得到结果e 1 e_1 e 1 (e 1 < m e_1 < m e 1 < m ),再把结果和b 1 b_1 b 1 相乘后,看作整体依次往后算。
容易求得b m o d m = c b\mod m=c b m o d m = c 。其次,对于b 2 m o d m = ( b × b ) m o d m = ( ( b m o d m ) × ( b m o d m ) ) m o d m b^2 \mod m = (b\times b) \mod m = ((b\mod m )\times (b\mod m))\mod m b 2 m o d m = ( b × b ) m o d m = ( ( b m o d m ) × ( b m o d m ) ) m o d m ,其中b m o d m b\mod m b m o d m 已经求出了,带入即可。b 2 m o d m = c 2 m o d m = c 2 b^2 \mod m = c^2 \mod m=c_2 b 2 m o d m = c 2 m o d m = c 2 。可能要说了,好像没什么变化啊,无非是把b换成c了。但是,值得注意的是b的大小可能比m大,也可能比它小。而c的大小一定比m小。这样就不会超出了,对于b 4 = ( b 2 × b 2 ) m o d m = ( ( b 2 m o d m ) × ( b 2 m o d m ) ) m o d m = c 2 2 m o d m = c 4 b^4=(b^2 \times b^2)\mod m= ((b^2\mod m) \times (b^2\mod m))\mod m = c_2^2 \mod m = c_4 b 4 = ( b 2 × b 2 ) m o d m = ( ( b 2 m o d m ) × ( b 2 m o d m ) ) m o d m = c 2 2 m o d m = c 4 ,以此类推。下面给出伪代码和C++代码。
该算法的时间复杂度为:O ( ( log m ) 2 log n ) O((\log\ m)^2\log\ n) O ( ( log m ) 2 log n ) 次的二进制位运算,注意是位运算。
function b n m
e = 1
power = b mod m
for i=0 to n-1
if ai = 1 then e = (e * power) mod m
power = (power * power) mod m
return e
// 快速计算 b^n mod m
long long power_mod(long long b, long long n, long long m){
long long e = 1;
long long power = b % m;
while(n){
if(n & 0x1){
e = (e * power) % m;
}
power = (power * power) % m;
n >>= 1;
}
return e;
}
第三章 质数
每个大于1的整数都可以唯一地写成两个或更多个素数的乘积,其中素数因子已非递减序排列。
如果n是一个合数,那么n必有一个素数因子小于或等于n \sqrt{n} n 。
埃拉托斯特尼筛选法:
列出从1~n的所有整数
找到所有不超过n \sqrt{n} n 的素数,共m个
依次去除n以内能被这m个素数整除的整数
剩下的就是素数了
素数具有无限个,假如素数有限,所有素数的乘积再+1,一定是一个素数。所以又会存在更多的素数。
下面来证明为什么所有素数的乘积再+1仍然是素数,假设所有素数的集合表示为a,共n个
令q = a 1 a 2 a 3 . . . a n q=a_1a_2a_3...a_n q = a 1 a 2 a 3 . . . a n ,如果q+1不是素数,那么其一定有一个因子a 0 ∈ a a_0 \in a a 0 ∈ a 。
q + 1 a 0 = a 1 a 2 a 3 . . . a n a 0 + 1 a 0 \frac{q+1}{a_0} = \frac{a_1a_2a_3...a_n}{a_0} + \frac{1}{a_0} a 0 q + 1 = a 0 a 1 a 2 a 3 . . . a n + a 0 1 ,右边的第一项是整数,但是第二项一定是小数,所以不能被整除。
素数定理:当x无限增大时,不超过x的素数个数与x / ln x x/\ln x x / ln x 之比趋近于1。
孪生素数:相差为2的一对素数,如3和5,5和7。
辗转相除法:如何求解两个大整数的gcd呢?假设大的那个数字是a,小的那个数字是b
g c d ( a , b ) = g c d ( a − b , b ) gcd(a,b) = gcd(a-b, b) g c d ( a , b ) = g c d ( a − b , b ) ,同样缩小规模,证明方法同上。不过是c变成了a-b而已。
贝祖(裴蜀)定理:如果a和b是正整数 ,必定存在整数 s和t,使得g c d ( a , b ) = s a + t b gcd(a, b) = sa+tb g c d ( a , b ) = s a + t b 。证明请看:oi-wiki 裴蜀定理
请看后面的扩展欧几里得算法
除此之外,对这个式子做一个扩展,a x + b y = m ax+by=m a x + b y = m 有整数解,需要g(a,b)|m
如果a,b,c为正整数,使得gcd(a,b)=1
且a|bc
,那么a|c
证明:s a + t b = 1 → s a c + t b c = c sa+tb = 1\rightarrow sac+tbc=c s a + t b = 1 → s a c + t b c = c ,
a ∣ b c → a ∣ t b c , a ∣ s a c → a ∣ ( t b c + s a c ) → a ∣ c a|bc\rightarrow a|tbc, a|sac \rightarrow a|(tbc+sac) \rightarrow a|c a ∣ b c → a ∣ t b c , a ∣ s a c → a ∣ ( t b c + s a c ) → a ∣ c
如果p是素数,且p ∣ a 1 a 2 … a n p|a_1a_2\dots a_n p ∣ a 1 a 2 … a n ,其中a i a_i a i 为整数,对于某个i,p ∣ a i p|a_i p ∣ a i
令m为正整数,令a,b,c为整数。如果a c ≡ b c ( m o d m ) 且 g c d ( c , m ) = 1 ac\equiv bc(\mod m)且gcd(c,m) = 1 a c ≡ b c ( m o d m ) 且 g c d ( c , m ) = 1 ,那么a ≡ b ( m o d m ) a\equiv b(\mod m) a ≡ b ( m o d m ) 。
第四章 同余方程
第1节 引言
形如a x ≡ b ( m o d m ) ax\equiv b(\mod m) a x ≡ b ( m o d m ) 的线性方程称之为同余方程。其中,m是正整数,a,b是整数,x是变量。怎么求解线性同余方程呢?即,如何找到所有满足该方程的整数x。接下来介绍一个方法是:a ‾ a ≡ 1 ( m o d m ) \overline a a\equiv 1(\mod m) a a ≡ 1 ( m o d m ) ,如果这样的整数存在,称a ‾ \overline a a 为a模m的逆元或逆。
第2节 定理
如果a和m互素,且m>1,则a模m的逆存在,且这个模m的逆时唯一的。
∵ g c d ( a , m ) = 1 , ∃ s , t s a + t m = 1 → s a + t m ≡ 1 ( m o d m ) \because gcd(a,m) = 1,\quad \exist s,t\ \ \ sa+tm=1\rightarrow sa+tm\equiv 1(\mod m) ∵ g c d ( a , m ) = 1 , ∃ s , t s a + t m = 1 → s a + t m ≡ 1 ( m o d m )
∵ t m ≡ 0 ( m o d m ) ∴ s a ≡ 1 ( m o d m ) \because tm\equiv 0(\mod m)\therefore sa\equiv 1(\mod m) ∵ t m ≡ 0 ( m o d m ) ∴ s a ≡ 1 ( m o d m )
下面来证明唯一性:
中国同余定理:x ≡ a i ( m o d m i ) 1 ≤ i ≤ n x\equiv a_i(\mod m_i)\quad 1\leq i\leq n x ≡ a i ( m o d m i ) 1 ≤ i ≤ n ,共有n个同余式使得x均成立,求解x。
m 1 , m 2 , … , m n m_1,m_2,\dots,m_n m 1 , m 2 , … , m n 为大于1的两两互素的正整数,而a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a 1 , a 2 , … , a n 是任意整数,那么这个方程组有唯一的模m = m 1 m 2 … m n m=m_1m_2\dots m_n m = m 1 m 2 … m n 的解。(即,存在一个满足0 ≤ x ≤ m 0\leq x \leq m 0 ≤ x ≤ m 的解x,而所有其他的解均与此解模m同余)
证明存在:
设M i = m / m i , 1 ≤ i ≤ n M_i = m/m_i, 1\leq i\leq n M i = m / m i , 1 ≤ i ≤ n ,那么显然会有g c d ( M i , m i ) = 1 gcd(M_i, m_i) = 1 g c d ( M i , m i ) = 1 ,所以M i y i ≡ 1 ( m o d m i ) M_iy_i\equiv 1(\mod m_i) M i y i ≡ 1 ( m o d m i ) 存在唯一解。
要构造满足所有方程的解,求和x = ∑ i = 1 n a i M i y i x = \sum\limits_{i=1}^n a_iM_iy_i x = i = 1 ∑ n a i M i y i
当i ≠ k i\neq k i = k 时,M i ≡ 0 ( m o d m k ) M_i \equiv 0(\mod m_k) M i ≡ 0 ( m o d m k )
当i = k i=k i = k 时,M k y k ≡ 1 ( m o d m k ) → a k M k y k ≡ a k ( m o d m ) M_ky_k \equiv 1(mod m_k)\rightarrow a_kM_ky_k\equiv a_k(\mod m) M k y k ≡ 1 ( m o d m k ) → a k M k y k ≡ a k ( m o d m )
综合前面两个,所以x是x ≡ a k ( m o d m k ) x\equiv a_k(\mod m_k) x ≡ a k ( m o d m k ) 的解
假设m 1 , m 2 , … , m n m_1, m_2,\dots,m_n m 1 , m 2 , … , m n 是两两互素的模数,并令m为其乘积。根据剩余定理可以证明满足0 ≤ a < m 0\leq a< m 0 ≤ a < m 的整数a可以唯一表示成一个n元组,即( a m o d m 1 , a m o d m 2 , … , a m o d m n ) (a\mod m_1, a\mod m_2,\dots, a\mod m_n) ( a m o d m 1 , a m o d m 2 , … , a m o d m n ) ,这在计算机上的大整数计算非常适用,并且还能并行处理加快速度。
例如,存在n个模数m i , 1 ≤ i ≤ n m_i, 1\leq i \leq n m i , 1 ≤ i ≤ n ,存在两个非常大的数字N 1 , N 2 N_1,N_2 N 1 , N 2 ,那么这两个大数可以分别表示为:
N_1:\{N_1\mod m_i|(1\leq i\leq n) \and i\in Z\} = (n_{11}, n_{21},...,n_{n1}),N_2:\{N_2\mod m_i|(1\leq i\leq n) \and i\in Z\} = (n_{12}, n_{22}, ... , n_{n2})
那么有N 1 + N 2 = { ( n 11 + n 12 ) m o d m , . . . , ( n n 1 + n n 2 ) m o d m } = n 1 , n 2 , . . . , n n N_1 + N_2 = \{(n_{11}+n_{12})\mod m, ..., (n_{n1}+n_{n2})\mod m\} = {n_1,n_2, ...,n_n} N 1 + N 2 = { ( n 1 1 + n 1 2 ) m o d m , . . . , ( n n 1 + n n 2 ) m o d m } = n 1 , n 2 , . . . , n n
如何还原成大整数呢?
即求解同余方程组 x ≡ n i ( m o d m i ) , 1 ≤ i ≤ n x\equiv n_i(\mod m_i), 1\leq i\leq n x ≡ n i ( m o d m i ) , 1 ≤ i ≤ n
费马小定理:如果p为素数,a是一个不能被p整除的整数,则a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1(\mod p) a p − 1 ≡ 1 ( m o d p ) ,对每个整数a都有a p ≡ a ( m o d p ) a^p \equiv a(\mod p) a p ≡ a ( m o d p )
欧拉定理:对费马小定理的扩展,若g c d ( a , m ) = 1 gcd(a,m)=1 g c d ( a , m ) = 1 ,那么a ϕ ( n ) ≡ 1 ( m o d m ) a^{\phi(n)}\equiv1(\mod m) a ϕ ( n ) ≡ 1 ( m o d m ) ,其中ϕ ( n ) \phi(n) ϕ ( n ) 为欧拉函数。当n为素数时,ϕ ( n ) = n − 1 \phi(n)=n-1 ϕ ( n ) = n − 1 ,就是费马小定理。
伪素数:b是一个正整数,n是一个正合数且b n − 1 ≡ 1 ( m o d n ) b^{n-1} \equiv 1(\mod n) b n − 1 ≡ 1 ( m o d n ) ,则称n为以b为基数的伪素数
一个正合数n如果对于所有满足g c d ( b , n ) = 1 gcd(b, n)=1 g c d ( b , n ) = 1 的正整https://zh.wikipedia.org/wiki/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95数b都有同余式b n − 1 ≡ 1 ( m o d n ) b^{n-1} \equiv 1(\mod n) b n − 1 ≡ 1 ( m o d n ) 成立,则称为卡米切尔数。
模素数p的一个原根是Z p Z_p Z p 中的整数r使得Z p Z_p Z p 中的每个非零元素都是r的一个幂次(Z p Z_p Z p 表示小于p的非负整数集合)
详细说来,如果a是p的原根,那么有集合Z ′ = { ( a i m o d p ) ∣ 1 ≤ i < p , i ∈ Z } = ( a 1 m o d p , a 2 m o d p , . . . , a p − 1 m o d p ) Z'=\{ (a^i\mod p) | 1\leq i < p, i\in Z\} = (a^1\mod p, a^2\mod p,...,a^{p-1}\mod p) Z ′ = { ( a i m o d p ) ∣ 1 ≤ i < p , i ∈ Z } = ( a 1 m o d p , a 2 m o d p , . . . , a p − 1 m o d p )
则需要集合Z ′ Z' Z ′ 与集合Z p Z_p Z p 相等,a就是p的原根
离散对数:假设p是一个素数,r是一个模p的原根,而a满足[1, p-1)之间的一个整数。如果r e m o d p = a 且 0 ≤ e ≤ p − 1 r^e\mod p = a且 0\leq e\leq p-1 r e m o d p = a 且 0 ≤ e ≤ p − 1 ,我们说e是以r为底a模p的离散对数,并写作log r a = e \log_r a = e log r a = e (这式子是跟p有关的,但是式子中没有表现出来)
比如,找出以2为底3和5模11的离散对数,已知2 8 m o d 11 = 3 和 2 4 m o d 11 = 5 2^8\mod 11 =3和2^4\mod 11 = 5 2 8 m o d 1 1 = 3 和 2 4 m o d 1 1 = 5 ,那么有log 2 3 = 8 和 log 2 5 = 4 \log_23 = 8和\log_25=4 log 2 3 = 8 和 log 2 5 = 4
第3节 求解线性同余方程
a x ≡ b ( m o d m ) ax\equiv b(\mod m) a x ≡ b ( m o d m )
同理,该方程可以化成 a x − b m = d \frac{ax-b}{m} = d m a x − b = d ,进而化解成a x + k m = b ax+km=b a x + k m = b ,其中k、d为未知数,且k=-d,a、b、m是已知数,那么就相当于求解满足要求的x和k,相当于不定方程,或者相当于直线点集。
// 递推法求逆元
inv[1] = 1;
for (int i = 2; i <= n; ++i) {
inv[i] = (long long)(p - p / i) * inv[p % i] % p;
}
// 注意inv[0]没有定义,由于如果有i|p的情况出现,此时就不存在i的逆元
// 再看到我们用了p-p/i,防止负数出现
第4节 扩展欧几里得算法
下面用数学的式子给出其步骤吧:记a = r 0 , b = r 1 a=r_0, b=r_1 a = r 0 , b = r 1 ,由上述证明可以知道g c d ( r i , r i + 1 ) = g c d ( r i + 1 , r i + 2 ) gcd(r_i, r_{i+1}) = gcd(r_{i+1}, r_{i+2}) g c d ( r i , r i + 1 ) = g c d ( r i + 1 , r i + 2 ) ,对任意i均成立。
r 0 = k 1 r 1 + r 2 r_0 = k_1 r_1 + r_2 r 0 = k 1 r 1 + r 2 ,r 1 = k 2 r 2 + r 3 r_1 = k_2r_2+r_3 r 1 = k 2 r 2 + r 3 ,…,r i = k i + 1 r i + 1 + r i + 2 r_i=k_{i+1}r_{i+1}+r_{i+2} r i = k i + 1 r i + 1 + r i + 2 ,…,直到r i + 2 = 0 r_{i+2}=0 r i + 2 = 0 ,算法就可以停止了,最终结果便是g c d ( a , b ) = g c d ( r i , r i + 1 ) = r i + 1 gcd(a,b) = gcd(r_{i}, r_{i+1})=r_{i+1} g c d ( a , b ) = g c d ( r i , r i + 1 ) = r i + 1 。
第五章 同余应用
散列函数:散列函数中最简单的就是取余的散列函数了,如果同余的话,那么就会发生散列碰撞了。
伪随机数:常用的伪随机数是:x n + 1 = ( a x n + c ) m o d m x_{n+1} = (ax_n+c)\mod m x n + 1 = ( a x n + c ) m o d m
检验码:奇偶校验位常用模2来检测,也就是最终检测r e s ≡ 1 ( m o d n ) res\equiv1(\mod n) r e s ≡ 1 ( m o d n )