线性推逆元法

给你一个p,要你求出1~p-1所有数在模p下的逆元。

一个一个用扩展欧几里得求?如果p特别大,不就超时了?我们想要在线性的时间复杂度内求出逆元。

这种方法只能在p为质数的情况下使用。

首先有$1^{-1}\equiv 1(mod\ p)$

设$p=iq+r(0<r<p)$,在模p意义下得$iq+r\equiv 0(mod\ p)$。

两边同时乘$i^{-1}$和$r^{-1}$得:$$qr^{-1}+i^{-1}\equiv 0(mod\ p)$$

$$i^{-1}\equiv -qr^{-1}(mod\ p)$$

$$i^{-1}\equiv -\lfloor \frac{p}{i}\rfloor (p\ mod\ i)^{-1}(mod\ p)$$

$$i^{-1}\equiv (p-\lfloor \frac{p}{i}\rfloor)(p\ mod\ i)^{-1}(mod\ p)$$

所以我们只要线性推一下即可。时间复杂度$\theta(n)$

所以代码如下:

inv[1]=1;
for(int i=2;i<p;++i)
inv[i]=(p-p/i)*inv[p%i]%p;

 

转载于:https://www.cnblogs.com/Mrsrz/p/7364581.html

<think>嗯,用户问的是基于线性同余加密算的解密方,特别是用辗转相除逆元。题目给出加密公式是y = (7x + 11) mod 26,需要找到解密公式。首先,我得回忆一下线性同余加密的结构,这应该是仿射密码的一种,也就是形如y ≡ ax + b mod 26的形式,其中ab是密钥。解密的话,需要找到a的逆元,然后用逆元来解方程。 首先,仿射密码的解密公式应该是x ≡ a⁻&sup1;(y - b) mod 26。所以这里a是7,b是11。那关键就是找到7在26下的逆元,也就是找一个a⁻&sup1;,使得7*a⁻&sup1; ≡ 1 mod26。 用户提到用辗转相除来计算逆元,也就是扩展欧几里得算。我需要先计算726的最大公约,同时找到满足7x + 26y = 1的x,这个x就是逆元。 首先用欧几里得算分解267: 26 ÷ 7 = 3 余5,所以26 = 7*3 +5 7 ÷5 =1余2,所以7=5*1 +2 5÷2=2余1,所以5=2*2 +11=2余0,所以到这里结束。最大公约1,说明逆元存在。 接下来回扩展欧几里得: 1 =5 -2*2 但是2=7 -5*1,代入: 1 =5 - (7 -5*1)*2 =5*3 -7*2 又5=26 -7*3,代入: 1=(26 -7*3)*3 -7*2=26*3 -7*9 -7*2=26*3 -7*11 所以系x是-11,对应的mod26下的正15,因为-11 +26=15。所以7的逆元15。 验证一下:7*15=105,105 mod26是105-4*26=105-104=1,对的。 所以解密公式就是x ≡15*(y -11) mod26。然后可能需要简化一下,比如15*(y-11) mod26可以展开为15y -165 mod26。计算-165 mod26的话,26*6=156,-165+156*2= -165+312=147,147 mod26是147-5*26=147-130=17,或者更简单的方式,165 ÷26=6余9,所以-165 ≡ -9 mod26,即17。所以15*(y-11) ≡15y -165 ≡15y +17 mod26。所以解密公式可以是x ≡15y +17 mod26。 不过可能用户只需要写出x=15(y -11) mod26,或者进一步简化表达式。比如将15*(-11) mod26计算出来,是-165 mod26=17,所以x≡15y +17 mod26。 然后需要确认这个过程的正确性。比如取一个明文x,比如x=0,加密后y=(0*7+11) mod26=11。解密时用15*(11-11)=0,正确。再比如x=3,y=7*3+11=32 mod26=6。解密的话,15*(6-11)=15*(-5)=-75 mod26。-75 + 3*26= -75+78=3,正确。 所以整个过程应该是正确的。用户可能还需要了解如何具体应用辗转相除,或者是否需要分步骤解释,或者有没有其他可能的错误点。比如,确认a26是否互质,这里gcd(7,26)=1,所以存在逆元。如果a不互质,逆元就不存在,这时候无解密。这也是为什么在仿射密码中,a必须26互质的原因。 另外,用户提到的引用中有关于仿射密码的内容,引用[1]里提到仿射密码的解密变换是x=a⁻&sup1;(y -b) mod26,所以这里的情况完全符合,可以引用这个作为依据。比如引用[1]中的内容说明仿射密码的解密方,并据此展开计算步骤。 总结一下,解密步骤是: 1. 确认a=726互质,gcd(7,26)=1。 2. 使用扩展欧几里得算找到7的逆元15。 3. 代入解密公式x=15*(y-11) mod26。 4. 简化表达式为x≡15y +17 mod26。 然后生成相关问题的时候,可以考虑仿射密码的其他方面,比如逆元的存在条件,不同的ab的情况,或者其他的加密算比较,或者具体的应用例子等。</think>### 分步解答 #### 1. 确认加密公式结构 加密公式为 $y = (7x + 11) \mod 26$,属于仿射密码形式 $y \equiv ax + b \mod 26$,其中 $a=7$,$b=11$。解密需要计算 $a$ 的逆元 $a^{-1}$,并构造解密公式 $x \equiv a^{-1}(y - b) \mod 26$[^1]。 #### 2. 计算逆元 $a^{-1}$ **目标**:找到整 $k$ 使得 $7k \equiv 1 \mod 26$。 **使用扩展欧几里得算**: 1. **欧几里得算求最大公约**: - $26 = 7 \times 3 + 5$ - $7 = 5 \times 1 + 2$ - $5 = 2 \times 2 + 1$ - $2 = 1 \times 2 + 0$ 最大公约为 $1$,逆元存在。 2. **回代求逆元**: - $1 = 5 - 2 \times 2$ - 代入 $2 = 7 - 5 \times 1$: $1 = 5 - (7 - 5 \times 1) \times 2 = 5 \times 3 - 7 \times 2$ - 代入 $5 = 26 - 7 \times 3$: $1 = (26 - 7 \times 3) \times 3 - 7 \times 2 = 26 \times 3 - 7 \times 11$ 得到 $k = -11$,取后 $k = -11 + 26 = 15$。 **验证**:$7 \times 15 = 105 \equiv 1 \mod 26$[^3]。 #### 3. 构造解密公式 解密公式为: $$x \equiv 15 \times (y - 11) \mod 26$$ 进一步化简: $$x \equiv 15y - 165 \mod 26$$ 计算 $-165 \mod 26$: $$-165 + 26 \times 7 = -165 + 182 = 17$$ 最终解密公式: $$x \equiv 15y + 17 \mod 26$$ #### 4. 示例验证 - **加密**:明文 $x=3$ $y = (7 \times 3 + 11) \mod 26 = 32 \mod 26 = 6$ - **解密**:密文 $y=6$ $x = (15 \times 6 + 17) \mod 26 = 107 \mod 26 = 3$ 结果正确。 ```python # Python 实现解密函 def decrypt(y): a_inv = 15 b = 11 return (a_inv * (y - b)) % 26 print(decrypt(6)) # 输出3 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值