2013-01-23 63 views
-3

以下是我尝试找到一些素数因子的代码。我曾尝试TAOCP算法转换为Haskell程序,但是当一些评估懒洋洋地或急切地我能理解:IO Monad懒惰地评价吗?

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)是因为它不懒惰评估。真的吗? 谢谢

+6

我试着去研究它,但是我无法运行你的代码。它缩进了,缺少导入,未定义的符号和无意义的名字('l,g,gg')。如果您想获得帮助,请至少提供可运行的代码。 – rburny

+0

为什么IO中的代码呢?我没有看到这个原因。 – sepp2k

+2

@rburny你是不正确的。 '(>> =)''IO'在左边参数中是严格的。然而,我怀疑无限递归是由递归的'算法B'没有基本情况引起的。 – luqui

回答

1

algorithmB调用本身在一个无限循环。当然,它不会回来!