如果停止问题太晦涩难懂,请以这种方式考虑。
采取一个数学问题,该问题被认为对所有正整数n都成立,但尚未证明对每一个n都成立。哥德巴赫猜想就是一个很好的例子,任何大于2的正偶整数都可以用两个质数之和表示。然后(使用适当的bigint库)运行此程序(后接伪代码):
for (BigInt n = 4; ; n+=2) {
if (!isGoldbachsConjectureTrueFor(n)) {
print("Conjecture is false for at least one value of n\n");
exit(0);
}
}
实施isGoldbachsConjectureTrueFor()
就留给读者做练习,但为此目的可能是在所有的素数进行简单迭代小于n
现在,从逻辑上讲,以上内容必须等于:
for (; ;) {
}
(即无限循环)或
print("Conjecture is false for at least one value of n\n");
因为哥德巴赫的猜想必须是正确的或不正确的。如果编译器始终可以消除无效代码,则无论哪种情况,肯定都需要消除无效代码。但是,这样做至少会使您的编译器需要解决任意困难的问题。我们可以提供问题可证明的辛苦,那就要解决(如NP完全问题)来确定的码位以消除。例如,如果我们采用以下程序:
String target = "f3c5ac5a63d50099f3b5147cabbbd81e89211513a92e3dcd2565d8c7d302ba9c";
for (BigInt n = 0; n < 2**2048; n++) {
String s = n.toString();
if (sha256(s).equals(target)) {
print("Found SHA value\n");
exit(0);
}
}
print("Not found SHA value\n");
我们知道该程序将打印出“找到的SHA值”或“找不到SHA值”(如果您能告诉我哪个是正确的,请加分)。但是,为了使编译器能够合理地优化,需要进行2 ^ 2048次迭代。实际上,这将是一个巨大的优化,因为我预计上述程序将(或可能)运行到宇宙热死为止,而不是在没有优化的情况下打印任何内容。