msort :: Ord a => [a] -> [a]
msort []  = []
msort [x] = [x]
msort  x  = merge (msort a) (msort b)
  where (a,b) = splitAt (length x `div` 2) x


merge :: Ord a => [a] -> [a] -> [a]
merge x [] = x
merge [] y = y
merge (x:xs) (y:ys)
  | x <= y    = x : merge xs (y:ys)
  | otherwise = y : merge ys (x:xs)


gcd' :: Int -> Int -> Int
gcd' 1 m = 1
gcd' n 1 = 1
gcd' n m
  | n == m    = n
  | n > m     = gcd' m (n-m)
  | otherwise = gcd' n (m-n)