{-# OPTIONS_GHC -Wall #-}

-- | Get the roots of shifted Legendre and Radau polynomials
--
-- >>> shiftedLegendreRoots 3
-- Just [0.11270166537925831,0.5,0.8872983346207417]
-- >>>  shiftedRadauRoots 2
-- Just [0.1550510257216822,0.6449489742783178]
--
-- The roots are pre-computed and only a finite number are provided
--
-- >>> (V.length allShiftedLegendreRoots, V.length allShiftedRadauRoots)
-- (301,301)
-- >>>  shiftedLegendreRoots 1000000000000000
-- Nothing
--
-- There are N roots in the Nth Jacobi polynomial
--
-- >>> import Data.Maybe ( fromJust )
-- >>> V.length (fromJust (shiftedLegendreRoots 5))
-- 5
-- >>> all (\k -> k == V.length (fromJust (shiftedLegendreRoots k))) [0..(V.length allShiftedLegendreRoots - 1)]
-- True
-- >>> all (\k -> k == V.length (fromJust (shiftedRadauRoots k))) [0..(V.length allShiftedRadauRoots - 1)]
-- True

module JacobiRoots
       ( shiftedLegendreRoots
       , shiftedRadauRoots
       , allShiftedLegendreRoots
       , allShiftedRadauRoots
       ) where

import Data.Binary ( decode )
import qualified Data.Vector as V
import Data.Vector ( (!?) )

import JacobiRootsBinary ( allShiftedLegendreRootsBinary, allShiftedRadauRootsBinary )

-- | get the roots of the Nth shifted Legendre polynomial
--
-- @
-- 'shiftedLegendreRoots' == ('allShiftedLegendreRoots' '!?')
-- @
--
-- >>> mapM_ (print . shiftedLegendreRoots) [0..3]
-- Just []
-- Just [0.5]
-- Just [0.2113248654051871,0.7886751345948129]
-- Just [0.11270166537925831,0.5,0.8872983346207417]
shiftedLegendreRoots :: Int -> Maybe (V.Vector Double)
shiftedLegendreRoots = (allShiftedLegendreRoots !?)

-- | get the roots of the Nth shifted Radau polynomial
--
-- @
-- 'shiftedRadauRoots' == ('allShiftedRadauRoots' '!?')
-- @
--
-- >>> mapM_ (print . shiftedRadauRoots) [0..3]
-- Just []
-- Just [0.3333333333333333]
-- Just [0.1550510257216822,0.6449489742783178]
-- Just [8.858795951270394e-2,0.4094668644407347,0.787659461760847]
shiftedRadauRoots :: Int -> Maybe (V.Vector Double)
shiftedRadauRoots = (allShiftedRadauRoots !?)


-- | roots of shifted Jacobi polynomials with alpha=0, beta=0
allShiftedLegendreRoots :: V.Vector (V.Vector Double)
allShiftedLegendreRoots = V.fromList $ map V.fromList $ decode allShiftedLegendreRootsBinary

-- | roots of shifted Jacobi polynomials with alpha=1, beta=0
allShiftedRadauRoots :: V.Vector (V.Vector Double)
allShiftedRadauRoots = V.fromList $ map V.fromList $ decode allShiftedRadauRootsBinary
