2013-04-26 48 views
0

我有這個程序,應該搜索完美的數字。 (X是一個完美的號碼,如果該劃分X的所有數值,除以2的總和等於X)
總和/ 2 = X打開與程序相關的文件是否也會停止程序?

現在它已找到的第一個4,這是在古希臘已知,所以它不是真的很棒。

下一個應該是33550336.

我知道這是一個大數目,但該計劃已經持續了約50分鐘,仍然沒有找到33550336.

是不是因爲我打開.txt文件,我在程序運行時存儲所有完美的數字,還是因爲我沒有足夠的PC來運行它*,或者因爲我在使用Python?

*注意:同樣的PC在10分鐘內分解了500,000(同時也運行完美的數字程序,Chrome瀏覽器帶有3個YouTube標籤),也使用Python。

下面是代碼的程序:

i = 2 
a = open("perfect.txt", 'w') 
a.close() 
while True: 
    sum = 0 
for x in range(1, i+1): 
    if i%x == 0: 
     sum += x 
if sum/2 == i: 
    a = open("perfect.txt", 'a') 
    a.write(str(i) + "\n") 
    a.close() 
i += 1 
+0

你的問題實際上並沒有任何與你的問題。但是,沒有人可以在沒有看到一些代碼的情況下幫助你 – 2013-04-26 22:50:55

+0

你是什麼意思?我打開了存儲所有完美數字的文件,我想知道應用程序找不到其他內容的原因。我不得不解釋什麼是完美數字,並不是每個人都知道什麼是完美數字。 我發佈了一些代碼來幫助你。 – user2154354 2013-04-26 22:57:31

回答

0

這是非常困難的嘗試和演繹爲什麼發生這種情況。我建議你在調試器下運行你的程序並手動測試幾次迭代來檢查代碼是否真的正確(我知道你已經計算了4個數字,但是仍然)。另外,在python profiler下運行你的程序只是爲了查看它是否沒有被意外阻塞在某個鎖上或什麼東西上。

+0

我很樂意說你是對的,但是由於我對編程相對比較陌生,在Python中編程更多,所以我完全不知道你在說什麼。 '鎖上鎖'意味着什麼? – user2154354 2013-04-26 22:58:55

+1

@ user2154354 - 上帝正在談論您的程序可能被**卡住的可能性**正在等待訪問由另一程序或進程**鎖定**的文件或其他資源。 – 2013-04-26 23:20:45

0

這是可能的,但不可能是與您在打開運行時的文件相關的問題。如果這是一個問題,那麼可能會有一些錯誤消息和/或程序關閉/崩潰。

我會編輯程序,每隔一段時間就向文件中寫入一個日誌類型的輸出。例如,每當您處理了一個爲100萬的倍數的目標數字時,將日期時間和當前數字以及最後成功數字寫入日誌文件(open-append-close)。

然後您可以在Type文件中偶爾測量進度。

5

下一個應該是33550336.

你的代碼(我固定壓痕,使其在原則上你想要做什麼):

i = 2 
a = open("perfect.txt", 'w') 
a.close() 
while True: 
    sum = 0 
    for x in range(1, i+1): 
     if i%x == 0: 
      sum += x 
    if sum/2 == i: 
     a = open("perfect.txt", 'a') 
     a.write(str(i) + "\n") 
     a.close() 
    i += 1 

確實i部門找到i的因數。

因此,要找到最完美的人數達到n,它在for循環

2 + 3 + 4 + ... + (n-1) + n = n*(n+1)/2 - 1 

部門。

現在,n = 33550336,這將是

Prelude> 33550336 * (33550336 + 1) `quot` 2 - 1 
562812539631615 

大約560個* 10個部門。

假設你的CPU可以做每秒10個師(最有可能做不到,10 是在我的經驗更好的估計,但即使是機器int S IN C),這將大約需要560,000秒。一天有86400秒,因此大概需要六天半(估計超過兩個月)。

你的算法在合理的時間內太慢而無法達到。

如果你不想使用數論(甚至完美的數字有一個非常簡單的結構,並且如果有任何奇數的完美數字,那些必然是巨大的),你仍然可以做得更好,平方根找到除數,

i = 2 
a = open("perfect.txt", 'w') 
a.close() 
while True: 
    sum = 1 
    root = int(i**0.5) 
    for x in range(2, root+1): 
     if i%x == 0: 
      sum += x + i/x 
    if i == root*root: 
     sum -= x  # if i is a square, we have counted the square root twice 
    if sum == i: 
     a = open("perfect.txt", 'a') 
     a.write(str(i) + "\n") 
     a.close() 
    i += 1 

只需要大約1.3 * 10 部門,應該找到一兩個小時的第五完美一些。

沒有求助於明確的公式,甚至完美的數字(2^(p-1) * (2^p - 1)素數p這樣2^p - 1爲素數),可以通過尋找i質因數分解和計算從除數總和有所加快步伐。這將使所有複合數字的測試速度更快,並且對於大多數測試來說要快得多,並且對於大多數情況下測試速度要快得多,因此我的機器上估計需要40分鐘左右的時間。

不是一個糟糕的估計:

$ time python fastperf.py 
6 
28 
496 
8128 
33550336 

real 36m4.595s 
user 36m2.001s 
sys  0m0.453s 
+0

哇..只是哇。 – user2154354 2013-05-10 17:58:20

相關問題