求解模数方程(327²x)≡327 mod1009:乘数3的推导方法咨询
理解模数方程求解中乘数3的来源
你困惑的那个乘数3,其实一点都不神秘——它就是1009除以327的整数商,也就是做整数除法1009 // 327得到的结果。咱们一步步拆解清楚:
首先,回忆扩展欧几里得算法的核心思路:要找327*h ≡1 mod1009,本质是找整数h和k,使得327h +1009k =1(因为模1009的话,1009k≡0,所以剩下327h≡1)。而欧几里得算法求gcd的第一步,就是把大数用小数的倍数加余数表示:
1009 = 3*327 +28
把这个式子变形移项,得到:
28 =1009 -3*327
两边同时乘以-1,就得到作者写的:
-28 ≡3*327 mod1009
(因为1009≡0 mod1009,所以右边的-1009可以直接忽略)
这就是作者第一步用3的原因——它是欧几里得算法分解两个数时的第一个商,是求解过程的自然起点,作者只是省略了“计算1009除以327得商3余28”这个基础步骤,所以看起来像是凭空冒出来的。
接下来看作者的后续步骤,完全是沿着欧几里得算法的思路往下走:
- 下一步用327除以28,得到商12余9:
327=28*12 -9(因为28*12=336,336-327=9,所以写成减9的形式) - 把之前得到的28替换成
1009-3*327,代入上式,就得到了327和1009的线性组合 - 继续用同样的方法处理余数9,直到把余数推到1,最终得到
1=108*327 + k*1009,也就找到了逆元h=108
再看你写的验证代码getmod4,里面第一行multiplier = N//A,当A=327、N=1009时,1009//327正好是3,这和作者用的乘数完全一致——你的代码其实就是在复现欧几里得算法中“取商”的步骤,这也侧面验证了3的来源。
总结一下:那个乘数3不是随便选的,是整数除法的商,是扩展欧几里得算法求解逆元时的标准第一步,作者省略了基础的除法计算过程,才让它看起来突兀。
内容的提问来源于stack exchange,提问作者oppressionslayer
相关产品推荐
相关产品推荐

