module Special where
import E8 (gen,posRoots,inp,Vector,showVector)
import Control.Applicative ((<$>),(<*>))
import Data.List (genericLength)
import qualified Number.Peano as Peano
import System.Environment (getArgs)
main :: IO ()
main = do
d : rest <- map read <$> getArgs
putStr $ "d = " ++ show d ++ ": "
if null rest
then do
let
special = filter (apt peano7) (gen d)
verySpecial = filter (apt peano6) special
case (special,verySpecial) of
([] ,_ ) -> putStrLn $ "No special vectors found."
(x : _,[] ) -> putStrLn $ "No very special vectors, but found special vector:" ++ showVector x
(_ ,x : _) -> putStrLn $ "Found very special vector:" ++ showVector x
else
putStrLn $ "Generated: " ++ show (length $ gen d)
-- Verify whether a given vector is orthogonal to at most 2*r roots.
apt :: Peano.T -> Vector -> Bool
apt r = ((&&) <$> (<= r) <*> (>= peano1)) . genericLength . filter (== 0) . flip map posRoots . inp
-- These are "Peano integers" with the special property that one may compare
-- them, while evaluating them only up to the size needed to decide the
-- comparison.
peano1,peano6,peano7 :: Peano.T
[peano1,peano6,peano7] = [1,6,7]