非递归Exgcd

去博客看吧,这里炸了

【数论】非递归扩展欧几里得定理/Exgcd-CSDN博客

2024-8-19 ·最后更新时间:2024-8-20
  • 发现有纯迭代法扩展欧几里得定理没有讲 2024-8-20

本篇适用于像扩展Exgcd非递归版和OIwiki看不懂的同学,写这些也是因为Oiwiki上的太晦涩难懂了。

\Large\mathcal{1,Matrix representation}

首先我们我们们知道 a \mod b 就相当于 a-\lfloor\frac{a}{b}\rfloor b 这是很基础的东西不多赘述,同时也根据欧几里得定理可知 \gcd(a,b)=\gcd(b,a \mod b)=\gcd(b,a-\lfloor\frac{a}{b}\rfloor b) 于是我们由此产生了思考如果,换一种方式表达 \gcd(b,a \mod b)=\gcd(b,a-\lfloor\frac{a}{b}\rfloor b) 会发生什么呢?

我们不妨向矩阵的方向想一想,我们先把 ba \mod b 放到向量一个 R^2 的向量中:

$$ \left[\begin{matrix}b \a \mod b \\end{matrix}\right] $$

那么根据我们原来对 a \mod b 的分析他是不是变成了:
\left[
\begin{matrix}
b \
a-\lfloor\frac{a}{b}\rfloor b \
\end{matrix}
\right]
等等?如果我们给他变成 2*2 的矩阵好像有一些奇妙的发现
\left[
\begin{matrix}
0 & b \
a & {\tiny -\lfloor\frac{a}{b}\rfloor b} \
\end{matrix}
\right]
欸?这个矩阵的每一列上都有相同的元素 ab 所以,我们是不是可以把 a,b 单独提出来放到一个 R^2 的向量上?答案是可以的所以我们来转化一下,可以得到一个等式:
$$\left[\begin{matrix}b \a \mod b \\end{matrix}\right]=
\left[
\begin{matrix}
0 & 1 \
1 & -\lfloor\frac{a}{b}\rfloor b \
\end{matrix}
\right]
\left[\begin{matrix}a \b \\end{matrix}\right]

那么,假设我们当前的矩阵就是最终矩阵 $\left[\begin{matrix}\gcd(a,b) \\0 \\\end{matrix}\right]$ 那么我们一直将形如上面等式的式子一直迭代最后会得到一个奇妙~~的式子: $$\left[\begin{matrix}\gcd(a,b) \\0 \\\end{matrix}\right]= \left( \ldots \left[ \begin{matrix} 0 & 1 \\ 1 & -\lfloor\frac{a}{b}\rfloor b \\ \end{matrix} \right] \left[ \begin{matrix} 1 & 0 \\ 0 & 1 \\ \end{matrix} \right] \right) \left[\begin{matrix}a \\b \\\end{matrix}\right]

那么接下如果我们括号中的矩阵的乘积表示成一个独立的矩阵像:

\left[ \begin{matrix} x_1 & x_2 \\ x_3 & x_4 \\ \end{matrix} \right]

那么
$$\left[\begin{matrix}\gcd(a,b) \0 \\end{matrix}\right]=
\left[
\begin{matrix}
x_1 & x_2 \
x_3 & x_4 \
\end{matrix}
\right]
\left[\begin{matrix}a \b \\end{matrix}\right]

V=
\left[
\begin{matrix}
x_1 & x_2 \
x_3 & x_4 \
\end{matrix}
\right]
\left[\begin{matrix}a \b \\end{matrix}\right]

那么

V=
\left[
\begin{matrix}
ax_1+ax_2 \
ax_3+ax_4 \
\end{matrix}
\right]=
\left[\begin{matrix}\gcd(a,b) \0 \\end{matrix}\right]

