module I1M.PolOperaciones
( module I1M.Pol
, creaTermino
, termLider
, sumaPol
, multPorTerm
, multPol
, polUnidad
, valor
, esRaiz
, derivada
, restaPol
) where
import I1M.Pol
creaTermino :: (Num t, Eq t) => Int -> t -> Polinomio t
creaTermino :: Int -> t -> Polinomio t
creaTermino Int
n t
a = Int -> t -> Polinomio t -> Polinomio t
forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol Int
n t
a Polinomio t
forall a. Polinomio a
polCero
termLider :: (Num t, Eq t) => Polinomio t -> Polinomio t
termLider :: Polinomio t -> Polinomio t
termLider Polinomio t
p = Int -> t -> Polinomio t
forall t. (Num t, Eq t) => Int -> t -> Polinomio t
creaTermino (Polinomio t -> Int
forall a. Polinomio a -> Int
grado Polinomio t
p) (Polinomio t -> t
forall t. Num t => Polinomio t -> t
coefLider Polinomio t
p)
sumaPol :: (Num a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a
sumaPol :: Polinomio a -> Polinomio a -> Polinomio a
sumaPol Polinomio a
p Polinomio a
q
| Polinomio a -> Bool
forall a. Polinomio a -> Bool
esPolCero Polinomio a
p = Polinomio a
q
| Polinomio a -> Bool
forall a. Polinomio a -> Bool
esPolCero Polinomio a
q = Polinomio a
p
| Int
n1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
n2 = Int -> a -> Polinomio a -> Polinomio a
forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol Int
n1 a
a1 (Polinomio a -> Polinomio a -> Polinomio a
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
sumaPol Polinomio a
r1 Polinomio a
q)
| Int
n1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n2 = Int -> a -> Polinomio a -> Polinomio a
forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol Int
n2 a
a2 (Polinomio a -> Polinomio a -> Polinomio a
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
sumaPol Polinomio a
p Polinomio a
r2)
| Bool
otherwise = Int -> a -> Polinomio a -> Polinomio a
forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol Int
n1 (a
a1a -> a -> a
forall a. Num a => a -> a -> a
+a
a2) (Polinomio a -> Polinomio a -> Polinomio a
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
sumaPol Polinomio a
r1 Polinomio a
r2)
where n1 :: Int
n1 = Polinomio a -> Int
forall a. Polinomio a -> Int
grado Polinomio a
p
a1 :: a
a1 = Polinomio a -> a
forall t. Num t => Polinomio t -> t
coefLider Polinomio a
p
r1 :: Polinomio a
r1 = Polinomio a -> Polinomio a
forall t. Polinomio t -> Polinomio t
restoPol Polinomio a
p
n2 :: Int
n2 = Polinomio a -> Int
forall a. Polinomio a -> Int
grado Polinomio a
q
a2 :: a
a2 = Polinomio a -> a
forall t. Num t => Polinomio t -> t
coefLider Polinomio a
q
r2 :: Polinomio a
r2 = Polinomio a -> Polinomio a
forall t. Polinomio t -> Polinomio t
restoPol Polinomio a
q
multPorTerm :: (Num t, Eq t) => Polinomio t -> Polinomio t -> Polinomio t
multPorTerm :: Polinomio t -> Polinomio t -> Polinomio t
multPorTerm Polinomio t
term Polinomio t
pol
| Polinomio t -> Bool
forall a. Polinomio a -> Bool
esPolCero Polinomio t
pol = Polinomio t
forall a. Polinomio a
polCero
| Bool
otherwise = Int -> t -> Polinomio t -> Polinomio t
forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
m) (t
at -> t -> t
forall a. Num a => a -> a -> a
*t
b) (Polinomio t -> Polinomio t -> Polinomio t
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
multPorTerm Polinomio t
term Polinomio t
r)
where n :: Int
n = Polinomio t -> Int
forall a. Polinomio a -> Int
grado Polinomio t
term
a :: t
a = Polinomio t -> t
forall t. Num t => Polinomio t -> t
coefLider Polinomio t
term
m :: Int
m = Polinomio t -> Int
forall a. Polinomio a -> Int
grado Polinomio t
pol
b :: t
b = Polinomio t -> t
forall t. Num t => Polinomio t -> t
coefLider Polinomio t
pol
r :: Polinomio t
r = Polinomio t -> Polinomio t
forall t. Polinomio t -> Polinomio t
restoPol Polinomio t
pol
multPol :: (Num a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a
multPol :: Polinomio a -> Polinomio a -> Polinomio a
multPol Polinomio a
p Polinomio a
q
| Polinomio a -> Bool
forall a. Polinomio a -> Bool
esPolCero Polinomio a
p = Polinomio a
forall a. Polinomio a
polCero
| Bool
otherwise = Polinomio a -> Polinomio a -> Polinomio a
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
sumaPol (Polinomio a -> Polinomio a -> Polinomio a
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
multPorTerm (Polinomio a -> Polinomio a
forall t. (Num t, Eq t) => Polinomio t -> Polinomio t
termLider Polinomio a
p) Polinomio a
q)
(Polinomio a -> Polinomio a -> Polinomio a
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
multPol (Polinomio a -> Polinomio a
forall t. Polinomio t -> Polinomio t
restoPol Polinomio a
p) Polinomio a
q)
polUnidad:: (Num t, Eq t) => Polinomio t
polUnidad :: Polinomio t
polUnidad = Int -> t -> Polinomio t -> Polinomio t
forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol Int
0 t
1 Polinomio t
forall a. Polinomio a
polCero
valor :: (Num a, Eq a) => Polinomio a -> a -> a
valor :: Polinomio a -> a -> a
valor Polinomio a
p a
c
| Polinomio a -> Bool
forall a. Polinomio a -> Bool
esPolCero Polinomio a
p = a
0
| Bool
otherwise = a
ba -> a -> a
forall a. Num a => a -> a -> a
*a
ca -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^Int
n a -> a -> a
forall a. Num a => a -> a -> a
+ Polinomio a -> a -> a
forall a. (Num a, Eq a) => Polinomio a -> a -> a
valor Polinomio a
r a
c
where n :: Int
n = Polinomio a -> Int
forall a. Polinomio a -> Int
grado Polinomio a
p
b :: a
b = Polinomio a -> a
forall t. Num t => Polinomio t -> t
coefLider Polinomio a
p
r :: Polinomio a
r = Polinomio a -> Polinomio a
forall t. Polinomio t -> Polinomio t
restoPol Polinomio a
p
esRaiz :: (Num a, Eq a) => a -> Polinomio a -> Bool
esRaiz :: a -> Polinomio a -> Bool
esRaiz a
c Polinomio a
p = Polinomio a -> a -> a
forall a. (Num a, Eq a) => Polinomio a -> a -> a
valor Polinomio a
p a
c a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0
derivada :: (Eq a, Num a) => Polinomio a -> Polinomio a
derivada :: Polinomio a -> Polinomio a
derivada Polinomio a
p
| Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Polinomio a
forall a. Polinomio a
polCero
| Bool
otherwise = Int -> a -> Polinomio a -> Polinomio a
forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) (a
b a -> a -> a
forall a. Num a => a -> a -> a
* Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) (Polinomio a -> Polinomio a
forall a. (Eq a, Num a) => Polinomio a -> Polinomio a
derivada Polinomio a
r)
where n :: Int
n = Polinomio a -> Int
forall a. Polinomio a -> Int
grado Polinomio a
p
b :: a
b = Polinomio a -> a
forall t. Num t => Polinomio t -> t
coefLider Polinomio a
p
r :: Polinomio a
r = Polinomio a -> Polinomio a
forall t. Polinomio t -> Polinomio t
restoPol Polinomio a
p
restaPol :: (Num a, Eq a) => Polinomio a -> Polinomio a -> Polinomio a
restaPol :: Polinomio a -> Polinomio a -> Polinomio a
restaPol Polinomio a
p Polinomio a
q =
Polinomio a -> Polinomio a -> Polinomio a
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
sumaPol Polinomio a
p (Polinomio a -> Polinomio a -> Polinomio a
forall a.
(Num a, Eq a) =>
Polinomio a -> Polinomio a -> Polinomio a
multPorTerm (Int -> a -> Polinomio a
forall t. (Num t, Eq t) => Int -> t -> Polinomio t
creaTermino Int
0 (-a
1)) Polinomio a
q)