-3

これは、いくつかの素約数を見つけようとする次のコードです。私は TAOCP アルゴリズムを Haskell プログラムに変換しようとしましたが、何かが遅延して評価されるか熱心に評価されるかを理解できます。

modof2 n = let a0 = shiftR n 1
           a1 = shiftL a0 1
       in n-a1
iseven n = modof2 n == 0

factoringby2 n = let s=(lastf (takeWhile f [1..])) + 1
                 d=n `quot` powerof2 s
             in (s,d)
  where f s = let d = n `quot` (powerof2 s)
            in if isodd d 
               then False
               else True
      lastf [] = 0
      lastf xs = last xs

miller_rabin_prime_test n 0 result=return result
miller_rabin_prime_test n k result| (isodd n) && n>3 = do
                                            a<-randomRIO(2,n-2)
                                            let z = basic_step n a (fst sd) (snd sd)
                                            miller_rabin_prime_test n (k-1) z
  where sd=factoringby2 n
basic_step:: Integer->Integer->Int->Integer->Bool
basic_step n a s d =any (\x-> x==1 || x==n-1) (map x (map u [0..s-1]))
  where u j=powerof2(j)*d 
        x j=modular_pow a j n 1

isprime n = if n==2 || n==3
        then return True
        else if n<2
             then return False
             else if iseven n
                  then return False
                  else miller_rabin_prime_test n 5 True
x_m :: Double->Integer->Integer
x_m 0 n = 2
x_m m n = f (x_m (m-1) n) `mod` n
where f x = x^2 +1
l::Double->Double
l m = 2 ^ (floor (log2 m))
where log2 m = log m / log 2
g m n = let a = x_m m n
        b = x_m ((l m)-1) n
     in gcd (a-b) n

gg n = [g m n|m<-[1..]]


algorithmB n = do
            testprime<-isprime n
            let a = head (filter (1>) (gg n))
            c<-algorithmB (n `div` a)
            if testprime
            then return []
            else return (a:c)

algorithmB は終了しません。なぜこれが起こるのですか?遅延評価しないのはそのせいだと思います。本当?ありがとうc<-algorithmB (n div a)

4

1 に答える 1

1

algorithmB無限ループで自分自身を呼び出します。もちろん戻らない!

于 2013-02-07T20:29:17.430 に答える