那么 $x1,x2$ 就是我们的解了,接下来为了方便我们从 $a,b$ 开始向下迭代,只需要把过程反过来即可所以细节就看代码吧: ```cpp int exgcd(int a, int b, int &x, int &y) { int x1 = 1, x2 = 0, x3 = 0, x4 = 1; while (b != 0) { int c = a / b; std::tie(x1, x2, x3, x4, a, b) = std::make_tuple(x3, x4, x1 - x3 * c, x2 - x4 * c, b, a - b * c); } x = x1, y = x2; return a; } ``` $\Large\mathcal{2,Iteration method}$ 接下来在来说说纯迭代法吧,OIwiki 上直接丢了一个方程然后让小朋友(作者)自己去推真的是太丧心病狂了,所以我发现了一个更好理解的方法来解析纯迭代法~~没错还是用矩阵~~ ,首先我们先不要管 OIwiki 有多丧心病狂,我们从他的式子开始分析也就是: $$x=1,y=0,x'=0,y'=1$$

\begin{cases}
ax+by=a\
ax’+by’=b
\end{cases}

\begin{cases}
ax’+by’=b\
a(x-\frac{a}{b}x’)+b(y-\frac{a}{b}y’)=a-\frac{a}{b}b
\end{cases}

emmm 有点难入手,我们不妨从一个例子开始?比如 $a=25,b=7$ 那么过程就应该是: $ \begin{cases} 1\cdot 25+0\cdot 7=25\\ 0\cdot 25+1\cdot 7=7 \end{cases} ⇒ \begin{cases} 0\cdot 25+1\cdot 7=7\\ 1\cdot 25+(-3)\cdot 7=4 \end{cases} ⇒ \begin{cases} 1\cdot 25+(-3)\cdot 7=4\\ (-1)\cdot 25+4\cdot 7=3 \end{cases} ⇒ \begin{cases}\ (-1)\cdot 25+4\cdot 7=3\\ 2\cdot 25+(-7)\cdot 7=1 \end{cases} ⇒ \begin{cases}\ 2\cdot 25+(-7)\cdot 7=1\\ (-7)\cdot 25+25\cdot 7=0 \end{cases} $ 如果我们观察等式右边的数字会发现他和欧几里得定理的运行顺序一模一样,所以我们可以尝试运用这一点对方程组做一些小改动。 我们知道所有方程组都可以表示为增广矩阵的形式,那么我们给他转换一下:

\left[
\begin{matrix}
x & y & a\
x’ & y’ & b
\end{matrix}
\right]

如果再给他行变换一下呢?将 $r2$ 与 $r1$ 交换,然后将 $r2-\frac{a}{b}r1$ :

\left[
\begin{matrix}
x’ & y’ & b\
x-\frac{a}{b}x’ & y-\frac{a}{b}y’ & a-\frac{a}{b}b
\end{matrix}
\right]

好,现在我们发现当第 $2$ 行第 $3$ 列的数为 $0$ 时 $x',y'$ 即为满足条件的答案。 所以我们成功的得到了代码: ``` x = 1, y = 0; int x1 = 0, y1 = 1, a1 = a, b1 = b; while (b1) { int q = a1 / b1; tie(x, x1) = make_tuple(x1, x - q * x1); tie(y, y1) = make_tuple(y1, y - q * y1); tie(a1, b1) = make_tuple(b1, a1 - q * b1); } return a1; ``` $$ 点赞!收藏!关注!QAQ $$ 安利一下我的[博客](https://www.cnblogs.com/chenzhekeai/p/18367169)qwq

\LaTeX 全炸了哦

【数论】非递归扩展欧几里得定理/Exgcd-CSDN博客

炸了没关系,有原篇

bro第一行的日期挺显眼昂

这就是我自己写的啊(

哇哦原来是个大佬,膜拜~

我可以给CSDN改名字

说一句,一般的Latex和xyd的啥调latex不一样,xyd要空格, 你如果要把你再csdn的文章放在xyd要把所有的latex都改了

没说不是你写的,是说csdn的latex在xyd会炸

嗷嗷

去我博客园看看吧,博客园要
死了

说实话,我觉得用矩阵证明exgcd有点小题大做(也许是我太蒻了

其实还好吧,就是觉得好玩

%%%(句子

谔谔

句子是啥

凑数的

谔谔(