前言
接着之前探讨如何python代码化费马大定律,
python
# 验证费马大定理:n>2时,x^n + y^n = z^n 无正整数解
def verify_fermat_simple(n_start, max_n, max_xyz):
"""
简单验证费马大定理(有限范围)
:param n_start: 起始指数(建议≥3)
:param max_n: 最大指数
:param max_xyz: x、y、z的最大取值(正整数)
"""
# 遍历指定范围的指数n
for n in range(n_start, max_n + 1):
has_solution = False
# 遍历所有可能的正整数x、y、z
for x in range(1, max_xyz + 1):
for y in range(1, max_xyz + 1):
for z in range(1, max_xyz + 1):
if pow(x, n) + pow(y, n) == pow(z, n):
print(f"找到解:{x}^{n} + {y}^{n} = {z}^{n}")
has_solution = True
break
if has_solution:
break
if has_solution:
break
# 输出当前n的验证结果
if not has_solution:
print(f"n={n},在x、y、z≤{max_xyz}范围内,费马大定理断言成立")
else:
print(f"n={n},找到有效解,费马大定理断言不成立(有限范围)")
# 调用函数:验证n=3到n=5,x、y、z最大为100
if __name__ == "__main__":
verify_fermat_simple(n_start=3, max_n=5, max_xyz=100)
特殊关注
has_solution = False
为什么是它,它是干什么的??
1核心作用
- 一个布尔类型的标记变量(也叫 "标志位"/"状态变量"),记录在当前指数 n 下,是否找到了满足 xn+yn=znx^n + y^n = z^nxn+yn=zn 的正整数解,具体职责分为两点:
- 初始化状态:先默认 "未找到解"(赋值 False),这是符合逻辑的先验假设 ------ 在未进行任何数值遍历验证前,我们没有证据证明存在解,因此先标记为 "无解" 状态。
- 记录验证结果:在遍历 x、y、z 的过程中,若找到一组满足等式的正整数,就将其从 False 改为 True,永久记录 "当前 n 存在有效解" 这一结果,后续不会再被重置。
2我想到
将has_solution = False放到前面 这样我等于增加了一个条件
python
has_solution = False
if not has_solution:
else:
比较以前if elif 这次我直接给变量一个布尔值等于多了一个工具层面??
3为什么要用 has_solution 来输出当前 n 的验证结果
简单来说:遍历过程和结果输出是分离的,has_solution 是连接这两个环节的 "信息载体",同时解决了遍历效率和结果判断的核心问题,具体拆解如下:
- 解决 "遍历过程与结果输出分离" 的问题,实现逻辑闭环
- 我们的验证逻辑分为两个阶段:
- 阶段 1:内层遍历阶段(循环 x、y、z):只负责查找是否存在有效解,不负责输出最终结论。
- 阶段 2:外层结果输出阶段(遍历完 x、y、z 后):只负责根据查找结果输出 "是否符合费马大定理",不负责参与查找。
- 我们的验证逻辑分为两个阶段:
这两个阶段是独立的,而 has_solution 就是在两个阶段之间传递信息的 "桥梁":
- 内层遍历中,找到解 → 把 has_solution 设为 True(传递 "有解" 信息);没找到解 → has_solution 保持 False(传递 "无解" 信息)。
- 外层输出时,只需判断 has_solution 的值,就能知道内层遍历的最终结果,进而输出对应的结论,实现 "查找 - 判断 - 输出" 的逻辑闭环。
如果没有这个标记变量,我们要么无法在遍历结束后统一输出结论,要么只能在找到解的瞬间直接输出,无法实现 "无论有无解,都给出规范、统一的验证结果"。
- 实现 "提前终止无效遍历",大幅提升运行效率(关键优化)
在验证费马大定理时,对于某个固定的 n,只要找到任意一组满足条件的 (x,y,z),就足以证明 "当前 n 存在解",后续再遍历其他 x、y、z 都是无意义的。
- has_solution 正是实现 "提前终止" 的核心依据,具体流程:
- 一旦找到一组有效解,立即将 has_solution = True。
- 随后在每一层循环中,都加入 if has_solution: break 的判断,直接跳出当前循环(从内层 z 循环,到中层 y 循环,再到外层 x 循环),不再遍历后续无意义的数值。
如果没有 has_solution 这个标记,我们即使找到了解,也必须完整遍历完 x、y、z 的所有可能取值(比如 max_xyz=100 时,要遍历 100×100×100=100 万 次),这会造成大量的计算资源浪费,尤其是当 max_xyz 较大时,运行时间会大幅增加。