Python pow函数处理1024位整数模幂运算结果不符合预期问题咨询
异常原因解答
你遇到的问题核心是大整数运算时隐式转换为浮点数导致精度丢失,具体如下:
- Python 3中使用
/运算符做除法时,无论操作数是否为整数,返回结果均为浮点数类型。双精度浮点数的有效精度仅为53个二进制位,对应约16位十进制数,你所使用的p是1024位大整数,远远超过浮点数的精确表示范围,(p-1)/2在转换为浮点数的过程中就已经丢失了低位精度,再通过int()转换得到的指数值和真实的(p-1)/2整数值完全不一致,最终导致pow模运算的结果不符合数论预期。 - 修正方法是使用Python的整数除法运算符
//替换/,不需要额外做int()转换即可得到精确的指数值,修正后代码如下:
p = 101524035174539890485408575671085261788758965189060164484385690801466167356667036677932998889725476582421738788500738738503134356158197247473850273565349249573867251280253564698939768700489401960767007716413932851838937641880157263936985954881657889497583485535527613578457628399173971810541670838543309159139 x = 85256449776780591202928235662805033201684571648990042997557084658000067050672130152734911919581661523957075992761662315262685030115255938352540032297113615687815976039390537716707854569980516690246592112936796917504034711418465442893323439490171095447109457355598873230115172636184525449905022174536414781771 print(pow(x, (p-1)//2, p))
运行修正后的代码即可得到符合理论预期的结果1。SageMath中针对大整数的除法默认执行精确整数运算,不会隐式转换为浮点数,所以运行原始逻辑可以得到正确结果。
内容的提问来源于stack exchange,提问作者charlotte
相关产品推荐
相关产品推荐

