正整数のゲーデル数化?
Posted feedbacks - Haskell
やっぱり一度文字列化するの一番効率的で簡単みたいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import Data.Char
primes = sieve [2..]
where
sieve (x:xs) = x : sieve [y| y<-xs, y `mod` x /= 0]
goedel x = product $ zipWith (^) primes (map digitToInt (show x))
{-
*Main> goedel 9
512
*Main> goedel 81
768
*Main> goedel 230
108
-}
|
ちょっとparallel list comprehension使ってみたかったんので...。 zipWith (^)より可読性いいかもしれないですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | {-# OPTIONS_GHC -fglasgow-exts #-}
import Data.Char
primes = sieve [2..]
where
sieve (x:xs) = x : sieve [y| y<-xs, y `mod` x /= 0]
goedel x = product [p^(digitToInt c) | p <- primes | c <- show x]
{-
*Main> goedel 9
512
*Main> goedel 81
768
*Main> goedel 230
108
-}
|
素数生成の部分はHaskellでは有名なコードなのでコピペです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import List
goedel n = product $ zipWith (\p d->p^d) primes (digits n)
-- copy & paste
primes = 2:(sieve [3, 5 ..])
where sieve (p:xs) = p: (sieve [ x | x <- xs, x `mod` p /= 0])
digits num = reverse $ unfoldr f num
where f a = let (c,d) = divMod a 10
in if (c,d) == (0,0) then Nothing
else Just (d,c)
|

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