用python测试-1大于12的异常值

问题描述 投票:0回答:1

所以我看到了这个精彩的 视频 由Numberphile制作的,他们解释说,如果你把所有的自然数加起来,你最终会得到答案-112。

我想,为什么不试着用电脑检查一下,这是我得出的一个代码。

num1 = 1
num2 = 2

while True:
    result = num1 + num2
    num1 += 1
    num2 += 1
    print(f'cycle #{num2} passed... \nresult is {len(str(result))} digits long')
    if result < 0:
        print('wtf?')
        print(f'that was loop # {num2} on which a miracle happened')
        break

这段代码已经运行了大约20分钟了 我目前正在进行第2100万次循环 我感觉一定有办法加快这些计算,对吗?有什么办法吗?

仅供参考。我对数学中的无穷大概念很熟悉,只是有点好奇 而且要离开我的电脑一周,为什么不试一试呢?

python math optimization physics anomaly-detection
1个回答
2
投票

这在数字上是行不通的。为了得到-112的结果,你需要无数的自然数。另外,为了使整个结果为-112,你需要把整个系列作为一个对象,而不是一次几个项。基本概念是,你不能在任何一个项之间停止处理事情。你一定也注意到了那个数字爱好者的视频。他们从来没有逐项处理过这个系列。每当他们操作系列的时候,他们都是把它作为一个整体,作为一个单一的基本对象来操作。 这就是为什么这不能在数值上实现的原因,因为它是理论概念,是对整个无限数列的不同处理,它给你的结果是-112。计算机不懂无限对象,你不能把这种对象写下来并存储在内存中。

对不起,如果让你失望了,老兄,否则得到这个结果真的很爽。我也是这种奇怪的数学和数字爱好者视频的粉丝。


1
投票

你应该先尝试让程序 "正确",再尝试让程序快速。现在你计算的不是1+2+3+4+5+......的累加和,而是1+2,2+3,3+4,......的对偶和的序列。

输入输出操作,如 print() 是很慢的。你可以通过每一百万或一千万次操作打印一次来显著加快计算速度,例如maple。

if num2 % 1000000 == 0:
    print(f'cycle #{num2} passed... \nresult is {len(str(result))} digits long')

在这之后,下一个大的优化将来自于从 CPython 解释器切换到开销更低的语言 (比如 C, C++, PyPy, C#, Java, ...)。如果转移到其他语言,请记住,Python中的整数可以是任意大的。在许多语言中,你需要一个外部库,因为 "本地 "整数类型有大小限制。

© www.soinside.com 2019 - 2024. All rights reserved.