Comment detail
Meertens数 (Nested Flatten)This comment is reply for 4882 kozima: Haskell の勉強にと移植してみまし...(Meertens数). Go to thread root.
面白くはないけど、これでちょっと速くなりました。
SBCL との差は……あまり自信ありませんが、loop の中でクロージャを作って呼び出すオーバーヘッドとか?
1 2 3 4 5 6 7 8 9 | end
open Int
- val lst = List.tabulate (10 - start, fn x => x + start)
+ val lst = if start = 0 then [0,1,2,3,4,5,6,7,8,9]
+ else [1,2,3,4,5,6,7,8,9]
in
app f lst
end
|
独自のpowでさらに枝刈り。20桁での時間は約4時間までになりました。
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 | --- 110.sml 2007-12-21 19:45:26.606130399 +0000
+++ 110-3.sml 2007-12-21 20:58:19.679130289 +0000
@@ -13,16 +13,30 @@
fun loop _ [] _ prod sum _ =
if prod = sum then print (toString sum ^ "\n") else ()
| loop (p::ps) (b::bs) bound prod sum start = let
+ fun pow (x, y) = let
+ fun loop r 0 = 1
+ | loop r 1 = r
+ | loop r n = let
+ val z = r * x
+ in
+ if z <= bound then loop z (n - 1)
+ else bound + 1
+ end
+ in
+ loop x y
+ end
+
fun f x = let
val pp = pow (p, x)
in
if pp <= bound then
- loop ps bs (bound div pp) (prod * pp) (sum + b * fromInt x) 0
+ loop ps bs (bound div pp) (prod * pp) (sum + b * x) 0
else ()
end
open Int
- val lst = List.tabulate (10 - start, fn x => x + start)
+ val lst = if start = 0 then [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ else [1, 2, 3, 4, 5, 6, 7, 8, 9]
in
app f lst
end
|
そっか、そこ刈れてなかったんですね。それなら f の繰り返しを再帰呼び出しにするとまだ速くなります。
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 | --- 4926.sml 2007-12-22 15:37:01.000000000 +0900
+++ meertens.sml 2007-12-22 15:36:18.000000000 +0900
@@ -26,11 +26,12 @@
loop x y
end
- fun f x = let
+ fun f [] = ()
+ | f (x::xs) = let
val pp = pow (p, x)
in
if pp <= bound then
- loop ps bs (bound div pp) (prod * pp) (sum + b * x) 0
+ (loop ps bs (bound div pp) (prod * pp) (sum + b * x) 0; f xs)
else ()
end
@@ -38,7 +39,7 @@
val lst = if start = 0 then [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
else [1, 2, 3, 4, 5, 6, 7, 8, 9]
in
- app f lst
+ f lst
end
in
app (fn i => loop p (basis i) (IntInf.pow (10, i)) 1 0 1) lst
|





omoikani
#4903()
[
StandardML
]
Rating0/0=0.00
val p = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71 ] : IntInf.int list fun basis n = (rev o map (fn x => IntInf.pow (10, x)) o List.tabulate) (n, fn x => x) fun meertens n = let val lst = List.tabulate (n, fn x => x + 1) open IntInf fun loop _ [] _ prod sum _ = if prod = sum then print (toString sum ^ "\n") else () | loop (p::ps) (b::bs) bound prod sum start = let fun f x = let val pp = pow (p, x) in if pp <= bound then loop ps bs (bound div pp) (prod * pp) (sum + b * fromInt x) 0 else () end open Int val lst = List.tabulate (10 - start, fn x => x + start) in app f lst end in app (fn i => loop p (basis i) (IntInf.pow (10, i)) 1 0 1) lst end val _ = (meertens o valOf o Int.fromString o hd o CommandLine.arguments) ()Rating0/0=0.00-0+