aydarbiktimirov icon

Zhegalkin polynomial by truth table

aydarbiktimirov | PRO | 06/13/11 11:49:10 PM UTC | 0 ⭐ | 391 👁️ | Never ⏰ | []
Haskell |

780 B

|

None

|

0 👍

/

0 👎

import Data.List (intercalate)
 
xor a b = (a || b) && not (a && b)
 
triangle [] = []
triangle l@(x:xs) = [l] ++ (triangle $ zipWith xor l xs)
 
num2string _ _ 0 = "1"
num2string result var n
    | mod n 2 == 0 = num2string result (pred var) $ div n 2
    | n == 1 = (var:result)
    | otherwise = num2string (var:result) (pred var) $ div n 2
 
letter x n
    | n <= 1 = x
    | otherwise = letter (succ x) (pred n)
 
zhegalkin [] = []
zhegalkin l
    | l == [] = "1"
    | (length l) /= 2 ^ varCount = error "Incorrect list length"
    | otherwise = intercalate "+" $ filter (/= "") $ map stringFactor $ zip (map head (triangle l)) [0..]
    where   stringFactor x
            | fst x = num2string "" (letter 'A' varCount) $ snd x
            | otherwise = []
        varCount = truncate $ logBase 2 $ fromIntegral $ length l

Comments