Representemos la función de dos variables reales: $f(x,y)=-x^2+y^2$ para comprobar que tiene la forma anunciada en el título de la entrada:
(%i19) plot3d(-x^2 + y^2, [x, -3, 3], [y,-2,2],[legend, false]);
$\diamond$
Representemos la función de dos variables reales: $f(x,y)=-x^2+y^2$ para comprobar que tiene la forma anunciada en el título de la entrada:
(%i19) plot3d(-x^2 + y^2, [x, -3, 3], [y,-2,2],[legend, false]);
$\diamond$
ENUNCIADO. Sean dos matrices cuadradas de orden $3$: $A=(a_{ij})_{3 \times 3}$ y $B=(b_{ij})_{3 \times 3}$. Sabemos que el producto $A\,B$, viene dado por $\displaystyle A\,B=(c_{ij})_{3 \times 3}=\sum_{k=1}^{3} a_{ik}\cdot b_{kj}$ para $i=1,2,3$ y $j=1,2,3$. Escríbase un programa en Python para multiplicar dos de esas matrices, elegidas libremente.
SOLUCIÓN
def multiplicar_matrices(A, B): C = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] for i in range(3): for j in range(3): for k in range(3): C[i][j] += A[i][k] * B[k][j] return C # Ejemplo de matrices de orden 3 A = [[1, 0, -1], [2, 1, 3], [-2, 0, -1]] B = [[4, 1, 0], [5, -5, 0], [3, 2, 1]] # Llamada a la función para multiplicar las matrices C = multiplicar_matrices(A, B) # Imprimir el resultado C for fila in C: print(fila)
Puesta en marcha del programa y resultado:
>>> %Run multiplicardosmatricesdeorden3.py [1, -1, -1] [22, 3, 3] [-11, -4, -1]$\diamond$
Un ejemplo con GNU MAXIMA:
(%i1) /* Habiendo asignado un valor concreto a la variable x ...*/ x:3$ (%i2) /* Quiero calcular, a continuación, la derivada de una función, de variable x, por ejemplo ... */ diff(x^2+x+1,x); /* y me encuentro con el siguiente problema: MAXIMA nos dice ... */ diff: second argument must be a variable; found 3 -- an error. To debug this try: debugmode(true); (%i3) /* Para solucionarlo (no hace falta entrar en el modo depuración de código), basta con borrar la asignación de valor que, en un principio había realizado a la variable */ kill(x)$ (%i4) /* Ahora sí podré obtener la derivada ...*/ diff(x^2+x+1,x); (%o4) 2*x+1$\diamond$
Y al ser $H$ una matriz hemisimétrica, podemos escribirla de la forma $H=\dfrac{1}{2}\,(Q-Q^\top) \quad (2)$, donde, igual que antes, $Q$ es una matriz cualquiera. En efecto, al trasponer $H$, se tiene que $H^\top= \dfrac{1}{2}\,(Q-Q^\top)=\dfrac{1}{2}\,(Q^\top-Q)=-\dfrac{1}{2}\,(Q-Q^\top)=-H$, como debe ser.
De lo arriba dicho se sigue que, sumando miembro a miembro, las igualdades (1) y (2), se tiene que $S+H=\dfrac{1}{2}\,(Q+Q^\top)+\dfrac{1}{2}\,(Q-Q^\top)=\dfrac{1}{2}\,(Q+Q+Q^\top-Q^\top)=\dfrac{1}{2}\cdot 2\,Q=Q$.
Veamos ahora que dicha descomposición $Q=S+H$ es única. Empecemos suponiendo lo contrario, entonces existe una matriz simétrica $S'\neq S$ y una matriz hemisimétrica $H'\neq H$ tales que $Q$ también puede expresarse como $Q=S'+H'$, entonces $Q=S+H=S'+H'$, y, por tanto, $(S+H)^\top=(S'+H')^\top$, esto es, $S^\top+H^\top=S'^\top+H'^\top$, y de ahí se sigue que $S-H=S'-H'$, luego $S-S'=H-H' \Leftrightarrow S-S'=H-H'=O$ (matriz nula), con lo cual $S=S'$ y $H=H'$, en contra de la hipótesis de partida.$\square$
>> Q=[1,2,3;-1,0,2;2,1,1] Q = 1 2 3 -1 0 2 2 1 1 >> S=(Q+Q')/2 S = 1.0000 0.5000 2.5000 0.5000 0 1.5000 2.5000 1.5000 1.0000 >> H=(Q-Q')/2 H = 0 1.5000 0.5000 -1.5000 0 0.5000 -0.5000 -0.5000 0 >> S+H ans = 1 2 3 -1 0 2 2 1 1$\diamond$
Obtención de los números primos mayores o iguales que $2$ y menores que $1000$ implementado el algoritmo de la criba de Eratóstenes, escribiendo el programa correspondiente en lenguaje Python:
def criba_eratostenes(n): # Inicializar una lista de booleanos de tamaño n+1 # donde cada elemento se considera inicialmente primo primes = [True] * (n + 1) primes[0] = primes[1] = False # 0 y 1 no son primos p = 2 while p * p <= n: # Si primes[p] es verdadero, entonces es primo if primes[p]: # Actualizamos todos los múltiplos de p como no primos for i in range(p * p, n + 1, p): primes[i] = False p += 1 # Recopilamos todos los números primos en una lista prime_numbers = [num for num, is_prime in enumerate(primes) if is_prime] return prime_numbers # Encontramos los números primos entre 2 y 1000 primes = criba_eratostenes(1000) # Imprimimos los números primos encontrados print("Números primos entre 2 y 1000:") print(primes)
Ponemos en marcha el programa:
Resultado:
  >>> %Run cribadeeratostenes.py
