module E7Roots where
import E8 (Vector,inp)
import E7 (gen,posRoots)
import Control.Applicative ((<$>))
import Control.Monad (when)
import Data.Traversable (for)
import Data.List (genericLength)
import qualified Number.Peano as Peano
import System.Environment (getArgs)
import System.IO (hSetBuffering,BufferMode(LineBuffering),stdout)
main :: IO ()
main = do
r : minD : maxD : _ <- map read <$> getArgs
hSetBuffering stdout LineBuffering
when (odd r) $ error "Error: number of orthogonal roots must be even."
let p = fromInteger $ r `div` 2
(>> return ()) . for [fromInteger minD .. fromInteger maxD] $ \ d -> do
putStr $ "d = " ++ show d ++ ": "
let
special = filter (apt p) (gen d)
case special of
[] -> putStrLn $ "no"
_ : _ -> putStrLn $ "yes"
-- Verify whether a given vector is orthogonal to exactly 2*p roots.
apt :: Peano.T -> Vector -> Bool
apt p = (== p) . genericLength . filter (== 0) . flip map posRoots . inp