问题:
ax mod b=c a^x ~ mod ~ b = c ax mod b=c
已知a,b互质(两个数的最大公约数为1),给出a,b,c三个正整数,求x的自小正整数解。
欧几里得算法
概念:
整数a,b的最大公约数一般表示为 gcd(a,b)
终极奥义:gcd(a,b) = gcd(b,a%b)=> 将大规模的问题转变成小规模的问题 ,当转变成gcd(c,0)时,c即为最大公约数
1 当a>b,缩小问题规模的作用
2 当a<b,相当于a和b的位置进行对调
//欧几里得算法就是将较大规模的问题转变成较小规模的问题
int gcd(int a,int b){
//gcd求最大公约数的
cout<<"gcd("<<a<<","<<b<<")=";
if(b) return gcd(b,a%b);
return a;//此时b=0 直接返回a(最大公约数)
}
int main(){
int a,b;
while(cin>>a>>b){
cout<<gcd(a,b)<<endl;
}
return 0;
}
证明:
1、b和a%b的最大公约数,是a和b的公约数
设b,a%b的最大公约数c
b = k1*c
a%b = k2*c
a-k*b = k2*c => a = k2*c+k*b => a = k2*c+k*k1*c
a = (k2+k*k1)*c
b = k1*c
及证:得出结论b和a%b的最大公约数也是a和b的公约数
2、b和a%b的最大公约数也是a和b的最大公约数
a = (x+y*k)*c
b = y*c
定理:假设a和b的最大公约数为c 那么x+y*k和y的最大公约数为1
反正法:假设c不是a和b的最大公约数=>gcd(x+y*k,y)=d | d!=1
x+k*y = n*d
y = m*d
x = n*d-k*y = n*d-k*