You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中如何求超大Decimal类型数的除法余数?

解决超大数的模运算问题

嘿,我明白你现在的困境——手里拿着一个大到离谱的数,用Decimal存着,想求余数却找不到合适的方法。不过咱们先把问题拆清楚:你其实是想算m^e除以n的余数对吧?你现在先算了m^e/n得到那个超大商,其实完全绕远路了,根本不用碰那个巨无霸数字。

为啥不用硬算m^e

模运算有个超实用的性质:(a * b) mod n = [(a mod n) * (b mod n)] mod n。利用这个性质,我们可以在计算幂的过程中每一步都取模,根本不会生成那个天文数字级的m^e。而且Python内置的pow函数早就帮咱们实现了这个优化!

直接用三参数pow搞定

Python的pow支持三个参数:pow(base, exp, mod),它会高效算出(base^exp) % mod,全程不会溢出,也不会卡死——因为它根本不会生成完整的m^e,每一步运算都保持在模n的范围内。

就拿你的例子来说,直接写:

m = 11041011081081113211911111410810033321161041051153210511532973283698344321151051091121081013210111099114121112112105111110321151011141181059910132503210297991161111143210111099114121112112101100321091011151159710310133
e = 11891753
n = 11891753
remainder = pow(m, e, n)
print(remainder)

运行这个,瞬间就能得到余数,完全不用等原代码那样卡死,也不用处理那个超大的Decimal数。

要是非得从已有的Decimal商反推余数?

假设你已经有了q = Decimal(m**e)/n(也就是那个超大商),那余数r = m**e - n*q。但这里要注意两点:

  • 你得确保q是精确的——如果m^e不能被n整除,q会是个小数,这时候计算n*q要用Decimal来保证精度。
  • 存储完整的m^e作为Decimal本身就需要巨量的内存和时间,这也是你原代码冻结的原因,所以这种方法真的不推荐。

最后总结

优先用Python内置的三参数pow函数,这是处理这类大指数模运算的最优解——高效、简洁,还完全避开了超大数的麻烦。

内容的提问来源于stack exchange,提问作者AngusClayto

火山引擎 最新活动