challenge Meertens数

お題#100「正整数のゲーデル数化?」で定義した goedel を適用すると自分自身になるような数,すなわち goedel (n) == n となるような正整数 n を見つける関数を定義してください.

このような数のことをMeertens数と言うそうです.

32bitsの符号なし整数(あるいは10進10桁整数)までの範囲で探すのにどのくらい計算時間がかかったかをCPUのスペックとともに教えてください.また,その実装で64bit符号なし整数(あるいは10進20桁整数)までの範囲で探すのにどのくらい計算時間がかかりそうか見積ってください(もちろん実際に計算して計算時間を示していただくのでもかまいません).

補足:

自分でやってみたHaskellでは30行ほどのプログラムで、10進10桁の範囲までの探索は ghci で 4.56秒(CPU Intel Core 2 Duo 2.6GHz)でした。

Posted feedbacks - Python

とりあえず、再帰で書いてみた。
searchMeertens(n)でn桁の範囲で探索します。
8桁で一つ見つかりました。

8桁を調べるのに160秒かかりました。
桁数が上がるごとに10倍の計算量になるので、
10桁では4時間くらいかなぁ。

とりあえず、累乗計算をしないようにしたけど、これからどうしようかな。
もうちょっと枝が刈れそうな気がするけど。

Cで書けばもうちょっと早くなるかな。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import time

def CreatePrimes(n):
    primes = []
    c = 2
    while len(primes) < n:
        primes.append(c)
        for x in primes[:-1]:
            if c%x == 0:
                primes.pop();
                break
        c += 1
    return primes

def searchMeertens(keta):
    def _search(keta,count,r,n,primes,first):
        n *= 10
        for x in range(first,10):
            if x:
                r *= primes[count]
                n += 1
            if r == n:
                print "Found Meertens.",n
            if keta > 1:
                _search(keta - 1, count + 1, r ,n ,primes, 0)
    p = CreatePrimes(20)
    _search(keta,0,1,0,p,1)


keta = 10
t0 = time.time()
t1 = t0

for n in range(1,keta+1):
    searchMeertens(n)
    print n , time.time() - t1 , "sec"
    t1 = time.time()
    
print "total time", time.time() - t0

Index

Feed

Other

Link

Pathtraq

loading...