challenge exp(pi * sqrt(n))が整数に近くなるnを探す

1以上200未満の整数nのうち、 exp(pi * sqrt(n))がほとんど整数であるようなnを求めるコードを書いてください。 なお、expは底がeである指数関数 - Wikipedia、 piは円周率、sqrtは平方根です。また「ほとんど整数である」とは 整数からプラスマイナス0.0001の範囲にあることとします。

Pythonで34行のスクリプトを書いて得られた出力の例が下のようになります。

37 199148647.999978
58 24591257752.000000
67 147197952743.999999
163 262537412640768744.000000 
この問題は光成さんに教えて頂いた e^{π*sqrt{163}}≒26253741640768744 が元になっています。ご協力ありがとうございました。

Posted feedbacks - Smalltalk

Squeak Smalltalk で。

組み込みの ScaledDecimal(Java でいうところの BigDecimal )を使って、sqrt と exp を自前で用意。sqrt には、開平法を使用しています。1GHz PowerPC (OS X) で、21 分ほどかかりました(^_^;)。
 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
| pi exp sqrt |

pi := 3.141592653589793238462643s24.

sqrt := [:x |
    | pairs digits mem rem |
    pairs := OrderedCollection new.
    [x > 0] whileTrue: [pairs addFirst: x \\ 100. x := x // 100].
    pairs addAll: (Array new: 24 withAll: 0).
    digits := rem := mem := 0.
    pairs do: [:pair |
        | next found |
        rem := rem * 100 + pair.
        (0 to: 9) findLast: [:i | rem - ((next := mem * 10 + (found := i)) * i) >= 0].
        rem := rem - (next * found).
        mem := next + found.
        digits := digits * 10 + found].
    (digits / 1e24) asScaledDecimal: 24].

exp := [:x |
    | val fac mul i delta |
    val := fac := i := 1s5.
    mul := x := x asScaledDecimal: 5.
    [(delta := mul / fac) > 0.00001s5] whileTrue: [
        val := val + delta.
        mul := mul * x.
        fac := fac * (i := i + 1)].
    val].

^(1 to: 200)
    collect: [:n | n -> (exp value: (pi * (sqrt value: n)))]
    thenSelect: [:assoc | (assoc value - (assoc value roundTo: 1)) abs <= 0.0001s4]

"=> {37 -> 199148647.99996s5. 
     58 -> 24591257751.99999s5. 
     67 -> 147197952743.99998s5. 
     163 -> 262537412640768743.99998s5} "

Index

Feed

Other

Link

Pathtraq

loading...