標籤:

如何設計演算法計算一個超長數列的和?

對於數列sum_{1}^{n}{1/x} 求和,n屬於自然數,在n非常大的情況下怎麼才能得到一個較為精確的值?例如n最大取值到10^{20} ,怎麼才能得到一個較為精確的解。在這兒有個小小的要求,就是不能採用歐拉公式來計算。

多謝了!


題主在其他回答下面的評論:

的確不大,其實這道題目來源自《民科》貼吧,裡面有個人認為這個數列會收斂到400,而且這個人只認純累加計算,不認其它方法,我想算的超過400。其實用maple很容易計算,但是maple內部肯定是用歐拉公式之類實現的近似計算,肯定不是純累加算出來的,否則不可能那麼快啊!

我覺得解決方法就是別去民科貼吧。問題你也看出來了

  1. 你在跟傻逼討論

  2. 對方把你能用的工具限定在傻逼能懂的範圍內

這不就是著名的跟傻逼辯論,智商被拉到傻逼的程度,然後對方用豐富的經驗擊敗你嗎?

重要的事情要說三遍:別去民科貼吧!別去民科貼吧!

然後回到你的問題,你知道那個和大約等於ln n,所以如果你要跟這個民科吵,你就要找一個n使得ln n&>&>400。這也就是n &>&> e^400 ≈ 10^173。

所以你保險起見得找個n=10^200以上的數字,才能讓加出來的和明顯大於400……我建議你別跟這人辯論了,真的。

EDIT:補充一下,你的電腦的計算能力大約是10^9每秒,如果你能高效利用向量化和多核的話可以分別提升一個數量級,如果你能高效利用GPU的話也可以直接提升兩個數量級(但是和前面的CPU優化不疊加)。然後你把一秒換成一天可以提升5個數量級,把一天換成你的一輩子可以再提升4個數量級。你砸錢上超級計算機大約可以提升0-7個數量級不等(取決於你的錢數)。

然而你面臨的問題如果是10^173這個量級的,請三思……回到原來的10^20的問題的話也請按照上面的討論估計一下,你打算花多少技術,多少時間和多少錢來湊夠20這個指數。


N=10^10的時候,需要17秒(i5+4G內存,Surface Pro 1)

N=10^20的時候,需要5400年

但是可以通過並行運算減少時間,如果你確實需要一個精確的結果的話。

用54000台電腦,大概用1個半月即可。

還是能接受的。


如何設計演算法計算sum_{1}^{n}{(-1)^n} 的和,比如說n = 10^{50000000}?如何得到一個比較精確的解?這兒有一個小小的要求,就是不希望使用等比數列求和公式之類的取巧方法來計算。請用直接的累加堂堂正正地求出答案!


精度根本不是問題,寫個高精度保留幾十位小數很容易的。

關鍵是,你想要循環10^20次,這是萬萬行不通的,這麼多次怎麼也得幾千年才能跑完。

所以還是代公式,或者拿積分估計一下吧。

比如,你要保留7位小數的話,那麼sum_{n=10^8}^{10^{20}}frac{1}{n}可以用int_{10^8}^{10^{20}}frac{1}{x}dx=12ln(10)來估計,誤差不超過10^{-8}

因此,你只要算10^8之內的和就可以了。

由於double至少有15~16位的精度,經過10^8次累加仍然有7位有效數字是沒問題的。所以,用不著高精度。直接寫一個循環,用double從1/1加到1/10^8,再加上12ln(10),就行了。

(一些細節不保證準確,請自行驗證。)


你把歐拉公式的證明過程給他寫一遍,就說是自己發現的。

我猜他應該並不知道是歐拉公式。

(?? . ??)


如果數列的和收斂的話,看《A=B》


計算機最小浮點數是多少


推薦閱讀:

如何解答這道關於數論的題目?
傅立葉級數和傅立葉變換是什麼關係?
a0,a1,a2,...a(n-1)是整數,求證,行列式det(ak的t次方)(0=<k,t<=n-1)能被∏s!(s從1到n-1)整除?
隨機變數的矩和高階矩有什麼實在的含義?
拓撲量子計算的前景?

TAG:演算法 | 數學 |