You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

费马因式分解算法对大梅森素数失效?代码是否有误?

问题分析与解决

你的代码存在错误,并非费马因式分解算法对大素数失效。

错误原因

费马因式分解的核心是将N表示为a² - b² = (a-b)(a+b),对于素数N,它的唯一分解是1 × N,算法本身是有效的。但你的代码中判断b_square是否为完全平方数的方式有问题:
使用math.sqrt(b_square).is_integer()依赖浮点数运算,而浮点数的精度有限,当处理极大数时,无法精确表示超大整数的平方根,会导致误判——把非完全平方数错误识别为完全平方数,提前退出循环,返回错误的因子。

比如测试2147483647这个素数时,循环中某个a对应的a² - N并非完全平方数,但math.sqrt返回的近似浮点数被is_integer()判定为整数,最终计算出错误的b,得到268435456 × 8的错误结果。

修正后的代码

将判断完全平方数的逻辑改为用整数运算验证,避免浮点数精度问题:

import math

N = int(input("Insert a large number: "))

def fermat_factorization(N: int) -> list[int]:
    if N % 2 == 0:
        return [2, N // 2]

    a = math.isqrt(N) + 1
    b_square = a**2 - N

    while True:
        b = math.isqrt(b_square)
        if b * b == b_square:
            break
        a += 1
        b_square = a**2 - N

    return [a + b, a - b]

factors = fermat_factorization(N)
print(f"\nThe factors of {N} are {factors}")

效果说明

修正后的代码会正确处理素数:对于素数N,最终会找到a=(N+1)//2,b=(N-1)//2,返回[N, 1](或顺序相反),符合素数的分解结果。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:02:46