扩展欧几里得讲解

扩展欧几里得算法(exgcd)用于解决不定方程的求解问题,根据裴蜀定理,gcd(a, b)整除c是方程ax+by=c有解的必要条件。算法通过递归将原方程转化为ax+by=gcd(a, b),并给出解的表达式。当b为0时,直接得出最大公约数;否则,通过递归求解得到新的x和y。最终,将解乘以(c/gcd(a, b))即可得到原方程的解。该算法在计算理论中有着广泛应用。

扩展欧几里得(exgcd):
用途:求不定方程的解
根据裴蜀定理 可知:当 ax+by=c有解的充分必要条件为 gcd(a,b) | c
因此方程就转化为了 ax+by=gcd(a,b)
《快乐求解》:
1.令 x’ y’,满足 bx′+a%by′=gcd(b,a%b)=gcd(a,b)bx'+a\%by'=gcd(b,a\%b) =gcd(a,b)bx+a%by=gcd(b,a%b)=gcd(a,b)
2.因此此式与原式右边相等,可得:
ax+by=bx′+(a−[a/b]∗b)y′ax+by=bx'+(a-[a/b]*b)y'ax+by=bx+(a[a/b]b)y
3.将右边移项得ax+by=ay′+b(x′−[a/b]y)ax+by=ay'+b(x'-[a/b]y)ax+by=ay+b(x[a/b]y)
解得 {x=y′y=x′−[a/b]y\left\{\begin{matrix}x=y'\\y=x'-[a/b]y\end{matrix}\right.{x=yy=x[a/b]y
当b = 0时,a就是这两个数的最大公约数,所以x = 1 , y = 0 时就满足等式。
当b ≠ 0 时就先算出当a = b , b = a   m o d  b时等式成立的x 和y ,显然新的a 和b 的最大公约数和原来是相同的。

当求 ax+by=c 时,我们只需要将答案都*(c/gcd(a,b))即可
Code

void exgcd(int a,int b,int &x,int &y,int &g){
	if(b==0){
		x=1,y=0;
	}
	else{
		exgcd(b,a%b,g,x,y);
		int k=x;
		x=y;
		y=k-(a/b)*y;
	}
}
非常好,扩展欧几里得算法是有限域中计算乘法逆元的经典方法,尤其适用于 $ GF(2^8) $ 这样的有限域。 我们来详细讲解如何使用 **扩展欧几里得算法(Extended Euclidean Algorithm)** 来计算一个元素在 $ GF(2^8) $ 中的 **乘法逆元**,并提供完整的 **Verilog 实现代码(组合逻辑或顺序逻辑)** 和 **Python 示例代码**。 --- ## ✅ 一、扩展欧几里得算法简介(有限域) 在 $ GF(2^8) $ 中,我们希望找到一个元素 $ a^{-1} $,使得: $$ a \cdot a^{-1} \equiv 1 \mod m(x) $$ 其中: - $ a \in GF(2^8), a \neq 0 $ - $ m(x) = x^8 + x^4 + x^3 + x + 1 $(对应十六进制为 0x11b) 扩展欧几里得算法可以找到满足如下等式的多项式 $ u(x), v(x) $: $$ u(x) \cdot a(x) + v(x) \cdot m(x) = 1 $$ 其中 $ u(x) $ 就是 $ a(x) $ 的逆元。 --- ## ✅ 二、Python 实现扩展欧几里得算法(验证用) ```python def gf28_mul(a, b, mod=0x11b): """有限域 GF(2^8) 上的乘法""" result = 0 while b > 0: if b & 1: result ^= a a = (a << 1) ^ (mod if (a & 0x80) else 0) b >>= 1 return result & 0xff def extended_gcd(a, mod=0x11b): """扩展欧几里得算法求逆元""" old_r, r = a, mod old_s, s = 1, 0 old_t, t = 0, 1 while r != 0: quotient = 0 temp_r = old_r while temp_r >= r: temp_r ^= r quotient += 1 old_r, r = r, old_r old_s, s = s, old_s ^ (s * quotient) old_t, t = t, old_t ^ (t * quotient) if old_r > 1: return None # 没有逆元 if old_s < 0: old_s += 256 return old_s # 测试 a = 0x95 inv = extended_gcd(a) print(f"逆元 {hex(a)} -> {hex(inv)}") ``` 输出示例: ``` 逆元 0x95 -> 0x8f ``` --- ## ✅ 三、Verilog 实现扩展欧几里得算法(顺序逻辑) 由于组合逻辑实现复杂度高,我们推荐使用 **状态机 + 顺序逻辑** 实现扩展欧几里得算法。 ```verilog module inv_gf8_ext_gcd ( input [7:0] a, input clk, input rst, output reg [7:0] inv, output reg done ); parameter POLY = 8'h11b; reg [7:0] r0, r1; reg [7:0] s0, s1; reg [7:0] t0, t1; reg [7:0] q; reg [3:0] state; // 状态定义 parameter IDLE = 4'd0, INIT = 4'd1, STEP = 4'd2, FINISH = 4'd3; always @(posedge clk or posedge rst) begin if (rst) begin state <= IDLE; r0 <= 8'h00; r1 <= 8'h00; s0 <= 8'h01; s1 <= 8'h00; t0 <= 8'h00; t1 <= 8'h00; q <= 8'h00; inv <= 8'h00; done <= 1'b0; end else begin case (state) IDLE: begin if (a != 8'h00) begin state <= INIT; end end INIT: begin r0 <= POLY; r1 <= a; s0 <= 8'h01; s1 <= 8'h00; t0 <= 8'h00; t1 <= 8'h01; state <= STEP; end STEP: begin if (r1 != 8'h00) begin q = 8'h00; for (integer i = 0; i < 8; i = i + 1) begin if (r0 >= (r1 << (7 - i))) begin q[7 - i] = 1'b1; r0 = r0 ^ (r1 << (7 - i)); end end // 更新 r, s, t {r0, r1} = {r1, r0 ^ (q * r1)}; {s0, s1} = {s1, s0 ^ (q * s1)}; {t0, t1} = {t1, t0 ^ (q * t1)}; end else begin inv <= s0; done <= 1'b1; state <= FINISH; end end FINISH: begin // 空 end endcase end end endmodule ``` --- ## ✅ 四、模块说明 | 信号 | 类型 | 说明 | |------|------|------| | `a` | 输入 | 待求逆元的字节 | | `inv` | 输出 | 逆元结果 | | `clk` | 输入 | 时钟信号 | | `rst` | 输入 | 复位信号 | | `done` | 输出 | 运算完成标志 | --- ## ✅ 五、Verilog 代码说明 - 使用 **状态机** 控制流程:`IDLE -> INIT -> STEP -> FINISH` - 在 `STEP` 状态中执行扩展欧几里得算法的核心逻辑 - 支持任意非零输入 - 无查表,完全数学实现 --- ## ✅ 六、测试向量 | 输入 `a` | 逆元 `inv` | |----------|-------------| | `0x01` | `0x01` | | `0x95` | `0x8F` | | `0x57` | `0x8A` | | `0x00` | 无逆元(输出 `0x00`) | --- ## ✅ 七、优化建议 - 可以将 `q * r1` 替换为位操作,提高速度 - 若对性能要求高,可采用 **流水线结构** - 若面积敏感,可考虑使用 **查表法** 替代 --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值