Ejemplo 1
Algunos de los cuerpos más conocidos son:
Ejemplo 2
Los números naturales, \(\mathbb{N}:=\{0,1,2,...\}\), no son un cuerpo. No hay elementos opuestos para ningún elemento del conjunto.
Entremos un poquito más en detalle en este cuerpo tan interesante:
La forma binómica aparece al definir la unidad imaginaria, \(i\):
Entonces, si \(z=(a,b)\), tenemos que \[z=(a,b)=(a,0)+(0,b)=(a,0)+(b,0)\cdot(0,1)=a+bi\]
Los números complejos se suelen representar en un plano, denominado
R
R
Podemos definir números complejos de diferentes formas:
z1 = 2+1i #Definimos el complejo en forma binómica z1
[1] 2+1i
z2 = complex(real = 2, imaginary = -1) #Definimos mediante parte real e imaginaria z2
[1] 2-1i
z3 = complex(modulus = 2, argument = pi) #Definimos mediante módulo y argumento z3
[1] -2+0i
R
R
, donde \(a\) puede ser cualquier número real, lo tenemos que hacer del siguiente modo: a+1i
o a-1i
, ya que si no la consola nos devolverá error.
R
La función typeof()
es útil a la hora de comprobar el tipo de dato con el que estamos trabajando:
typeof(z1)
[1] "complex"
typeof(z2)
[1] "complex"
typeof(z3)
[1] "complex"
R
Para obtener la parte real y la parte imaginaria de cualquier número complejo, utilizamos, respectivamente, las funciones Re()
e Im()
:
#Parte Real Re(z1)
[1] 2
#Parte Imaginaria Im(z3)
[1] 2.449294e-16
R
El conjugado de un número complejo se obtiene mediante la función Conj()
:
Conj(z1)
[1] 2-1i
Conj(z2)
[1] 2+1i
Conj(z3)
[1] -2-0i
R
Para obtener el módulo y el argumento (principal) de cualquier número complejo, utilizamos, respectivamente, las funciones Mod()
y Arg()
:
#Módulo Mod(z2)
[1] 2.236068
#Argumento principal Arg(z3)
[1] 3.141593
R
Las operaciones básicas con números complejos se realizan del siguiente modo:
z1+z2 #Suma de números complejos
[1] 4+0i
3*z3 #Producto por un escalar
[1] -6+0i
z2*z3 #Producto de números complejos
[1] -4+2i
Python
en MarkdownPython
en MarkdownEn primer lugar, tendréis que instalar el paquete de R
llamado reticulate
del siguiente modo:
install.packages("reticulate")
Si en algúm momento necesitáis instalar una librería de Python
en Rstudio
, se debe ejecutar la siguiente función:
py_install("NombreDelPaquete")
Python
en MarkdownPara poder utilizar Python
en un Markdown, en el chunk de ajustes deberéis añadir las instrucciones que se muestran a continuación
library(reticulate)
use_python("/anaconda3/bin/python3")
La primera para cargar la librería reticulate
y la segunda para ubicar donde está Python
en nuestro ordenador
Python
Python
Podemos definir números complejos de diferentes formas:
z1 = 4+3j z1
(4+3j)
z2 = complex(1,7) z2
(1+7j)
Python
Python
, donde \(a\) puede ser cualquier número real, lo tenemos que hacer del siguiente modo: a+ji
o a-ji
, ya que si no la consola nos devolverá error.
Python
La función type()
es útil a la hora de comprobar el tipo de dato con el que estamos trabajando:
type(z1)
<class 'complex'>
type(z2)
<class 'complex'>
Python
Para obtener la parte real y la parte imaginaria de cualquier número complejo, utilizamos, .real
y .imag
z1.real #Parte real
4.0
z2.imag #Parte imaginaria
7.0
Python
El conjugado de un número complejo se obtiene mediante .conjugate()
:
z1.conjugate()
(4-3j)
z2.conjugate()
(1-7j)
Python
Para obtener el módulo y el argumento (principal) de cualquier número complejo, utilizamos, respectivamente, las funciones abs()
y cmath.phase()
:
import cmath abs(z1)
5.0
cmath.phase(z2)
1.4288992721907328
Python
Las operaciones básicas con números complejos se realizan del siguiente modo:
z1+z2 #Suma de numeros complejos
(5+10j)
5*z2 #Producto por un escalar
(5+35j)
z1*z2 #Producto de numeros complejos
(-17+31j)
Octave
en MarkdownOctave
en MarkdownPara poder utilizar Octave
en Markdown deberéis introducir en el chunk de ajustes el siguiente código:
knitr::opts_chunk$set(echo = TRUE, engine.path = list( octave = '/Applications/Octave-4.4.1.app/Contents/Resources/usr/bin/octave'))
Lo que está entre comillas es la dirección donde se encuentra el lenguaje Octave
en nuestro ordenador
Octave
, tendréis que introducir las variables cada vez. Es decir, no se guarda la información de un chunk a otro
Octave
Octave
Podemos definir números complejos de diferentes formas:
z1 = complex(1,2) z2 = 2-i tipoDato1 = class(z1) tipoDato2 = class(z2)
z1 = 1 + 2i z2 = 2 - 1i tipoDato1 = double tipoDato2 = double
La función class()
es útil a la hora de comprobar el tipo de dato con el que estamos trabajando.
Octave
Para obtener la parte real y la parte imaginaria de cualquier número complejo, utilizamos, respectivamente, las funciones real()
e imag()
z1 = complex(1,2); z2 = 2-i; real(z1) imag(z2)
ans = 1 ans = -1
Octave
trata cada chunk por separado.
Octave
El conjugado de un número complejo se obtiene mediante la función conj()
:
z1 = complex(1,2); z2 = 2-i; conj(z1) abs(z2) arg(z1) angle(z2)
ans = 1 - 2i ans = 2.2361 ans = 1.1071 ans = -0.46365
Para obtener el módulo y el argumento (principal) de cualquier número complejo, utilizamos, respectivamente, las funciones abs()
y arg()
o angle()
.
Octave
Las operaciones básicas con números complejos se realizan del siguiente modo:
z1 = complex(1,2); z2 = 2-i; #Suma de numeros complejos z1+z2 # Producto por un escalar 8*z2 # Producto de numeros complejos z1*z2
ans = 3 + 1i ans = 16 - 8i ans = 4 + 3i
Sea \(\mathbb{K}\) un cuerpo cualquiera
Ejemplo 3
Ejemplo 4
\(p(x)=5\) es un polinomio constante
Ejemplo 5
Sean \(p(x) = x+1\) y \(q(x) = x-1\). Entonces,
Con estas operaciones el conjunto \(\mathbb{K}[x]\) presenta una serie de propiedades importantes que no permiten decir que es un cuerpo. La condición de cuerpo que nos falla aquí es únicamente que no existe elemento inverso para todo elemento de \(\mathbb{K}[x]\). De hecho, los únicos elementos que tienen inverso son los polinomios constantes y diferentes de 0.
donde el grado de \(r(x)\) es siempre menor que el del divisor \(s(x)\)
Ejemplo 6
\(p(x) = 1+x^2\in\mathbb{R}[x]\) es irreducible ya que no puede escribirse de forma \(r(x)s(x)\) con \(r(x),s(x)\in\mathbb{R}[x]\), \(r(x),s(x)\ne p(x)\) y \(r(x),s(x)\ne 1\).
En cambio, \(q(x)=1-x^2\) no es irreducible, ya que \(q(x)=(1-x)(1+x)\)
Dado un polinomio \(p(x)\in\mathbb{K}[x]\), podemos asociar a \(p(x)\) una aplicación o función \(\mathbb{K}\longrightarrow\mathbb{K}\) definida de la manera siguiente: a cada elemento \(\alpha\in\mathbb{K}\) le hacemos corresponder \(p(\alpha)=a_0+a_1\alpha+\cdots+a_n\alpha^n\). Esta función es conocida como
En el caso en que \(\mathbb{K}\) sea un cuerpo infinito, podemos identificar polinomio con función asociada.
De aquí deducimos que si un polinomio de \(\mathbb{K}[x]\) de grado mayor que 1 tiene una raíz (en \(\mathbb{K}\)) entonces no es irreducible. El recíproco no es cierto.
Demostración
Primero probaremos la implicación hacia la izquierda, \(p(x)=(x-\alpha)q(x)\) con \(q(x)\in\mathbb{K}[x]\Rightarrow\)\(\alpha\in\mathbb{K}\) es raíz de \(p(x)\)
Evaluando \(p(x)\) en \(\alpha\) tenemos que \[p(\alpha)=(\alpha-\alpha)q(\alpha) = 0\] lo que, por definición, implica que \(\alpha\) es raíz de \(p(x)\)
Ahora nos queda demostrar la implicación a la derecha \(\alpha\in\mathbb{K}\) es raíz de \(p(x)\) \(\Rightarrow\) \(p(x)=(x-\alpha)q(x)\) con \(q(x)\in\mathbb{K}[x]\)
Si dividimos \(p(x)\) entre \(x-\alpha\), obtenemos \[p(x) = (x-\alpha)q(x)+r(x)\]
Ahora, por hipótesis tenemos que \[p(\alpha) = (\alpha-\alpha)q(\alpha)+r(\alpha) = 0 +r(\alpha) = 0\]
Con lo cual \(r(\alpha) = 0\)
Ahora bien, el grado de \(r(x)\) debe ser estrictamente menor al del divisor, \(x-\alpha\), que es 1. Por tanto, \(r(x)\) es un polinomio constante. Además, como \(r(\alpha) =0\), tenemos que \[r(x)\equiv 0\]
Así pues, acabamos de demostrar que \(p(x) = (x-\alpha)q(x)\)
R
R
Necesitaremos instalar y cargar los paquetes polynom
y pracma
para poder utilizar las siguientes funciones.
Para definir un polinomio en R
, lo haremos mediante la función polynomial(coef=...)
e igualaremos el parámetro coef
al vector de coeficientes en orden ascendente.
p = polynomial(coef = c(1,2,3,4,5)) p
1 + 2*x + 3*x^2 + 4*x^3 + 5*x^4
q = polynomial(coef = c(1,2,1)) q
1 + 2*x + x^2
R
Para comprobar si dos polinomios son iguales, utilizamos el operador lógico ==
p == q
[1] FALSE
Claramente son diferentes, porque, tal y como los hemos definido anteriormente, ni siquiera tienen el mismo grado
R
Una forma de calcular el grado de un polinomio en R
es mediante la función length()
aplicada al polinomio. Eso sí, teniendo en cuenta que, tal y como hemos definido los polinomios, \(p(x)=a_0+\cdots+a_nx^n\), estos empiezan en 0. Con lo cual, para obtener el grado exacto del polinomio, habrá que restar una unidad al resultado que nos devuelva length()
:
gradoP = length(p)-1 gradoQ = length(q)-1 gradoP
[1] 4
gradoQ
[1] 2
R
Las operaciones suma y producto de polinomios, se llevan a cabo del siguiente modo:
#Suma p+q
2 + 4*x + 4*x^2 + 4*x^3 + 5*x^4
#Producto de polinomios p*q
1 + 4*x + 8*x^2 + 12*x^3 + 16*x^4 + 14*x^5 + 5*x^6
R
La divisióin de polinomios se realiza mediante /
, pero con ello solo obtenemos el cociente. Para obtener el resto hay que utlizar %%
:
cociente = p / q resto = p%%q cociente
10 - 6*x + 5*x^2
resto
-9 - 12*x
q*cociente + resto == p
[1] TRUE
R
Para evaluar polinomios, utilizaremos la función predict(polinomio,x0)
predict(p,1)
[1] 15
predict(q,0)
[1] 1
R
Para hallar las raíces de un polinomio, podemos utilizar la función polyroot
introduciendo por parámetro el vector de coeficientes en orden creciente.
#Las raíces del polinomio x^2+2x+1 polyroot(c(1,2,1))
[1] -1-0i -1+0i
#Las raíces del polinomio x^2-4 polyroot(c(-4,0,1))
[1] 2+0i -2+0i
Fijaos que R
nos devuelve un vector de números complejos a pesar de que las soluciones en ambos casos son dos números reales
Python
Python
Para definir un polinomio en Python
, lo haremos mediante las funciones sympy.symbols()
para indicar con qué variable trabajamos y sympy.Poly()
introduciendo el polinomio por parámetro:
import sympy x = sympy.symbols('x') p = sympy.Poly(x**2) p
Poly(x**2, x, domain='ZZ')
q = sympy.Poly(1+x+x**3) q
Poly(x**3 + x + 1, x, domain='ZZ')
Python
O bien, otra forma de definir polinomios es mediante la librería numpy
, introduciendo como parámetro el vector de coeficientes en orden descendente
import numpy r = numpy.poly1d([1,2,1]) print(r)
2 1 x + 2 x + 1
s = numpy.poly1d([1,2,3,4,5]) print(s)
4 3 2 1 x + 2 x + 3 x + 4 x + 5
Python
Para comprobar si dos polinomios son iguales, utilizamos el operador lógico ==
p == q
False
r == s
False
Claramente son diferentes, porque, tal y como los hemos definido anteriormente, ni siquiera tienen el mismo grado.
Python
Python
Para calcular el grado de cualquier polinomio en Python
, lo haremos utilizando Polynomial.degree()
p.degree()
2
q.degree()
3
Python
o, si estamos trabajando con la librería numpy
, lo hacemos mediante la función Polynomial.order
r = numpy.poly1d([1,2,1]) s = numpy.poly1d([1,2,3,4,5]) r.order
2
s.order
4
Python
Las operaciones suma y producto de polinomios, se llevan a cabo del siguiente modo:
p+q
Poly(x**3 + x**2 + x + 1, x, domain='ZZ')
p*q
Poly(x**5 + x**3 + x**2, x, domain='ZZ')
Python
y, con la librería numpy
, la suma y el producto de polinomios se realizan del siguiente modo:
r = numpy.poly1d([1,2,1]) s = numpy.poly1d([1,2,3,4,5]) r+s
poly1d([1, 2, 4, 6, 6])
r*s
poly1d([ 1, 4, 8, 12, 16, 14, 5])
Python
La división de polinomios la obtenemos tal y como se muestra a continuación (solo utilizando la librería numpy
):
r = numpy.poly1d([1,2,1]) s = numpy.poly1d([1,2,3,4,5]) s/r
(poly1d([1., 0., 2.]), poly1d([3.]))
r*numpy.poly1d([1,0,2])+3 == s
True
Observad que primero se devuelve el cociente y, a continuación, el resto de la división
Python
Para evaluar polinomios, haciendo uso de la librería numpy
, lo hacemos del siguiente modo:
r = numpy.poly1d([1,2,1]) s = numpy.poly1d([1,2,3,4,5]) r(0)
1
s(2)
57
Python
Para encontrar las raíces de polinomios, haciendo uso de la librería numpy
, lo hacemos utilizando Polynomial.r
:
r = numpy.poly1d([1,2,1]) s = numpy.poly1d([1,2,3,4,5]) r.r
array([-1., -1.])
s.r
array([-1.28781548+0.85789676j, -1.28781548-0.85789676j, 0.28781548+1.41609308j, 0.28781548-1.41609308j])
Octave
Octave
Para definir un polinomio en Octave
, lo haremos mediante vectores. Para mostrarlos simbólicamente, utilizaremos la función polyout(vector,'variable')
, donde las entradas del vector son los coeficientes en orden descendente.
p = [1,2,3,4,5]; polyout(p,'x') q = [1,0,0,1]; polyout(q,'x')
1*x^4 + 2*x^3 + 3*x^2 + 4*x^1 + 5 1*x^3 + 0*x^2 + 0*x^1 + 1
Octave
Una forma de calcular el grado de un polinomio en Octave
es mediante la función length()
aplicada al vector de coeficientes. Eso sí, teniendo en cuenta que, tal y como hemos definido los polinomios, \(p(x)=a_0+\cdots+a_nx^n\), estos empiezan en 0. Con lo cual, para obtener el grado exacto del polinomio, habrá que restar una unidad al resultado que nos devuelva length()
:
p = [1,2,3,4,5]; q = [1,0,0,1]; gradoP = length(p)-1 gradoQ = length(q)-1
gradoP = 4 gradoQ = 3
Octave
Como, en Octave
, los polinomios vienen representados por vectores, sumar polinomios no es una operación directa en Octave
, ya que la mayoría de veces nos encontraremos con vectores de diferente longitud. En esos casos, se nos devolverá error por consola.
Lo mismo ocurre si quisiésemos comprobar que dos polinomios de diferente grado son iguales
Octave
Una solución a este problema es rellenar con 0 el vector de coeficientes hasta alcanzar la máxima longitud de los vectores que tengamos. Esto lo podemos conseguir mediante la función zeros()
:
p = [1,2,3,4,5]; q = [1,0,0,1]; gradoP = length(p)-1; gradoQ = length(q)-1; p = [zeros(1, gradoQ-gradoP), p], q = [zeros(1, gradoP-gradoQ), q], suma = p+q
p = 1 2 3 4 5 q = 0 1 0 0 1 suma = 1 3 3 4 6
Octave
Lo que sí podemos hacer es multiplicar polinomios mediante la función conv
p = [1,2,3,4,5]; q = [1,0,0,1]; producto = conv(p,q); polyout(producto,'x')
1*x^7 + 2*x^6 + 3*x^5 + 5*x^4 + 7*x^3 + 3*x^2 + 4*x^1 + 5
Octave
La división de polinomios se consigue mediante la función deconv(numerador,denominador)
. Esta función devuelve los vecotres de coeficientes del cociente y el resto de la división polinómica, en orden descendente:
p = [1,2,3,4,5]; q = [1,0,0,1]; [cociente, resto] = deconv(p,q)
cociente = 1 2 resto = 0 0 3 3 3
Octave
Fijaos que el vector de coeficientes del resto tiene la misma longitud que el dividendo, con lo cual podemos realizar la comprobación de la división:
p = [1,2,3,4,5]; q = [1,0,0,1]; [cociente, resto] = deconv(p,q); length(resto) == length(p) p == conv(q,cociente) + resto
ans = 1 ans = 1 1 1 1 1
donde los unos representan el valor lógico True
Octave
Para evaluar polinomios, utilizamos la función polyval(polinomio,x0)
:
p = [1,2,3,4,5]; q = [1,0,0,1]; polyval(p,0) polyval(q,3)
ans = 5 ans = 28
Octave
Para hallar las raíces de un polinomio, hacemos uso de la función roots()
:
p = [1,2,3,4,5]; q = [1,0,1]; roots(p) roots(q)
ans = 0.28782 + 1.41609i 0.28782 - 1.41609i -1.28782 + 0.85790i -1.28782 - 0.85790i ans = -0 + 1i 0 - 1i
entonces \(P(n)\) es cierta para todo \(n\in\mathbb{N}\)
El principio de Inducción también es válido si \(n\in\mathbb{Z}\) del siguiente modo:
Si \(P(n)\) es una propiedad sobre \(n\in\mathbb{Z}\), con \(n_0\in\mathbb{Z}\) y se cumple que
entonces \(P(n)\) es cierta para todo \(n\in\mathbb{Z},\ n\ge n_0\)
entonces \(P(n)\) es cierta para todo \(n\in\mathbb{N}\)
El principio de Inducción completa también es válido si \(n\in\mathbb{Z}\) del siguiente modo:
Si \(P(n)\) es una propiedad sobre \(n\in\mathbb{Z}\), \(n_0\in\mathbb{Z}\) y se cumple que
entonces \(P(n)\) es cierta para todo \(n\in\mathbb{Z}\ n\ge n_0\)