md鼻塞真难受
欧几里得辗转相除法:求a,b的最大公约数
1 2 3 int gcd (int a, int b) { return a % b == 0 ? b : gcd (b, a % b); }
几何证明:
问可以用最大边长为多少的正方形填满这个 20 * 56 的长方形 ?
我们首先必然可以使用20边长的去填,于是得到了余下的16*20的长方形
以此类推,我们可以得到这样子的填补,显而4是最大的正方形可以填补该最大长方形,所以4就是20和56的最大公约数。
:
1 2 3 56 ÷ 20 = 2 ······ 16 20 ÷ 16 = 1 ······ 4 16 ÷ 4 = 0
我们设余数是 r r r ,被除数是 a a a ,除数是 b b b ,商是 c c c ,a 、 b a、b a 、 b 的最大公约数是 s s s ,得 r = a − b ∗ c r = a - b*c r = a − b ∗ c
又因为 s ∣ r , s ∣ b s|r, s|b s ∣ r , s ∣ b
g c d ( 56 , 20 ) = g c d ( 20 , 16 ) = g c d ( 16 , 4 ) = 4 gcd(56,20) =gcd(20,16)=gcd(16,4)=4 g c d ( 5 6 , 2 0 ) = g c d ( 2 0 , 1 6 ) = g c d ( 1 6 , 4 ) = 4
则
g c d ( a , b ) = g c d ( b , a gcd(a,b) = gcd(b, a g c d ( a , b ) = g c d ( b , a %$b) $
裴蜀定理: (我写的是狗屎 ,)
设 a , b a,b a , b 是不全为零的整数,则存在整数 x , y x,y x , y , 使得 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) a x + b y = g c d ( a , b )
我们可以简单发现,如果 a x + b y = d ax+by=d a x + b y = d , 则 d 一定为 g c d ( a , b ) gcd(a,b) g c d ( a , b ) 的倍数,
由 a x + b y = ax+by= a x + b y = a 1 r x + a_1 r x+ a 1 r x + b 1 r y = d b_1ry=d b 1 r y = d ,显得 d d d 也是 r r r 的倍数
同时我们可得若当 a x + b y = 1 ax+by=1 a x + b y = 1 有解,则 a , b a,b a , b 互质。
扩展欧几里得求解
给定两个整数 a 、 b a、b a 、 b ,求得一组解 x 、 y x、y x 、 y 使得 a x + b y = d ax+by=d a x + b y = d
当 b = 0 b=0 b = 0 时 a x + b y = a ax+by=a a x + b y = a 故而 x = 1 , y = 0 x=1,y=0 x = 1 , y = 0
当 b ≠ 0 b≠0 b = 0 时
g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a g c d ( a , b ) = g c d ( b , a %b ) b) b ) 且 b x ′ + ( a bx′+(a b x ′ + ( a %b ) y ′ = g c d ( b , a b)y′=gcd(b,a b ) y ′ = g c d ( b , a %b ) b) b )
b x ′ + ( a − ⌊ a / b ⌋ × b ) y ′ = g c d ( b , a bx′+(a−⌊a/b⌋×b)y′=gcd(b,a b x ′ + ( a − ⌊ a / b ⌋ × b ) y ′ = g c d ( b , a %$b)
a y ′ + b ( x ′ − ⌊ a / b ⌋ × y ′ ) = g c d ( b , a ay'+b(x'−⌊a/b⌋×y')=gcd(b,a a y ′ + b ( x ′ − ⌊ a / b ⌋ × y ′ ) = g c d ( b , a %b ) = g c d ( a , b ) b)=gcd(a,b) b ) = g c d ( a , b )
得 x = y ′ , y = x ′ − ⌊ a / b ⌋ × y ′ x=y',y=x'−⌊a/b⌋×y' x = y ′ , y = x ′ − ⌊ a / b ⌋ × y ′
然后我们可以采用递归求解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 void ex_gcd (int a, int b, int &x, int &y) { if (b == 0 ){ x = 1 , y = 0 ; return ; } ex_gcd (b, a % b, y, x); y = y - a / b * x; } void solve () { int a, b, x, y; cin >> a >> b; ex_gcd (a, b, x, y); cout << x << ' ' << y << '\n' ; }
中国剩余定理:
给定 a a a 数组和 n n n 数组(其中 n 1 n_1 n 1 , n 2 n_2 n 2 ,…, n k n_k n k 两两互质),可用该定理求解如下方程组
其主要有三步:
1、计算每一个n i n_i n i 的乘积M M M ,同时计算
2、然后对于每一个 m i m_i m i 求 m i m_i m i c i c_i c i = 1 ( m o d =1(mod = 1 ( m o d n i n_i n i ),也就是m i m_i m i 在n i n_i n i 上的逆元,以为每个n i n_i n i 都是互质的,所以该逆元一定存在。
最后
3、求得
简单证明
我们易知 ,且
这意味着所有 a i m i t i a_im_it_i a i m i t i 的和在模 M M M 的情况下满足以上所有方程组。