欧几里得算法(gcd)
就是辗转相除法
作用:求gcd(a,b)
公式:
[gcd(a,b) = gcd(b,a\%b)
]
写法1:
int gcd(int a , int b ){
return !b ? a : gcd(b, a % b);
}
写法2 :位运算(超快) (a,b不能为0)
int gcd(int a , int b){
while(b ^= a ^= b ^= a %= b);
return a;
}
扩展欧几里得算法(exgcd)
用途:1.求二元一次方程的特解,通解 2.求乘法逆元
裴蜀定理:
对于任意正整数 (a) , (b) ,一定存在整数 (x) , (y) ,使得
[ax+by == gcd(a,b)
]
且对于任意 (x) ,(y), (ax+by) 一定是d的倍数 [d为gcd(a,b)]
扩展欧几里得算法的作用:
exgcd提供了一种算法,对于任意(a,b),都能求出 (ax+by=d) 的解 (x,y)
顺便还能求出gcd
int exgcd( int a , int b , int &x , int &y ){
if(b == 0){
x = 1;
y = 0;
return a;
}
int ans = exgcd( b , a % b , x , y );
int temp = x;
x = y;
y = temp - a / b * y;
return ans;
}
解释:
讲的很清晰
通解:待补