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

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

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

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

  • 欧几里德算法(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 = 1 − 0 = 1 \begin{aligned}y_6 &= x_7 - q_6y_7 \\ &= 1- 0 = 1\end{aligned} y6=x7q6y7=10=1

  • 第 5 深: 返回

    x 5 = y 6 = 1 \begin{aligned}x_5 &= y_6 = 1\end{aligned} x5=y6=1

    y 5 = x 6 − q 5 y 6 = 0 − 6 ⋅ 1 = − 6 \begin{aligned}y_5 &= x_6 - q_5y_6 \\ &= 0 - 6 \cdot 1 = -6\end{aligned} y5=x6q5y6=061=6

  • 第 4 深: 返回

    x 4 = y 5 = − 6 \begin{aligned}x_4 &= y_5 = -6\end{aligned} x4=y5=6

    y 4 = x 5 − q 4 y 5 = 1 − 1 ⋅ ( − 6 ) = 7 \begin{aligned}y_4 &= x_5 - q_4y_5 \\ &= 1 - 1 \cdot (-6) = 7\end{aligned} y4=x5q4y5=11(6)=7

  • 第 3 深: 返回

    x 3 = y 4 = 7 \begin{aligned}x_3 &= y_4 = 7\end{aligned} x3=y4=7

    y 3 = x 4 − q 3 y 4 = − 6 − 2 ⋅ 7 = − 20 \begin{aligned}y_3 &= x_4 - q_3y_4 \\ &= -6 - 2 \cdot 7 = -20\end{aligned} y3=x4q3y4=627=20

  • 第 2 深: 返回

    x 2 = y 3 = − 20 \begin{aligned}x_2 &= y_3 = -20\end{aligned} x2=y3=20

    y 2 = x 3 − q 2 y 3 = 7 − 5 ⋅ ( − 20 ) = 107 \begin{aligned}y_2 &= x_3 - q_2y_3 \\ &= 7 - 5 \cdot (-20) = 107\end{aligned} y2=x3q2y3=75(20)=107

  • 第 1 深: 返回

    x 1 = y 2 = 107 \begin{aligned}x_1 &= y_2 = 107\end{aligned} x1=y2=107

    y 1 = x 2 − q 1 y 2 = − 20 − 3 ⋅ 107 = − 341 \begin{aligned}y_1 &= x_2 - q_1y_2 \\ &= -20 - 3 \cdot 107 = -341\end{aligned} y1=x2q1y2=203107=341

即求得 x = 107 , y = − 341 x = 107, y = -341 x=107,y=341, 代入 1756 x + 551 y = gcd ⁡ ( 1756 , 551 ) = 1 1756x + 551y = \gcd(1756, 551) = 1 1756x+551y=gcd(1756,551)=1 中验算成立.

写出 C 语言代码为:

#include <stdio.h>

struct Solution {
  int x;
  int y;
};

struct Solution extended_euclid(int a, int b) {
  if (b == 0) {
    return Solution{1, 0};
  }
  struct Solution t = extended_euclid(b, a % b);
  int q = a / b;
  return Solution{t.y, t.x - q * t.y};
}

int main() {
    int m = 1756, n = 551;
    printf("for %dx + %dy = gcd(%d, %d)\n", m, n, m, n);
    struct Solution res = extended_euclid(m, n);
    printf("the solution is: x = %d, y = %d\n", res.x, res.y);
    return 0;
}

程序运行结果为:

for 1756x + 551y = gcd(1756, 551)
the solution is: x = 107, y = -341

扩展欧几里德-递推法

扩展欧几里德算法 在密码学中算是很常用的了, 古典密码中的 仿射密码 以及各种公钥密码好像都用的挺多, 递推法的一个好处是方便手算, 尤其是在期末考试 (ˉ▽ˉ;)…

跟递归法一样, 我们先设: a 1 = m a_1 = m a1=m, b 1 = n b_1 = n b1=n, 且 m > n m > n m>n.

然后以下式子成立是必然的:

a 1 = 1 ⋅ a 1 + 0 ⋅ b 1 b 1 = 0 ⋅ a 1 + 1 ⋅ b 1 \begin{gather} a_1 = 1 \cdot a_1 + 0 \cdot b_1 \\ b_1 = 0 \cdot a_1 + 1 \cdot b_1 \end{gather} a1=1a1+0b1b1=0a1+1b1

我们根据上式 (1) 设 x − 1 = 1 , y − 1 = 0 x_{-1} = 1, y_{-1} = 0 x1=1,y1=0.

根据上式 (2) 设 x 0 = 0 , y 0 = 1 x_0 = 0, y_0 = 1 x0=0,y0=1.

q q q 表示 a 和 b 商, u u u 表示 a ÷ b a \div b a÷b 的余数, 则:

  • 第一轮:

    a 1 = m = 1 ⋅ a 1 + 0 ⋅ b 1 b 1 = n = 0 ⋅ a 1 + 1 ⋅ b 1 a_1 = m = 1 \cdot a_1 + 0 \cdot b_1 \\ b_1 = n = 0 \cdot a_1 + 1 \cdot b_1 a1=m=1a1+0b1b1=n=0a1+1b1

    q 1 = a 1 / b 1 q_1 = a_1 / b_1 q1=a1/b1 (/ 表示整除)

    u 1 = a 1 − q 1 b 1 ( 关键 ! 将 a 1 , b 1 代入 ) = ( 1 ⋅ a 1 + 0 ⋅ b 1 ) − q 1 ( 0 ⋅ a 1 + 1 ⋅ b 1 ) = a 1 + ( − q 1 ) b 1 = x 1 a 1 + y 1 b 1 \begin{aligned}u_1 &= a_1 - q_1b_1 \quad \color{red}{(关键! 将 a_1, b_1 代入)} \\ &= (1 \cdot a_1 + 0 \cdot b_1) - q_1(0 \cdot a_1 + 1 \cdot b_1) \\ &= a_1 + (-q_1)b_1 \\ &= x_1a_1 + y_1b_1 \end{aligned} u1=a1q1b1(关键!a1,b1代入)=(1a1+0b1)q1(0a1+1b1)=a1+(q1)b1=x1a1+y1b1

    得到: x 1 = 1 , y 1 = − q 1 x_1 = 1, y_1 = -q_1 x1=1,y1=q1.

  • 第二轮:

    a 2 = b 1 = x 0 a 1 + y 0 b 1 b 2 = u 1 = x 1 a 1 + y 1 b 1 a_2 = b_1 = x_0a_1 + y_0b_1 \\ b_2 = u_1 = x_1a_1 + y_1b_1 a2=b1=x0a1+y0b1b2=u1=x1a1+y1b1

    q 2 = a 2 / b 2 q_2 = a_2 / b_2 q2=a2/b2

    u 2 = a 2 − q 2 b 2 = ( x 0 a 1 + y 0 b 1 ) − q 2 ( x 1 a 1 + y 1 b 1 ) = ( x 0 − q 2 x 1 ) a 1 + ( y 0 − q 2 y 1 ) b 1 = x 2 a 1 + y 2 b 1 \begin{aligned} u_2 &= a_2 - q_2b_2 \\ &= (x_0a_1 + y_0b_1) - q_2(x_1a_1 + y_1b_1) \\ &= (x_0 - q_2x_1)a_1 + (y_0 - q_2y_1)b_1 \\ &= x_2a_1 + y_2b_1 \end{aligned} u2=a2q2b2=(x0a1+y0b1)q2(x1a1+y1b1)=(x0q2x1)a1+(y0q2y1)b1=x2a1+y2b1

    得到: x 2 = x 0 − q 2 x 1 , y 2 = y 0 − q 2 y 1 x_2 = x_0 - q_2x_1, y_2 = y_0 - q_2y_1 x2=x0q2x1,y2=y0q2y1

  • 第三轮:

    a 3 = b 2 = x 1 a 1 + y 1 b 1 b 3 = u 2 = x 2 a 1 + y 2 b 1 a_3 = b_2 = x_1a_1 + y_1b_1 \\ b_3 = u_2 = x_2a_1 + y_2b_1 a3=b2=x1a1+y1b1b3=u2=x2a1+y2b1

    q 3 = a 3 / b 3 q_3 = a_3 / b_3 q3=a3/b3

    u 3 = a 3 − q 3 b 3 = ( x 1 a 1 + y 1 b 1 ) − q 2 ( x 2 a 1 + y 2 b 1 ) = ( x 1 − q 3 x 2 ) a 1 + ( y 1 − q 3 y 2 ) b 1 = x 3 a 1 + y 3 b 1 \begin{aligned} u_3 &= a_3 - q_3b_3 \\ &= (x_1a_1 + y_1b_1) - q_2(x_2a_1 + y_2b_1) \\ &= (x_1 - q_3x_2)a_1 + (y_1 - q_3y_2)b_1 \\ &= x_3a_1 + y_3b_1 \end{aligned} u3=a3q3b3=(x1a1+y1b1)q2(x2a1+y2b1)=(x1q3x2)a1+(y1q3y2)b1=x3a1+y3b1

    得到: x 3 = x 1 − q 3 x 2 , y 3 = y 1 − q 3 y 2 x_3 = x_1 - q_3x_2, y_3 = y_1 - q_3y_2 x3=x1q3x2,y3=y1q3y2

  • 第 i 轮:

    a i = b i − 1 = u i − 2 = x i − 2 a 1 + y i − 2 b 1 b i = u i − 1 = x i − 1 a 1 + y i − 1 b 1 a_i = b_{i - 1} = u_{i - 2} = x_{i - 2}a_1 + y_{i - 2}b_1 \\ b_i = u_{i - 1} = x_{i - 1}a_1 + y_{i - 1}b_1 ai=bi1=ui2=xi2a1+yi2b1bi=ui1=xi1a1+yi1b1

    q i = a i / b i q_i = a_i / b_i qi=ai/bi

    u i = a i − q i b i = ( x i − 2 a 1 + y i − 2 b 1 ) − q 2 ( x i − 1 a 1 + y i − 1 b 1 ) = ( x i − 2 − q i x i − 1 ) a 1 + ( y i − 2 − q i y i − 1 ) b 1 = x i a 1 + y i b 1 \begin{aligned} u_i &= a_i - q_ib_i \\ &= (x_{i - 2}a_1 + y_{i - 2}b_1) - q_2(x_{i - 1}a_1 + y_{i - 1}b_1) \\ &= (x_{i - 2} - q_ix_{i - 1})a_1 + (y_{i - 2} - q_iy_{i - 1})b_1 \\ &= x_ia_1 + y_ib_1 \end{aligned} ui=aiqibi=(xi2a1+yi2b1)q2(xi1a1+yi1b1)=(xi2qixi1)a1+(yi2qiyi1)b1=xia1+yib1

    得到 推理: x i = x i − 2 − q i x i − 1 , y i = y i − 2 − q i y i − 1 \boxed{x_i = x_{i - 2} - q_ix_{i - 1}, y_i = y_{i - 2} - q_iy_{i - 1}} xi=xi2qixi1,yi=yi2qiyi1

关于终止条件:

因为我们要求解的是 x a 1 + y b 1 = gcd ⁡ ( a 1 , b 1 ) xa_1 + yb_1 = \gcd(a_1, b_1) xa1+yb1=gcd(a1,b1), 只有当 u i + 1 u_{i + 1} ui+1 为 0 时, 其第 i 轮的 u i u_i ui 才等于 gcd ⁡ ( a 1 , b 1 ) \gcd(a_1, b_1) gcd(a1,b1). 所以我们判断终止有两种方法:

  1. 判断 u i + 1 u_{i + 1} ui+1 为 0 时, 其解为 x i x_i xi y i y_i yi.
  2. 判断 u i u_i ui 为 0 时, 其解为 x i − 1 x_{i - 1} xi1 y i − 1 y_{i - 1} yi1.

在手算时用第一种好一点. 在代码中我使用第二种.

实例讲解, 还是使用上面的例子:

假设 m = 1756, n = 551, q q q 代表 a / b a / b a/b, / 表示整除:

  • 第一轮:

    a 1 = 1756 b 1 = 551 a_1 = 1756 \quad b_1 = 551 a1=1756b1=551

    q 1 = a 1 / b 1 = 3 q_1 = a_1 / b_1 = 3 q1=a1/b1=3

    u 1 = a 1 m o d    b 1 = 103 u_1 = a_1 \mod b_1 = 103 u1=a1modb1=103

    x 1 = x − 1 − q 1 x 0 = 1 − 3 ⋅ 0 = 1 x_1 = x_{-1} - q_1x_0 = 1 - 3 \cdot 0 = 1 x1=x1q1x0=130=1

    y 1 = y − 1 − q 1 y 0 = 0 − 3 ⋅ 1 = − 3 y_1 = y_{-1} - q_1y_0 = 0 - 3 \cdot 1 = -3 y1=y1q1y0=031=3

    u 2 = b 1 m o d    u 1 = 36 u_2 = b_1 \mod u_1 = 36 u2=b1modu1=36 不为 0, 继续.

  • 第二轮:

    a 2 = b 1 = 551 b 2 = u 1 = 103 a_2 = b_1 = 551 \quad b_2 = u_1 = 103 a2=b1=551b2=u1=103

    q 2 = a 2 / b 2 = 5 q_2 = a_2 / b_2 = 5 q2=a2/b2=5

    u 2 = a 2 m o d    b 2 = 36 u_2 = a_2 \mod b_2 = 36 u2=a2modb2=36

    x 2 = x 0 − q 2 x 1 = 0 − 5 ⋅ 1 = − 5 x_2 = x_{0} - q_2x_1 = 0 - 5 \cdot 1 = -5 x2=x0q2x1=051=5

    y 2 = y 0 − q 2 y 1 = 1 − 5 ⋅ ( − 3 ) = 16 y_2 = y_{0} - q_2y_1 = 1 - 5 \cdot (-3) = 16 y2=y0q2y1=15(3)=16

    u 3 = b 2 m o d    u 2 = 31 u_3 = b_2 \mod u_2 = 31 u3=b2modu2=31 不为 0, 继续.

  • 第三轮:

    a 3 = b 2 = 103 b 3 = u 2 = 36 a_3 = b_2 = 103 \quad b_3 = u_2 = 36 a3=b2=103b3=u2=36

    q 3 = a 3 / b 3 = 2 q_3 = a_3 / b_3 = 2 q3=a3/b3=2

    u 3 = a 3 m o d    b 3 = 31 u_3 = a_3 \mod b_3 = 31 u3=a3modb3=31

    x 3 = x 1 − q 3 x 2 = 1 − 2 ⋅ ( − 5 ) = 11 x_3 = x_{1} - q_3x_2 = 1 - 2 \cdot (-5) = 11 x3=x1q3x2=12(5)=11

    y 3 = y 1 − q 3 y 2 = − 3 − 2 ⋅ 16 = − 35 y_3 = y_{1} - q_3y_2 = -3 - 2 \cdot 16 = -35 y3=y1q3y2=3216=35

    u 4 = b 3 m o d    u 3 = 5 u_4 = b_3 \mod u_3 = 5 u4=b3modu3=5 不为 0, 继续.

  • 第四轮:

    a 4 = b 3 = 36 b 4 = u 3 = 31 a_4 = b_3 = 36 \quad b_4 = u_3 = 31 a4=b3=36b4=u3=31

    q 4 = a 4 / b 4 = 1 q_4 = a_4 / b_4 = 1 q4=a4/b4=1

    u 4 = a 4 m o d    b 4 = 5 u_4 = a_4 \mod b_4 = 5 u4=a4modb4=5

    x 4 = x 2 − q 4 x 3 = − 5 − 1 ⋅ 11 = − 16 x_4 = x_{2} - q_4x_3 = -5 - 1 \cdot 11 = -16 x4=x2q4x3=5111=16

    y 4 = y 2 − q 4 y 3 = 16 − 1 ⋅ ( − 35 ) = 51 y_4 = y_{2} - q_4y_3 = 16 - 1 \cdot (-35) = 51 y4=y2q4y3=161(35)=51

    u 5 = b 4 m o d    u 4 = 1 u_5 = b_4 \mod u_4 = 1 u5=b4modu4=1 不为 0, 继续.

  • 第五轮:

    a 5 = b 4 = 31 b 5 = u 4 = 5 a_5 = b_4 = 31 \quad b_5 = u_4 = 5 a5=b4=31b5=u4=5

    q 5 = a 5 / b 5 = 6 q_5 = a_5 / b_5 = 6 q5=a5/b5=6

    u 5 = a 5 m o d    b 5 = 1 u_5 = a_5 \mod b_5 = 1 u5=a5modb5=1

    x 5 = x 3 − q 5 x 4 = 11 − 6 ⋅ ( − 16 ) = 107 x_5 = x_{3} - q_5x_4 = 11 - 6 \cdot (-16) = 107 x5=x3q5x4=116(16)=107

    y 5 = y 3 − q 5 y 4 = − 35 − 6 ⋅ 51 = − 341 y_5 = y_{3} - q_5y_4 = -35 - 6 \cdot 51 = -341 y5=y3q5y4=35651=341

    u 6 = b 5 m o d    u 5 = 0 u_6 = b_5 \mod u_5 = 0 u6=b5modu5=0 为 0, 终止!!!

即得到解 x = x 5 = 107 , y = y 5 = − 341 x = x_5 = 107, y = y_5 = -341 x=x5=107,y=y5=341.

写出 C 语言代码为:

#include <stdio.h>

struct Solution
{
    int x;
    int y;
};

struct Solution extended_euclid2(int m, int n)
{
    // 初始
    int x_i_2 = 1; // x_{i - 2}
    int y_i_2 = 0; // y_{i - 2}
    int x_i_1 = 0; // x_{i - 1}
    int y_i_1 = 1; // y_{i - 1}

    int a = m;
    int b = n;
    int x, y;
    while (true)
    {
        int q = a / b; // q_i a_i b_i
        int u = a % b; // u_i
        // 当 u_i 为 0 则终止
        if (u == 0)
        {
            x = x_i_1; // 得出解 x = x_{i - 1}
            y = y_i_1; // 得出解 y = y_{i - 1}
            break;
        }
        x = x_i_2 - q * x_i_1; // x_i
        y = y_i_2 - q * y_i_1; // y_i
        x_i_2 = x_i_1;
        y_i_2 = y_i_1;
        x_i_1 = x;
        y_i_1 = y;
        a = b; // a_{i + 1}
        b = u; // b_{i + 1}
    }
    // 返回求得的 x y.
    return Solution{x, y};
}

int main()
{
    int m = 1756, n = 551;
    printf("for %dx + %dy = gcd(%d, %d)\n", m, n, m, n);
    struct Solution res = extended_euclid2(m, n);
    printf("the solution is: x = %d, y = %d\n", res.x, res.y);
    return 0;
}

程序运行结果为:

for 1756x + 551y = gcd(1756, 551)
the solution is: x = 107, y = -341

扩展欧几里德-手算法

其方法跟 扩展欧几里德-递推法 里的例子大同小异, 主要是我们密码学老师喜欢用这种方法手算:

建表, u u u 代表余数, q q q 代表商:

uxyq
a 1 a_1 a1 x − 1 x_{-1} x1 y − 1 y_{-1} y1
b 1 b_1 b1 x 0 x_0 x0 y 0 y_0 y0 q 1 q_1 q1
u 1 u_1 u1 x 1 = x − 1 − q 1 x 0 x_1 = x_{-1} - q_1x_0 x1=x1q1x0 y 1 = y − 1 − q 1 y 0 y_1 = y_{-1} - q_1y_0 y1=y1q1y0 q 2 q_2 q2
u 2 u_2 u2 x 2 = x 0 − q 2 x 1 x_2 = x_0 - q_2x_1 x2=x0q2x1 y 2 = y 0 − q 2 y 1 y_2 = y_0 - q_2y_1 y2=y0q2y1 q 3 q_3 q3
u 3 u_3 u3 x 3 = x 1 − q 3 x 2 x_3 = x_1 - q_3x_2 x3=x1q3x2 y 3 = y 1 − q 3 y 2 y_3 = y_1 - q_3y_2 y3=y1q3y2 q 4 q_4 q4
u i u_i ui x i = x i − 2 − q i x i − 1 x_i = x_{i - 2} - q_ix_{i - 1} xi=xi2qixi1 y i = y i − 2 − q i y i − 1 y_i = y_{i - 2} - q_iy_{i - 1} yi=yi2qiyi1 q i + 1 q_{i + 1} qi+1

终止条件 是: 判断 u i + 1 u_{i + 1} ui+1 为 0, 解为 x i x_i xi y i y_i yi.

还是以 m = 1756, n = 551 为例, 建表:

uxyq
175610
551013
1031-35
36-5162
3111-351
5-16516
1107-3470
0

嗯, 差不多就是这样╮(╯▽╰)╭.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值