content: import Data.Numbers.Primes (isPrime)
  
  ----------------------- PELL SERIES ----------------------
  
  pell :: Integer -> Integer -> [Integer]
  pell a b = a : b : zipWith (+) (pell a b) ((2 *) <$> tail (pell a b))
  
  a000129, a002203, a001333, a086383, a096650, a002315 :: [Integer]
  a000129 = pell 0 1
  
  a002203 = pell 2 2
  
  a001333 = (`div` 2) <$> a002203
  
  a086383 = filter isPrime a000129
  
  a096650 = zip [0 ..] a000129 >>= (\(i, n) -> [i | isPrime n])
  
  a002315 = 1 : 7 : zipWith (-) ((6 *) <$> tail a002315) a002315
  
  
  ------------------- PYTHAGOREAN TRIPLES ------------------
  
  pythagoreanTriples :: [(Integer, Integer, Integer)]
  pythagoreanTriples =
    (tail . concat) $ zipWith3 go [0 ..] a000129 (scanl (+) 0 a000129)
    where
      go i p m
        | odd i = [(m, succ m, p)]
        | otherwise = []
  
  -------------------------- TESTS -------------------------
  main :: IO ()
  main = do
    mapM_
      (\(k, xs) -> putStrLn ('\n' : k) >> print (take 10 xs))
      [ ("a000129", a000129)
      , ("a002203", a002203)
      , ("a001333", a001333)
        -- Waste of electrical power ?
        -- ("a086383", a086383)
        -- ("a096650", a096650
      , ("a002315", a002315)
      ]
  
    putStrLn "\nRational approximations to sqrt 2:"
    mapM_ putStrLn $
      (take 10 . tail) $
      zipWith
        (\n d ->
           show n <>
           ('/' : show d) <> " -> " <> show (fromIntegral n / fromIntegral d))
        a001333
        a000129
  
    putStrLn "\nPythagorean triples:"
    mapM_ print $ take 10 pythagoreanTriples
  