タグ

ブックマーク / tsumuji.cocolog-nifty.com (2)

  • Haskell で素数列 : 1000000 個目の素数が 3.5 秒で表示されました。 - ツムジのひとりごと

    以前、こちらの記事を参考にした、「Haskell で素数を列挙するコード」に関する記事をアップしましたが、その後も、ちょこちょことコードをいじって改良を加えてきました。 ある程度納得のいくコードができたので、現在使っているコードの紹介をしてみたいと思います。 primes :: Integral a => [a] primes = map fromIntegral ([2, 3] ++ primes' :: [Int]) where primes' = 5 : sieve [] primes' 7 sieve divs (x : xs) n = ps ++ sieve (divs ++ [x]) xs (x * x) where isPrime m = and [rem m x /= 0 | x <- divs] ps = filter isPrime ns ns = [y + z | y

    Haskell で素数列 : 1000000 個目の素数が 3.5 秒で表示されました。 - ツムジのひとりごと
  • Haskell で素数 - ツムジのひとりごと

    "Project Euler" の問題には「素数」に関連したものが時々出てきます。そこで今回は、Haskell でどうやって素数列を扱っていけば良いかを考えてみます。 Haskell で有名なものに「エラトステネスの篩」があります。(以下のコードは最初から 2 以外の偶数を省いたものです) primes :: [Integer] primes = 2 : sieve [3, 5 ..] where sieve (p : xs) = p : sieve [x | x <- xs, rem x p /= 0] 「簡単なコードで素数の無限数列を扱える」ということで Haskell のコードとしては有名(?)なものですが、実は非常に遅いです。 このコードは、"ghc" で最適化のオプションを付けてコンパイルしても、「20万以下の素数の和」を求めるのに約 40 秒もかかってしまいます。(これ以降、時

    Haskell で素数 - ツムジのひとりごと
  • 1