如何用Python高效求解特定丢番图方程的整数解(x≠y)
优化四次幂差丢番图方程的求解效率
一、核心优化思路:从O(n²)降到O(n)
你的暴力解法遍历所有(x,y)对,时间复杂度是O(limit²),当limit=1e6时完全无法运行。以下是针对性的优化方案:
1. 先化简表达式,减少计算开销
先把四次幂差展开,避免重复计算高次幂:
左边:$(y+n)^4 - y^4 = 4n y^3 + 6n² y² + 4n³ y + n^4$
右边:$(x+k)^4 - x^4 = 4k x^3 + 6k² x² + 4k³ x + k^4$
直接用展开后的式子计算,比先算四次幂再相减快得多——幂运算的计算成本远高于加减乘除。
2. 用哈希表预存结果,快速匹配
先遍历所有x,把对应的右边值存入字典(键为结果值,值为对应的x列表),然后遍历y计算左边值,直接查字典找匹配的x,同时过滤x=y的情况。这样时间复杂度直接降到O(limit),1e6级别的遍历完全可行。
优化后的代码:
n = 1 k = 2 limit = 10**6 # 预存所有x对应的右边值 rhs_map = {} for x in range(1, limit): rhs = 4 * k * x**3 + 6 * k**2 * x**2 + 4 * k**3 * x + k**4 if rhs not in rhs_map: rhs_map[rhs] = [] rhs_map[rhs].append(x) # 遍历y查找匹配的x for y in range(1, limit): lhs = 4 * n * y**3 + 6 * n**2 * y**2 + 4 * n**3 * y + n**4 if lhs in rhs_map: for x in rhs_map[lhs]: if x != y: print(f"Match found: x = {x}, y = {y}")
3. 利用单调性提前终止遍历
展开后的表达式是严格递增的(n、k为正整数,x、y≥1时,函数随变量增大而单调递增),所以当计算的lhs超过字典中最大的rhs值时,后续y更大,lhs只会更大,不可能匹配,可以直接终止遍历。
加上这个优化的代码:
n = 1 k = 2 limit = 10**6 rhs_map = {} max_rhs = 0 for x in range(1, limit): rhs = 4 * k * x**3 + 6 * k**2 * x**2 + 4 * k**3 * x + k**4 if rhs not in rhs_map: rhs_map[rhs] = [] rhs_map[rhs].append(x) if rhs > max_rhs: max_rhs = rhs for y in range(1, limit): lhs = 4 * n * y**3 + 6 * n**2 * y**2 + 4 * n**3 * y + n**4 if lhs > max_rhs: break # 后续y更大,lhs不可能匹配 if lhs in rhs_map: for x in rhs_map[lhs]: if x != y: print(f"Match found: x = {x}, y = {y}")
二、已知的正整数解情况
你提到的$(n=74, k=24)$对应的一组正整数解是$x=510, y=945$(验证:$(510+24)^4 -510^4 = (945+74)^4 -945^4 = 84154109896$)。
目前已知的非平凡正整数解(x≠y)非常稀少:
- 除了$(n=74, k=24)$的解外,没有发现其他小的(n,k)组合存在正整数解(比如n=1,k=2遍历到1e6也不会找到解)。
- 从数论角度,该方程可转化为椭圆曲线问题,这类方程的正整数解通常数量有限,目前没有证据表明存在无穷多解。
内容的提问来源于stack exchange,提问作者Agbanwa Jamal
相关产品推荐
相关产品推荐

