content: import Data.List (findIndex, isPrefixOf, tails)
  import Data.Maybe (fromJust)
  
  ----------------------- EKG SEQUENCE ---------------------
  
  seqEKGRec :: Int -> Int -> [Int] -> [Int]
  seqEKGRec _ 0 l = l
  seqEKGRec k n [] = seqEKGRec k (n - 2) [k, 1]
  seqEKGRec k n l@(h : t) =
    seqEKGRec
      k
      (pred n)
      ( head
          ( filter
              (((&&) . flip notElem l) <*> ((1 <) . gcd h))
              [2 ..]
          ) :
        l
      )
  
  seqEKG :: Int -> Int -> [Int]
  seqEKG k n = reverse (seqEKGRec k n [])
  
  
  --------------------- CONVERGENCE TEST -------------------
  main :: IO ()
  main =
    mapM_
      ( \x ->
          putStr "EKG ("
            >> (putStr . show $ x)
            >> putStr ") is "
            >> print (seqEKG x 20)
      )
      [2, 5, 7, 9, 10]
      >> putStr "EKG(5) and EKG(7) converge at "
      >> print
        ( succ $
            fromJust $
              findIndex
                (isPrefixOf (replicate 20 True))
                ( tails
                    ( zipWith
                        (==)
                        (seqEKG 7 80)
                        (seqEKG 5 80)
                    )
                )
        )
  