正整数のゲーデル数化?
Posted feedbacks - StandardML
10桁限定。それ以上は整数がoverflowします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | fun prime n a 0 = a
| prime n a i =
if n mod 2 <> 0 andalso n mod 3 <> 0 then
prime (n + 1) (a @ [n]) (i - 1)
else
prime (n + 1) a i
fun goedel n =
let
val p = prime 5 [2, 3] 10
val a = map (valOf o Int.fromString o str) ((explode o Int.toString) n)
in
floor (ListPair.foldl (fn (x, y, z) => Math.pow (real x, real y) * z) 1.0 (p, a))
end
val printInt = println o Int.toString;
printInt (goedel 9);
printInt (goedel 81);
printInt (goedel 230)
|
素数生成が間違っていたので修正。 ついでに多倍長整数を使って、Overflowしないようにしてみた。
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 | fun prime n =
let
val a = List.tabulate (n - 1, fn x => x + 2)
fun loop [] = []
| loop (x::xs) =
x :: loop (List.filter (fn i => i mod x <> 0) xs)
in
loop a
end
fun goedel (n : IntInf.int) =
let
open IntInf
val p = map fromInt (prime 100)
val a = map (valOf o Int.fromString o str) ((explode o toString) n)
in
toString (ListPair.foldl (fn (x, y, z) => pow (x, y) * z) 1 (p, a))
end
fun println s = print (s ^ "\n")
val _ = println (goedel 9)
val _ = println (goedel 81)
val _ = println (goedel 230)
val _ = println (goedel 19425463134)
|




nobsun
#4420()
Rating2/2=1.00
see: ゲーデル数
[ reply ]