Haskell中的素数因子分解

时间:2017-04-24 15:48:53

标签: algorithm haskell

“绿色”整数可以除以2偶数次 换句话说,数字的素数分解中存在偶数个2。

的示例:

•80为绿色,因为它可以被正好四次除以4,而四是偶数 (80 = 2 * 2 * 2 * 2 * 5,5不能被2整除)

•56不是绿色,因为它可以被分成2次正好三次,三次是奇数   (56 = 2 * 2 * 2 * 7,而7不能被2整除)

•15为绿色,因为它可以除以2 0次,零为偶数

我花了很多时间,解决方案简明扼要:

green 0 = error "zero"
green x
    | mod x 2 == 0 = not (green (div x 2))
    | mod x 2 == 1 = True

我无法想象“not(green(div x 2))”部分的目的。

2 个答案:

答案 0 :(得分:0)

这样的事情?

green x = go x 0
       where go 0 n = even n
             go x n | mod x 2 == 0 = go (div x 2) (n+1)
                    | otherwise    = even n


> zip [1..] $ map green [1..16]

[(1,True),(2,False),(3,True),(4,True),(5,True),(6,False),(7,True),(8,False),(9,True),
 (10,False),(11,True),(12,True),(13,True),(14,False),(15,True),(16,True)]

答案 1 :(得分:0)

如果x可以被2整除,那么mod x 2可以被2 n-1整除,我们试图找出的是n是偶数。 如果x是绿色数字,则mod x 2不是因为如果n是偶数,那么n-1是奇数。 如果x不是绿色数字,则mod x 2是绿色数字,因为如果n是奇数,则n-1是偶数。 这种递归关系就足够了,你不需要知道n,你只需知道n是否是偶数,所以这"不是"它之间的切换是偶数还是不是。