Y se obtiene el resultado:
Números primos entre 2 y 1000:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
$\diamond$
ENUNCIADO. Sean $a,b,c,d$ números reales, la matriz triangular inferior $A=\begin{pmatrix}a&0\\ b&a\end{pmatrix}$ no nula y la matriz triangular inferior $B=\begin{pmatrix}c&0\\ d&c\end{pmatrix}$ no nula (nótese que los elementos de las diagonales principales son tales que $A_{11}=A_{22}=a$ y $B_{11}=B_{22}=c$). Compruébese que, así definidas, las matrices $A$ y $B$ conmutan.
SOLUCIÓN. Los cálculos simbólicos los he realizado con ayuda de la herramienta CAS, GNU MAXIMA [1]
(%i28) A:matrix( [a,0],[b,a] ); /* Defino una matriz genérica A */ (%o28) matrix( [a, 0], [b, a] ) (%i29) B:matrix( [c,0],[d,c] ); /* Defino una matriz genérica B */ (%o29) matrix( [c, 0], [d, c] ) (%i30) is(A.B=B.A); /* Compruebo si conmutan. Nótese que en MAXIMA es necesario usar el punto bajo (.) para la multiplicación de matrices en lugar del punto elevado (·), pues éste multiplica elemento a elemnto; tal cosa da lugar a muchas confusiones */ (%o30) true /* en efecto, así es */ (%i31) A.B; /* Observo el por qué */ (%o31) matrix( [a*c, 0], [a*d+b*c, a*c] ) (%i32) B.A; (%o32) matrix( [a*c, 0], [a*d+b*c, a*c] ) (%i33) A.B-B.A; (%o33) matrix( [0, 0], [0, 0] )$\diamond$
Aquí tenéis un algoritmo básico y el código del programa correspondiente en lenguaje Python [1]
def es_primo(numero): if numero < 2: return False for i in range(2, int(numero ** 0.5) + 1): if numero % i == 0: return False return True # Ejemplo de uso: numero = int(input("Ingrese un número: ")) if es_primo(numero): print(numero, "es un número primo.") else: print(numero, "no es un número primo.")
Y para encontrar los números primos mayores o iguales que $2$ y menores que $1000$, podéis escribir y hacer funcionar el siguiente programa en vuestro intérprete de Python (los hay que podéis utilizar en línea, sin instalar software de desarrollo en vuestro ordenador como, por ejemplo, éste [3]: https://www.tutorialspoint.com/online_python_compiler.php):
def es_primo(numero): if numero < 2: return False #la búsqueda acaba en la raíz cuadrada del número introducido más una unidad for i in range(2, int(numero ** 0.5) + 1): if numero % i == 0: return False return True primos = [] for num in range(2, 1001): if es_primo(num): primos.append(num) print("Números primos hasta 1000:") print(primos)
Al poner en marcha el programa, a cuyo archivo le he dado el nombre de numerosprimos.py,
>>> %Run numerosprimos.py
Nota: el símbolo >>> indica el prompt de la cónsola de vuestro entorno de desarrollo (fuera de línea, he utilizado el IDE Thonny [2] (habiendo instalado préviamente Python [1]), que es software libre, y es de fácil uso)
Podéis comprobar que se obtiene (rápidamente, en pocos segundos) ...
Números primos hasta 1000:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
>>>
$\diamond$
El buen manejo de las propiedades de los determinantes facilita la resolución de muchos problemas, que, en un primer vistazo, parencen complicados. Ved, por ejemplo, el siguiente:
Sean $A_{n \times n}=\begin{pmatrix}0 & 1 & &&\\ & 0 & 1 && \\ && \ddots & \ddots && \\& && 0 & 1 \\ & && & 0 \end{pmatrix}$ (ceros en la diagonal principal y unos en la segunda diagonal superior, siendo nulos el resto de los elementos) y $B_{n \times n}=\begin{pmatrix}0 & & &&\\ 1 & 0 & && \\ & 1 & 0 & & \\ & & \ddots & \ddots & \\ \\ & & & 1 & 0 \end{pmatrix}$ (ceros en la diagonal principal y unos en la segunda diagonal inferior, siendo nulos el resto de los elmentos)
Demuéstrese que los determinantes $\text{det}(AB)$ y $\text{det}(BA)$ son ambos nulos.
Recordemos la siguiente propiedad de los determinantes: $\text{det}(AB)=\text{det}(A)\cdot \text{det}(B)=\text{det}(B)\cdot \text{det}(A)=\text{det}(BA)$ . Sabemos que el determinante de una matriz triangular, ya sea ésta triangular superior o bien triangular inferior, es igual al producto de los elementos de su diagonal principal; entonces, como $A$ es una matriz triangular superior, y $B$ es una matriz triangular inferior, ambas con ceros en la diagonal principal, se tiene que $\text{det}(A)=0$ y $\text{det}(B)=0$; por consiguiente, y teniendo en cuenta la propiedad referida acerca del determinante del producto de matrices, concluimos que $\text{det}(AB)=0\cdot 0=0$ y $\text{det}(BA)=0\cdot 0=0$. $\diamond$
En [1] (e. 8, p. 15) me he encontrado con el siguiente problema propuesto, que voy a resolver a continuación.
Se considera el anillo de las matrices cuadradas de orden $n\ge 3$ sobre un cuerpo $(\mathbb{K},+,.)$, $\mathcal{M}_{n}(\mathbb{K})$, con las operaciones suma y producto de matrices
Sean $A_{n \times n}=\begin{pmatrix}0 & 1 & &&\\ & 0 & 1 && \\ && \ddots & \ddots && \\& && 0 & 1 \\ & && & 0 \end{pmatrix}$ (ceros en la diagonal principal y unos en la segunda diagonal superior, siendo nulos el resto de los elmentos) y $B_{n \times n}=\begin{pmatrix}0 & & &&\\ 1 & 0 & && \\ & 2 & 0 & & \\ & & \ddots & \ddots & \\ \\ & & & n-1 & 0 \end{pmatrix}$ (ceros en la diagonal principal y los números de la secuencia aritmética $1,2,\ldots,n-1$ en la segunda diagonal inferior, siendo nulos el resto de los elmentos)
Demuéstres que para que se cumpla la igualdad $AB-BA=I$ ($I$ denota la matriz identidad de orden $n$) es necesario que la característica $c$ del anillo $\mathbb{K}$ ha de ser igual al orden, $n$, de dichas matrices.
Recordemos que la característica, $c$, de un anillo $\mathbb{K}$ (el cuerpo al que pertenecen los elementos de las matrices, tiene también estructura de anillo) se define como el menor entero no negativo, $c$, tal que $1_{\mathbb{K}}+\overset{\underbrace{c}}{\ldots}+1_{\mathbb{K}}=0_{\mathbb{K}}$; se demuestra que dicho número es primo, y, en caso de que no exista, entonces, se toma $c=0$.
Para ver cómo es la matriz que resulta de hacer la operación del primer miembro de la igualda propuesta, ensayamos $n=3$, y es fácil ver que (omito los cálculos tediosos) resulta $AB-BA=\begin{pmatrix}1 & 0 & 0\\ 0 & 1 & 0 \\ 0 & 0 & 1-3 \end{pmatrix}$; para $n=4$, $AB-BA=\begin{pmatrix}1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1-4 \end{pmatrix}$; para $n=5$, $AB-BA=\begin{pmatrix}1 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 1-5 \end{pmatrix}$. De lo cual, se induce que para un $n\ge 3$ genérico, $AB-BA= \begin{pmatrix}1 & && & & \\ & 1 & & & \\ && \ddots && \\ &&&& 1-n\end{pmatrix}$ (matriz diagonal)
De ahí se sigue que dicha matriz $AB-BA$ es la matriz identidad, $I$, si el orden de las matrices es igual a la característica del anillo $\mathbb{K}$; esto es, si $n=c$, ya que, en tal caso $c:=1_{\mathbb{K}}+\overset{\underbrace{n}}{\ldots}+1_{\mathbb{K}}=n\cdot1_{\mathbb{K}}=0_{\mathbb{K}}=0$, y, por consiguiente, $1-n=1-0=1$. $\diamond$
ENUNCIADO. Siendo $A=\begin{pmatrix}1&1&1\\0&1&1\\0&0&1\end{pmatrix}$, demuéstrese la siguiente proposición $$\mathcal{P}:\begin{pmatrix}1&1&1\\0&1&1\\0&0&1\end{pmatrix}^n=\begin{pmatrix}1&n&\dfrac{n^2+n}{2}\\0&1&n\\0&0&1\end{pmatrix}\quad \text{para} \quad \mathbb{N} \ni n\ge 1$$
SOLUCIÓN. Utilizaremos el métode de demostración por inducción, y por tanto seguiremos los siguientes pasos:
Una vez probada la proposición, calculemos una potencia de la matriz, por ejemplo, $\begin{pmatrix}1&1&1\\0&1&1\\0&0&1\end{pmatrix}^{20}$. Entonces, $\begin{pmatrix}1&1&1\\0&1&1\\0&0&1\end{pmatrix}^{20}\overset{\mathcal{P}(n=20)}{=}\begin{pmatrix}1&20&\dfrac{20^2+20}{2}\\0&1&20\\0&0&1\end{pmatrix}=\begin{pmatrix}1&20&210\\0&1&20\\0&0&1\end{pmatrix}$
$\diamond$