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

求d>1000时x²+y²+z²=d²的快速求解算法

优化方程x²+y²+z²=d²(d>1000)的求解效率

我看你现在卡在了求解方程x²+y²+z²=d²(d>1000)的效率问题上,之前用的毕达哥拉斯四元组替代参数化法在d<400时就已经效率不佳,跑fncTest4(2000)居然花了4分钟,确实得好好优化一下。

先聊聊现有代码的问题

你的fncTest4用了双重循环枚举偶数a和b,这直接带来了**O(d²)**的时间复杂度——d=2000时,光循环就要跑近1000*1000=1e6次,每次循环还要调用EfficientDivisors分解因数,而这个因数分解函数本身还有bug:比如循环条件i < sqrt(n)会漏掉等于平方根的因数(比如n=4时,i<2就不会处理2),而且没把1和n本身加入因数列表,这会导致漏掉一些可能的解。

数学层面的优化思路

先把原方程变形一下:
x²+y² = d² - z² = (d-z)(d+z)

令s = d-z,t = d+z,那么s和t都是正整数,且满足:

  1. t > s(因为z>0)
  2. s和t同奇偶(因为s+t=2d是偶数)
  3. x²+y² = s*t

同时z=(t-s)/2,所以问题转化为:找到所有满足条件的s,使得s*(2d-s)(因为t=2d-s)能表示为两个平方数之和,再对这个数做平方和分解得到x和y,最后算出z。

另外,数论里有个关键结论:一个数能表示为两个平方数之和,当且仅当它的素因数分解中,每个形如4k+3的素数的指数都是偶数。利用这个结论可以快速判断一个数是否符合条件,不用暴力枚举所有可能的a和b。

优化后的代码实现

先修正并优化基础工具函数,再实现高效的求解逻辑:

import math

# 判断一个数是否可以表示为两个正整数的平方和
def can_be_sum_of_squares(n):
    if n == 0:
        return True
    # 去除所有因子4(不影响平方和表示)
    while n % 4 == 0:
        n = n // 4
    # 检查每个4k+3型素因子的指数是否为偶数
    p = 3
    while p * p <= n:
        if n % p == 0:
            count = 0
            while n % p == 0:
                count += 1
                n = n // p
            if count % 2 != 0:
                return False
        p += 2
    # 剩余部分为1、2或4k+1型素数,均可表示为平方和
    return n == 1 or n % 4 == 1 or n == 2

# 找出一个数的所有正整数平方和分解对
def sum_of_squares_pairs(n):
    pairs = []
    max_x = int(math.isqrt(n))
    for x in range(1, max_x + 1):  # 只找正整数对,排除0
        y_sq = n - x * x
        y = math.isqrt(y_sq)
        if y * y == y_sq and y >= 1:
            pairs.append((x, y))
            if x != y:
                pairs.append((y, x))
    return pairs

# 高效求解方程x²+y²+z²=d²的正整数解
def efficient_solve(d):
    solution_count = 0
    solutions = []
    # 枚举n的可能值:由原代码逻辑可知c=d-2n>0 → n < d/2
    for n in range(1, d // 2):
        k = d - n
        product = k * n
        if can_be_sum_of_squares(product):
            # 找到所有(x,y)使得x²+y²=product
            for x, y in sum_of_squares_pairs(product):
                a = 2 * x
                b = 2 * y
                c = d - 2 * n
                # 确保a、b、c都是小于d的正整数(符合原代码的输出逻辑)
                if a < d and b < d and c > 0:
                    solution_count += 1
                    solutions.append((solution_count, a, b, c, d))
    # 打印结果
    for sol in solutions:
        print(f"{sol[0]} : {sol[1]} {sol[2]} {sol[3]} {sol[4]}")
    return solution_count

# 测试d=2000
efficient_solve(2000)

优化效果说明

  • 时间复杂度从原来的O(d²√d)降到了O(d√d),d=2000时,循环次数从1e6降到了1000次,每次循环内的平方和分解也比原来的因数分解高效得多,实际运行应该能从4分钟压缩到几秒内。
  • 修正了因数分解的bug,不会漏掉可能的解。
  • 逻辑更贴合数学本质,避免了无意义的暴力枚举。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:26:46