同余定理公式及解释?
同余定理
一、同余:
对于整数除以某个正整数的问题,如果只关心余数的情况,就产生同余的概念。
定义1 用给定的正整数m分别除整数a、b,如果所得的余数相等,则称a、b对模m同余,记作a≡b(mod m),如 56≡0 (mod 8)
定理1 整数a,b对模m同余的充要条件是 a-b能被m整除(即m|a-b)。
证 :设a=mq1+r1, 0<=r1 若a≡b(mod m),按定义1,r1=r2,于是a-b=m(q1+q2),即有m|a-b. 反之,若m|a-b,即m|m(q1-a2)+r1-r2,则m|r1-r2,但|r1-r2| 推论 a≡b(mod m)的充要条件是a=mt+b(t为整数)。 表示对模m同余关系的式子叫做模m的同余式,简称同余,同余式的记号是高斯(Gauss)在1801年首先使用的。 定理2 同余关系具有反身性、对称性与传递性,即 1)a≡a (mod m); 2)若a≡b (mod m), 则b≡a (mod m); 3)若a≡b (mod m), b≡c (mod m),则a≡c (mod m). 定理3 若a≡b(mod m), c≡d (mod m),则 1)a+c≡b+d (mod m); 2)a-c≡b-d (mod m); 3)ac≡bd (mod m). 多于两个的同模同余式也能够进行加减乘运算。 对于乘法还有下面的推论: 推论 若a≡b(mod m),n为自然数,则an≡bn (mod m)。 定理4 若ca≡cb(mod m), (c,m)=d, 且a,b为整数,则a≡b(mod m/d). 推论 若ca=cb(mod m), (c,m)=1,且a,b为整数,则a≡b(mod m). 定理5 若a≡b (mod m),a≡b (mod n),则a≡b(mod [m,n]). 推论 若a≡b(mod mi), i=1,2,…,n,则a≡b (mod [m1,m2,..,mn]). 例:已知23 ≡ 1(mod 7),则22005 ≡ 23*668+1 ≡ (23)668*2 ≡ 2(mod 7) (该计算使用了定理3) 证:23 ≡ 1(mod 7),由定律5,得23 * 23 ≡ 1*1(mod 7)…(23)668 ≡ 1(mod 7), 故,(23)668*2 ≡ 2(mod 7)。 算法运用: 1.乘法取模:ab mod n = (a mod n)(b mod n) mod n 1 //2.a*b%c 2 int mul_mod(int a, int b, int c) 3 { 4 int r = 1, d = a; 5 while(b) 6 { 7 if(b&1) 8 r = (r*d)%c; 9 d = (d*d)%c; 10 b >>= 1; 11 } 12 return r; 13 } 2.大整数取模: 1 //大整数取模 n%m 2 int big_mod(char n[], int m) 3 { 4 int len = strlen(n); 5 long long ans=0; 6 for(int i=0; i 3. 幂取模 1 //1.根据定义 2 int pow_mod(int a, int n, int m) 3 { 4 long long ans=1; 5 for(int i=0; i 1 //2.分治法思想 2 int pow_mod(int a, int n, int m) 3 { 4 if(n == 0) 5 return 1; 6 int x = pow_mod(a, n/2, m); 7 long long ans = (long long)x*x%m; 8 if(n%2 == 1) 9 ans = ans*a%m; 10 return (int)ans; 11 } 定义2 如果m为自然数,集合Kr={x|x=mt+r,t是任意整数},r=0,1,…,m ,则称K0,K1,…,Km-1为模m的剩余类。 例如,模2的剩余类是偶数类与奇数类;模3的剩余类是:K0={…,-6,-3,0,3,6,…},K1={…,-5,-2,1,4,7,…},K2={…,-4,-1,2,5,8…}。 剩余类具有如下列比较明显的性质: 1)模m的剩余类K0,K1,……,Km-1都是整数的非空子集; 2)每个整数必属于且只属于一个剩余类; 3)两个整数属于同一个剩余类的充要条件是它们对模m同余。 定义3 从模m的每个剩余类中任取一个数,所得到的m个数叫做模m的完全剩余系。 对模m来说,它的完全剩余系是很多的,经常采用的是: 0,1,2,…,m-1; 1,2,3,…,m; -(m-1)/2,…,-1,0,1,…,m/2 (m为奇数), -m/2+1,…,-1,0,1,…,m/2 (m为偶数), -m/2,…,-1,0,1,…,m/2-1 (m为偶数). 定理6 k个整数a1,a2,…,ak构成模m的完全剩余系的充要条件是k=m,且这m个数对模m两两不同余。 定理7 若x1,x2,…,xm 是模m的完全剩余系,(a,m)=1,b为整数,则ax1+b,ax2+b,…,axm+b也是模m的完全剩余系。 二 、欧拉函数 定义1 在模m的完全剩余系中,所有与m互素的数叫做模m的简化剩余系。例如1,3,7,9是模10的一个简化剩余系。 定义2 若对任意的自然数m,用记号ф(m)表示0,1,2,…,m-1中与m互素的数的个数,则称ф(m)为欧拉函数。 例如ф(10)=4,ф(7)=6,ф(1)=1。 定理1 k个整数a1,a2,…,ak构成模m简化剩余系的充要条件是k=ф(m),(ai,m)=1,i=1,2,…, ф(m),且这ф(m)个数对模m两两不同余。 定理2 若(a,m)=1,x1,x2,…,xф(m)是模m的简化剩余系,则ax1,ax2,…,axф(m)也是模m的简化剩余系。 定理3 (欧拉定理) 若(a,m)=1,则aф(m) ≡1 (mod m) 证:设x1,x2,…,xф(m)是模m的简化剩余系,根据定理2,ax1,ax2,…,axф(m)也是模m的简化剩余系。 由此可知x1,x2,…,xф(m)中任一个数必与ax1,ax2,…,axф(m)中某一个数对模m同余; 反之ax1,ax2,…,axф(m)中任一个数必与x1,x2,…,xф(m)中某一个数对模m同余,这就有: ax1ax2…axф(m)≡x1x2…xф(m) (mod m),又(x1x2…xф(m),m)=1,所以aф(m) ≡1 (mod m)。 例1 已知x=h是使ax≡1 (mod m)中成立的最小正整数,求证h|ф(m)。 证 由ah-1=mt(t为整数)可知(a,m)=1,于是 aф(m) ≡1 (mod m)。 令ф(m)=hq+r,0<=r 代入上面的同余式,可得 ar ≡1 (mod m),所以r=0,故h|ф(m)。 推论(费马小定理) 若p是素数,则 1) 当(a,p)=1时,ap-1 ≡1 (mod p); 2) ap ≡a (mod p) 证: 先证1),由p是素数,知0,1,2,…,p-1中有p-1个数与p互素,于是ф(p)=p-1。又因为(a,p)=1,所以根据定理3得证1)。 再证2),当(a,p)=1时,由1)知2)成立;当(a,p)不等于1时,p|a,余数同为0,2)也成立。 欧拉在1760年证明了定理3,故称为欧拉定理。费马在1640年提出了上面的推论,它的证明是欧拉在1736年完成的,这个推论通常叫做费马小定理。 例2 设a为整数,求证a5≡a(mod 30). 证 由于30=2.3.5,而依据费马小定理,有 a5≡a(mod 5) (1) a3≡a(mod 3) (2) a2≡a(mod 2) (3) 由(2)得 a5≡a3≡a(mod 3) (4) 由(3)得a5≡a4≡a2≡a(mod 2) (5) 于是由(1).(4),(5),并且2,3,5两两互素,所以 a5≡a(mod 30). 定理4 若p是素数,则ф(pa)=pa-pa-1。 (ф(pa)的计算公式) 证 考虑模pa的完全剩余系0,1,2,…,p,…,2p,…,pa-1 (1) (1)式中与pa不互素的数只有p的倍数0,p,2p,…,(pa-1–1)p,这共有p a-1个, 于是(1)中与pa互素的数有pa-p a-1个,所以ф(pa)=pa-pa-1。 定理5 若(m,n)=1,则ф(mn)=ф(m)ф(n)。 推论 若正整数m1,m2,…mk两两互素,则ф(m1m2…mk)=ф(m1)ф(m2)…ф(mk). 定理6 若m的标准分解式为m=p1a1p2a2…pkak,则ф(m)=p1a1-1p2a2-1…pkak-1(p1-1)(p2-1)…(pk-1). 例3 设(n,10)=1,求证n101与n的末三位数相同。 证:为了证明n101-n≡0只要证明n100≡1(mod 1000). 事实上由(n,125)=1,φ(125)= φ(5^3)=5^3-5^2=100,有n100≡1(mod 125); 再由n是奇数知8|n^2-1,进而n^100≡1(mod 8),而(125,8)=1,得证。 算法: 1.求解φ(n) 1 //直接求解欧拉函数 2 int phi(int n) 3 { 4 //返回euler(n) 5 int res=n,a=n; 6 for(int i=2;i*i<=a;i++) 7 { 8 if(a%i==0) 9 { 10 res=res/i*(i-1); //先进行除法是为了防止中间数据的溢出 11 while(a%i==0) a/=i; 12 } 13 } 14 if(a>1) 15 res=res/a*(a-1); 16 return res; 17 } 筛选法打欧拉函数表 #define Max 1000001 int euler[Max]; void Init() { for(int i=1;i