1. 最大公约数
欧几里得算法(辗转相除法)求最大公约数(Greatest Common Divisor,GCD)的递归定理:对任意非负整数a和任意正整数b
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
m
o
d
b
)
gcd(a,b)=gcd(b,a \ mod \ b)
gcd(a,b)=gcd(b,a mod b)
欧几里得算法递归实现:
// 欧几里得算法递归实现
public static int gcd(int a, int b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
欧几里得算法非递归实现:
// 欧几里得算法非递归实现
public static int gcd(int a, int b) {
int r;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
2. 最小公倍数
① : 令 a = g c d × d 1 = l c m m 1 , b = g c d × d 2 = l c m m 2 ② : a b = g c d × d 1 g c d × d 2 = l c m m 1 l c m m 2 = d 1 d 2 = m 2 m 1 ③ : 由 最 大 公 约 数 ( g c d ) 与 最 小 公 倍 数 ( l c m ) 的 定 义 可 推 出 : d 1 与 d 2 互 质 , m 1 与 m 2 互 质 ④ : 结 合 ② 和 ③ ⇒ d 1 = m 2 , d 2 = m 1 ⑤ : a × b = ( g c d × d 1 ) × ( l c m m 2 ) = g c d × l c m × d 1 = m 2 m 2 = g c d × l c m 结 论 : a × b = g c d ( a , b ) × l c m ( a , b ) \begin{aligned} ①:& 令\quad a = gcd \times d1 = \frac{lcm}{m1}, b = gcd \times d2 = \frac{lcm}{m2}\\ ②:& \frac{a}{b} = \frac{gcd \times d1}{gcd \times d2} = \frac{\frac{lcm}{m1}}{\frac{lcm}{m2}} = \frac{d1}{d2} = \frac{m2}{m1}\\ ③:& 由最大公约数(gcd)与最小公倍数(lcm)的定义可推出:d1与d2互质,m1与m2互质\\ ④:& 结合②和③ \Rightarrow d1=m2,d2=m1\\ ⑤:& a \times b = (gcd \times d1) \times (\frac{lcm}{m2}) = gcd \times lcm \times \frac{d1=m2}{m2}=gcd \times lcm\\ & 结论:a\times b = gcd(a,b) \times lcm(a,b) \end{aligned} ①:②:③:④:⑤:令a=gcd×d1=m1lcm,b=gcd×d2=m2lcmba=gcd×d2gcd×d1=m2lcmm1lcm=d2d1=m1m2由最大公约数(gcd)与最小公倍数(lcm)的定义可推出:d1与d2互质,m1与m2互质结合②和③⇒d1=m2,d2=m1a×b=(gcd×d1)×(m2lcm)=gcd×lcm×m2d1=m2=gcd×lcm结论:a×b=gcd(a,b)×lcm(a,b)
求最小公倍数代码实现:
// 求最小公倍数
public static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
3. 模取幂
模取幂:求一个数的幂对另一个数的模运算, a b m o d n a^b \ mod \ n ab mod n
// 模取幂:Math.pow(a, b) % n
// a, b为非负整数,n为正整数
public static int modularExponentiation(int a, int b, int n) {
int c = 0;
int d = 1;
String binaryB = Integer.toBinaryString(b);
for (int i = 0; i < binaryB.length(); i++) {
c *= 2;
d = (d * d) % n;
if (binaryB.charAt(i) == '1') {
c++;
d = (d * a) % n;
}
}
return d;
}