title: 算法证明
date: 2019-05-10 10:02:57
categories:
- 数论
tags: - 算法
欧几里得算法证明
前置定理
1. 如果a|b且a|c,可以推出a|(x*b + y*c),x,y为未知数。
2. a%b==a-c*b, c为a|b
振明过程
首先证明gcd(a, b) == gcd(b, a % b);
设d为(a,b)的一个约数;
因为d|a且d|b,所以d|(a - c*b);即d|b且d|(a - c*b)
所以(b,a%b)包含(a,b)中所有约数
在设d为(b,a%b)的一个约数
反推一遍可得d|b且d|(a - c*b)可以推出d|b且d|(a - c*b + c*b)
所以(a,b)包含(b,a%b)中所有约数
即gcd(a, b) == gcd(b, a % b)
代码
#include <iostream>
using namespace std;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int main () {
int a, b;
cin >> a >> b;
cout << gcd(a, b) << endl;
return 0;
}