2017-04-24 1 views
0

"녹색"정수는 2로 짝수 번 나눌 수 있습니다.
즉, 숫자의 소수 분해에는 2의 수가 짝수입니다.하스켈에서의 프라임 인수 분해

예 :이이 정확히 네 번으로 나누어 할 수 있기 때문에 80 •

이 녹색, 4도이다.
(80 = 2 * 2 * 2 * 5 * 2, 5로 나눌 수없는 2이다)가 2 정확히 3 회에 의해 분할 할 수 있기 때문에 56 •

이 녹색이 ​​아닌, 3 홀수
이 2 제로 시간으로 나눈 수 있기 때문에 15 •

이 녹색 ((56)는 2 * 2 * 7 * 2, 7이 아닙니다 의해 나눌 =), 나는 꽤 지출도

제로입니다 많은 시간이 소요되며 솔루션은 간결합니다.

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))"부분의 목적을 파악할 수 없습니다.

+4

x가 녹색이면 2x가 아니며 그 반대의 경우도 마찬가지입니다. –

답변

0

이와 비슷한? x 2 n 번으로 나눌 경우

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)] 
0

mod x 2 n이 짝수 일 경우 우리가 알아 내려고 시도하고있는 무슨이 N-1 번으로 나눌 수있다. x이 녹색이면 mod x 2은 n이 짝수이면 n-1이 홀수이므로 그렇지 않습니다. x이 녹색 숫자가 아니면 mod x 2은 녹색 숫자입니다. n이 홀수이면 n-1이 짝수이기 때문입니다. 이 되풀이 관계로 충분합니다. n을 알 필요가 없습니다. n이 짝수인지 알면됩니다. 따라서이 "아닌"사이의 전환이 n 일 수도 있고 아닐 수도 있습니다.