- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 49127
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
知乎中一个关于编译器的讨论
里面提及用程序验证\(a^3+b^3=c^3\)的无非零解问题。
题目里面写了一个无限循环,只在找到解时返回false,然后在循环外面返回true.
由于编译器优化时判断出循环不会退出,内部只有返回false,所以直接优化为返回false.
问题是题目里面使用了unsigned long long 类型,这个数据类型只有64比特,而穷举的a,b,c范围为1到\(10^9\), 实际上它们的三次方都超越了unsigned long long表达范围,
所以实际上相当于模\(2^{64}\)的计算,所以是有解的,由于穷举顺序实际相当于c最里层循环,b齐次,由于容易看出\(a=1,b=2^{22},c=1\)是一个平凡解,那么
实际上程序在经过最多\(10^9\times (2^{22}-1)+1\)次迭代后就会退出,因为它实际上求解的方程为
\(a^3+b^3 \equiv c^3 \pmod {2^{64}}, 1\le a,b,c\le 10^9\)
现在的问题是
i)这个程序最多经过多少次迭代会退出?
ii) a=c这种类型的解实际上还是一种平凡解,如何找出一个非平凡解? |
|