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
RRPodemos 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
RR, 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.
RLa 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"
RPara 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
REl 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
RPara 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
RLas 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
PythonPythonPodemos definir números complejos de diferentes formas:
z1 = 4+3j z1
(4+3j)
z2 = complex(1,7) z2
(1+7j)
PythonPython, 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.
PythonLa 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'>
PythonPara 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
PythonEl conjugado de un número complejo se obtiene mediante .conjugate():
z1.conjugate()
(4-3j)
z2.conjugate()
(1-7j)
PythonPara 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
PythonLas 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
OctaveOctavePodemos 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.
OctavePara 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.
OctaveEl 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().
OctaveLas 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)\)
RRNecesitaremos 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
RPara 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
RUna 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
RLas 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
RLa 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
RPara evaluar polinomios, utilizaremos la función predict(polinomio,x0)
predict(p,1)
[1] 15
predict(q,0)
[1] 1
RPara 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
PythonPythonPara 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')
PythonO 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
PythonPara 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.
PythonPythonPara calcular el grado de cualquier polinomio en Python, lo haremos utilizando Polynomial.degree()
p.degree()
2
q.degree()
3
Pythono, 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
PythonLas 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')
Pythony, 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])
PythonLa 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
PythonPara 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
PythonPara 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])
OctaveOctavePara 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
OctaveUna 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
OctaveComo, 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
OctaveUna 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
OctaveLo 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
OctaveLa 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
OctaveFijaos 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
OctavePara 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
OctavePara 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\)