为何Python因式分解程序处理大于102030405060708001的数时失效?
问题:Python因式分解程序处理大数出错的原因
这段Python因式分解程序在处理102030405060708001及以内的整数时运行正常,但处理更大的整数时会产生错误结果。请问这是为什么?
import math a = [] def prime(n): isPrime = True for r in range(2,int(n**(1/2)+1)): if n%r == 0: isPrime = False return isPrime def factor(number): if prime(number): a.append(int(number)) for r in range(2, 1 + int(number**(1/2))): if number%r == 0: a.append(r) number = number/r factor(number) break return a number = int(input("Enter a number whose factors you want:")) factor(number) print(f"Factor of {number} are ", end = ": ") print(*a, sep = ' X ') print(math.prod(a))
示例结果
- 102030405060708001的因式分解结果为:
1867601 X 54631800401,乘积为102030405060708001(正确)。 - 102030405060708002的因式分解结果为:
2 X 2 X 2 X 2 X 2 X 3 X 3 X 5 X 5 X 5 X 6133 X 462119341,乘积为102030405060708000(错误)。 - 102030405060708003的因式分解结果为:
3 X 2 X 2 X 2 X 2 X 2 X 3 X 5 X 5 X 5 X 6133 X 462119341,乘积为102030405060708000(错误)。
错误原因分析
- 浮点数精度丢失:Python用
**(1/2)计算平方根会返回浮点数,而64位双精度浮点数只能精确表示2^53以内的整数。处理超过该范围的大数时,平方根计算结果会失真,导致int(n**(1/2)+1)取整错误,循环遍历的因数范围不正确,要么漏掉真正的因数,要么错误判断质数。同时number = number/r用浮点数除法会丢失整数精度,后续递归处理的number已不是精确整数,进一步引发分解错误。 - 全局列表未重置:全局列表
a在每次调用factor前未清空,处理多个大数时,前一次分解的结果会残留其中,导致后续输出的因式分解结果混入无关因数,比如示例中102030405060708003的结果包含了前一个数的因数。 - factor函数逻辑漏洞:当输入的
number是质数时,执行a.append(int(number))后未终止函数,会继续进入后续for循环。结合浮点数精度问题,大数质数的平方根计算失真,循环范围错误,可能导致错误尝试分解质数,加剧结果偏差。
内容的提问来源于stack exchange,提问作者Nitesh
相关产品推荐
相关产品推荐

