欧几里得算法
输入:m,n
输出:m和n的最大公约数
步骤:
1. 如果
n=0
,返回
m
的值作为结果,结束。否则进入2;
2. 计算m/n, 将余数赋值给r。
3. 将n的值赋值给m,将r的值赋值给n, 返回第一步。
其实这里的思想十分清晰,被除数与除数的最大公约数等于除数与余数的最大公约数。
实际上根据上面的描述我们将代码写成递归形式:
int Euclid_gcd(int m, int n){
if (n == 0) return m;
return Euclid_gcd(n, m % n);
}
也可以写成递推形式:
int Euclid_gcd1(int m, int n){
while (n != 0){
int r = m % n;
m = n;
n = r;
}
return m;
}
素数测试1
如果两个整数相乘为N,则必有一个数小于等于
所以我们只需要测试:
for i in range(2,sqrt(n)+1):
remain = N % i
if(remain==0):
return not prime
return prime
素数测试2
公式:
if:
then:
假设
p
是一个素数,
上面就推出了费马小定理。
所以我们判定一个数是不是素数,只需要选择一个 a ,然后看