互质:
互质是公约数只有1的两个整数,叫做互质整数。公约数只有1的两个自然数,叫做互质自然数,后者是前者的特殊情形。互质数的写法:如c与m互质,则写作(c,m)= 1。
判断方法:
(1)两个不同的质数一定是互质数。
例如,2与7、13与19。
(2)一个质数,另一个不为它的倍数,这两个数为互质数。
例如,3与10、5与 26。
(3)1不是质数也不是合数,它和任何一个自然数(1本身除外)在一起都是互质数。如1和9908。
(4)相邻的两个自然数是互质数。如 15与 16。
(5)相邻的两个奇数是互质数。如 49与 51。
(6)较大数是质数的两个数是互质数。如97与88。
(7)两个数都是合数(二数差又较大),较小数所有的质因数,都不是较大数的约数,这两个数是互质数。
如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。
(8)两个数都是合数(二数差较小),这两个数的差的所有质因数都不是较小数的约数,这两个数是互质数。如85和78。85-78=7,7不是78的约数,这两个数是互质数。
(9)两个数都是合数,较大数除以较小数的余数(不为“0”且大于“ 1”)的所有质因数,都不是较小数的约数,这两个数是互质数。如 462与 221
462÷221=2……20,
20=2×2×5。
2、5都不是221的约数,这两个数是互质数。
(10)减除法。如255与182。
255-182=73,观察知 73182。
182-(73×2)=36,显然 3673。
73-(36×2)=1,
(255,182)=1。
所以这两个数是互质数。
三个或三个以上自然数互质有两种不同的情况:一种是这些成互质数的自然数是两两互质的。如2、3、5。另一种不是两两互质的。如6、8、9。
C++实现
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
if(gcd(a,b) == 1) printf("Yes");
else printf("No");
整除:
a|b <=> b = ka ,a,b∈Z,且 a ≠ 0
a|0.
性质:
- 传递性
a|b, b|c, => a|c - a|b , a|c, 则 a|(k_1 * b + k_2 * c)
k_1
- a|b,b|a => |a| = |b|
a != 0,b ≠ 0,
- b|a,c|a,(b,c) = 1 <=> b*c|a
互质: 质因数分解/算数基本定理,(b,c) = 1,分解后没有相同的项
x|N,
y|N,
xy 的质因数全出现在N的质因数
6|12,4|12,24 X 12
- a|bc,(a,b)=1, => a|c
bc = k*a
a的质数中完全出现在c的质因数中
质数:
a > 1,a ∈ N*,a ≠ bc,b,c∈Z,b,c ≠ 1
同余
a = kb + r, 0 < r < |b|
a ÷ b = k ... r
r = a mod b <=> a % b
a = kb - r <=> b|(a - r)
(1 ~ 6) mod 3, 1,2,0,1,2,0
a mod b = c mod b,
=> a ≡ c(mod b),a和c对模b同余
- a ≡ b(mod p),c ≡ d(mod p) => a + c ≡ b + d(mod p)
: p|a - b,p|c - d, => p|(a - b)+(c - d) => a+c ≡ b+d(mod p) - a ≡ b(mod m),c ≡ d(mod m)
a + c ≡ b + d(mod m)
a - c ≡ b - d(mod m)
a × c ≡ b × d(mod m)
- ad ≡ bd(mod md) <=> a ≡ b(mod m)
:md|ad - bd => m|a - b
乘法逆元
a/b mod p = (ainv(b)) mod p
binv(b) % p = 1, inv(b) = x
P1029 P1017 P1403
辗转相除法(欧几里德算法)
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
因此d也是b,a mod b的公约数
假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数,
进而d|a.因此d也是a,b的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
Code
int gcd(int a,int b){
return (b==0) ? a : gcd(b,a % b);
}
int a,int b;
while(b != 0){
int r=a%b;
a=b;
b=r;
}