数学基础

互质:

互质是公约数只有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)

[$ b = k_3 * a,c = k_4 * a ]

k_1

  • a|b,b|a => |a| = |b|
    a != 0,b ≠ 0,

[b = k_1 * a,a = k_2 * b,相乘 ]

[a*b = k_1*k_2*a*b ]

[1 = k_1 * k_2, ]

[k_1 = k_2 = 1,或 k_1 = k_2 = -1, ]

  • b|a,c|a,(b,c) = 1 <=> b*c|a
    互质: 质因数分解/算数基本定理,(b,c) = 1,分解后没有相同的项

[N = p_1^m_1*p_2^m_2*p_3^m_3...p_n^m_n ]

x|N,
y|N,
xy 的质因数全出现在N的质因数

[a = k_1 * b,a = k_2 * c, a = k_3 * b * c ]

6|12,4|12,24 X 12

  • a|bc,(a,b)=1, => a|c
    b
    c = 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
b
inv(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;
}
岂能尽如人意,但求无愧我心
原文地址:https://www.cnblogs.com/Zforw/p/10543253.html