扩展欧几里德算法 递归法 递推法 手算法 原理及实现

扩展欧几里德算法 递归法 递推法 手算法 原理及实现

顾名思义, 扩展欧几里德算法 是在 欧几里德算法 基础上扩展的算法.

欧几里德算法扩展欧几里德算法 在用途上的区别:

  • 欧几里德算法(gcd): 即求两个整数的 最大公约数.
  • 扩展欧几里德算法:
    • 用于求 乘法逆元.
    • 用于求 贝组等式 的一个解.

欧几里德算法

辗转相除法.

C 语言实现:

int gcd(int a, int b) {
   
  return b == 0 ? a : gcd(b, a%b);
}

注意此算法的 终止条件b == 0.

扩展欧几里德-递归法

设初始值: a 1 = m a_1 = m a1=m, b 1 = n b_1 = n b1=n, 且 m > n m > n m>n.

a 1 x 1 + b 1 y 1 = gcd ⁡ ( a 1 , b 1 ) a_1x_1 + b_1y_1 = \gcd(a_1, b_1) a1x1+b1y1=gcd(a1,b1), 则:

欧几里德算法 中, a i + 1 = b i , b i + 1 = a i m o d    b i a_{i + 1} = b_i, b_{i + 1} = a_i \mod b_i ai+1=bi,bi+1=aimodbi, 所以:

  • a 2 x 2 + b 2 y 2 = b 1 x 2 + ( a 1 m o d    b 1 ) y 2 = gcd ⁡ ( a 2 , b 2 ) a_2x_2 + b_2y_2 = b_1x_2 + (a_1 \mod b_1)y_2 = \gcd(a_2, b_2) a2x2+b2y2=b1x2+(a1modb1)y2=gcd(a2,b2).

因为 a 1 m o d    b 1 = a 1 − ( a 1 / b 1 ) ⋅ b 1 a_1 \mod b_1 = a_1 - (a_1 / b_1) \cdot b_1 a1modb1=a1(a1/b1)b1 (其中的 / 为整除). 得:

  • a 1 x 1 + b 1 y 1 = b 1 x 2 + ( a 1 − ( a 1 / b 1 ) b 1 ) y 2 = a 1 y 2 + b 1 ( x 2 − ( a 1 / b 1 ) y 2 ) a_1x_1 + b_1y_1 = b_1x_2 + (a_1 - (a_1 / b_1)b_1)y_2 = a_1y_2 + b_1(x_2 - (a_1 / b_1)y_2) a1x1+b1y1=b1x2+(a1(a1/b1)b1)y2=a1y2+b1(x2(a1/b1)y2)

所以得到 x 1 = y 2 , y 1 = x 2 − ( a 1 / b 1 ) y 2 x_1 = y_2, \quad y_1 = x_2 - (a_1 / b_1)y_2 x1=y2,y1=x2(a1/b1)y2.

由以上推广得到:

推论 1: x i = y i + 1 , y i = x i + 1 − ( a i / b i ) y i + 1 \boxed{x_i = y_{i + 1}, \quad y_i = x_{i + 1} - (a_i / b_i)y_{i + 1}} xi=yi+1,yi=xi+1(ai/bi)yi+1

欧几里德算法 中, 迭代的终止条件是 b == 0, 并且此时 a i x i + b i y i = gcd ⁡ ( a i , b i ) = gcd ⁡ ( a i , 0 ) = a i a_ix_i + b_iy_i = \gcd(a_i, b_i) = \gcd(a_i, 0) = a_i aixi+biyi=gcd(ai,bi)=gcd(ai,0)=ai, 显然此时的 x i = 1 , y i = 0 x_i = 1, y_i = 0 xi=1,yi=0, 所以有:

推论 2: 当 b i = 0 时 , x i = 1 , y i = 0. \boxed{当 b_i = 0 时, x_i = 1, y_i = 0.} bi=0,xi=1,yi=0.

以上标识符(比如 a 1 a_1 a1, b 2 b_2 b2)的下标数字是指在 欧几里德算法gcd() 函数里的迭代次数.

为了更好的理解, 下面用实例进行说明, 假设 m = 1756, n = 551, q q q 代表 a / b a / b a/b, / 表示整除:

(1) a 1 = 1756 b 1 = 551 q 1 = 3 a_1 = 1756 \quad b_1 = 551 \quad q_1 = 3 a1=1756b1=551q1=3

(2) a 2 = 551 b 2 = 103 q 2 = 5 a_2 = 551 \quad b_2 = 103 \quad q_2 = 5 a2=551b2=103q2=5

(3) a 3 = 103 b 3 = 36 q 3 = 2 a_3 = 103 \quad b_3 = 36 \quad q_3 = 2 a3=103b3=36q3=2

(4) a 4 = 36 b 4 = 31 q 4 = 1 a_4 = 36 \quad b_4 = 31 \quad q_4 = 1 a4=36b4=31q4=1

(5) a 5 = 31 b 5 = 5 q 5 = 6 a_5 = 31 \quad b_5 = 5 \quad q_5 = 6 a5=31b5=5q5=6

(6) a 6 = 5 b 6 = 1 q 6 = 5 a_6 = 5 \quad b_6 = 1 \quad q_6 = 5 a6=5b6=1q6=5

(7) a 7 = 1 b 7 = 0 a_7 = 1 \quad b_7 = 0 a7=1b7=0 ( b 7 b_7 b7 为 0, 终止, 所以 x 7 = 1 , y 7 = 0 x_7 = 1, y_7 = 0 x7=1,y7=0)

因为我们要求的是 x 1 , y 1 x_1, y_1 x1,y1 于是乎:

  • 递归最深处: 返回 x 7 = 1 , y 7 = 0 x_7 = 1, y_7 = 0 x7=1,y7=0.

  • 第 6 深: 返回

    x 6 = y 7 = 0 \begin{aligned}x_6 &= y_7 = 0\end{aligned} x6=y7=0

    y 6 = x 7 − q 6 y 7

你可能感兴趣的:(算法,人工智能,机器学习)