学了两周数据结构发现数论图论忘光了,所以回来补一下,顺便写下笔记。
欧几里得算法,裴蜀定理,脑子
欧几里得算法:即辗转相除法, gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a,b)=\gcd(b,a \bmod b) gcd(a,b)=gcd(b,amodb)
裴蜀定理:若 a , b a,b a,b 是整数,且 gcd ( a , b ) = d \gcd(a,b)=d gcd(a,b)=d,那么对于任意的整数 x x x和 y y y, a x + b y ax+by ax+by 都一定是 d d d的倍数,特别地,一定存在整数 x , y x,y x,y,使 a x + b y = d ax+by=d ax+by=d成立。
脑子
扩展欧几里得算法 ( e x g c d ) (exgcd) (exgcd)一般用于判断并求解形如 a x + b y = c ax+by=c ax+by=c 的不定方程。( a , b , c a,b,c a,b,c 为已知数, x , y x,y x,y 为未知数)
首先由裴蜀定理可知,方程有解必须满足 gcd ( a , b ) ∣ c \gcd(a,b)\mid c gcd(a,b)∣c,所以先讨 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b),再推至所有情况。
可以由欧几里得算法往后推:
a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)
= gcd ( b , a m o d b ) =\gcd(b,a\bmod b) =gcd(b,amodb)
= gcd ( b , a − ⌊ a b ⌋ ∗ b ) =\gcd(b,a-\left \lfloor \frac{a}{b} \right \rfloor*b) =gcd(b,a−⌊ba⌋∗b)
= b x 1 + ( a − ⌊ a b ⌋ ∗ b ) y 1 =bx_1+(a-\left \lfloor \frac{a}{b} \right \rfloor*b)y_1 =bx1+(a−⌊ba⌋∗b)y1
= b x 1 + a y 1 − ⌊ a b ⌋ ∗ b y 1 =bx_1+ay_1-\left \lfloor \frac{a}{b} \right \rfloor *by_1 =bx1+ay1−⌊ba⌋∗by1
= a y 1 + b ( x 1 − ⌊ a b ⌋ ∗ y 1 ) =ay_1+b(x_1-\left \lfloor \frac{a}{b} \right \rfloor*y_1) =ay1+b(x1−⌊ba⌋∗y1)
发现只要有了 gcd ( b , a m o d b ) \gcd(b,a\bmod b) gcd(b,amodb)时的 x 1 , y 1 x_1,y_1 x1,y1 ,就可以推出 gcd ( a , b ) \gcd(a,b) gcd(a,b) 时的 x x x 和 y y