sábado, 10 de junio de 2023

Superficie en forma de silla de montar representada con GNU MAXIMA

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$

-oOo-

Utilidades:

  [1] GNU MAXIMA

jueves, 8 de junio de 2023

Algoritmo de multiplicación de dos matrices cuadradas de orden 3. Implementación en lenguaje Python

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$

-oOo-

Utilidades:

  [1] El software básico para trabajar con Python: https://www.python.org/
  [2] Un entorno de trabajo: https://thonny.org/
  [3] Un compilador en línea: https://www.tutorialspoint.com/online_python_compiler.php

miércoles, 7 de junio de 2023

Cosas que pasan cuando se empieza a trabajar con una herramienta CAS

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$

-oOo-

Utilidades:

  [1] GNU MAXIMA

Toda matriz cuadrada puede expresarse de manera única como la suma de una matriz cuadrada simétrica y una matriz cuadrada hemisimétrica

Proposición

Pruébese que siendo $Q$ cualquier matriz cuadrada de orden $n$, no nula. Entonces, es posible escribir $Q=S+H$ de manera única, donde $S$ es una matriz (no nula) simétrica ($S=S^\top$); y $H$ es una matriz (no nula) hemisimétrica ($H=-H^\top$), ambas de orden $n$.

Demostración

Al ser $S$ una matriz simétrica, podemos escribirla de la forma $S=\dfrac{1}{2}\,(Q+Q^\top) \quad (1)$, donde $Q$ es una matriz cualquiera. En efecto, al trasponer $S$, se tiene que $S^\top= \dfrac{1}{2}\,(Q+Q^\top)=\dfrac{1}{2}\,(Q^\top+Q)=S$, como debe ser.

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$

Ejemplo

Cálculos efectuados con GNU Octave (la notación prima como instrucción indica la traspuesta de una matriz)
>> 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$

martes, 6 de junio de 2023

Otra manera de obtener los números primos mayores o iguales que $2$ y menores que $1000$. Algoritmo de Eratóstenes

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$

Un ejercicio con matrices del tipo triangular inferior

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$

-oOo-

Utilidades:

  [1] GNU MAXIMA

¿Cómo saber si un número (el que primero se nos ocurra) es primo? ¿Cómo encontrar los números primos menores que un cierto número (pongamos que 1000)?

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.")

-oOo-

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$

-oOo-

Utilidades:

  [1] El software básico para trabajar con Python: https://www.python.org/
  [2] Un entorno de trabajo: https://thonny.org/
  [3] Un compilador en línea: https://www.tutorialspoint.com/online_python_compiler.php

viernes, 2 de junio de 2023

Un caso particular de matrices triangulares

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.

-oOo-

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$

Un ejercicio con matrices en el que interviene la característica del anillo al que pertenecen los elementos de las mismas

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.

-oOo-

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$

-oOo-

Referencias:

  [1] S. Xambó, Algebra lineal y geometrías lineales, volumen I, (Eunibar, Barcelona, 1977)

Evocación de los espacios proyectivos. Punto infinito

Parque de Santander, Chamberí, Madrid; 2 de junio de 2023

Evocación de los espacios afines euclídeos (con, a veces, objetos fractales huidizos)

Parque de Santander, Chamberí, Madrid; 2 de junio de 2023

jueves, 1 de junio de 2023

Un ejemplo de demostración por inducción

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:

  1. La proposición se cumple para $n=1$; en efecto, $A=A^1\overset{\mathcal{P}(1)}{=}A^n|_{n=1}=\begin{pmatrix}1&1&\dfrac{1^2+1}{2}\\0&1&1\\0&0&1\end{pmatrix}=\begin{pmatrix}1&1&1\\0&1&1\\0&0&1\end{pmatrix}$
  2. Suponemos que la proposición es cierta para $n$: $\mathcal{P}(n): A^n=\begin{pmatrix}1&n&\dfrac{n^2+n}{2}\\0&1&n\\0&0&1\end{pmatrix}$ (hipótesis de inducción)
  3. Deberemos probar ahora que la proposición también se cumple para $n+1$: $A^{n+1}=A^n\,A=\begin{pmatrix}1&n&\dfrac{n^2+n}{2}\\0&1&n\\0&0&1\end{pmatrix}\,\begin{pmatrix}1&1&1\\0&1&1\\0&0&1\end{pmatrix}=\begin{pmatrix}1&n+1&1+n+\dfrac{n^2+n}{2}\\0&1&n+1\\0&0&1\end{pmatrix}=$
    $=\begin{pmatrix}1&n+1&\dfrac{2(n+1)+n(n+1)}{2}\\0&1&n+1\\0&0&1\end{pmatrix}=\begin{pmatrix}1&n+1&\dfrac{(n+1)\left((n+1)+1\right)}{2}\\0&1&n+1\\0&0&1\end{pmatrix}=$ $=\begin{pmatrix}1&n+1&\dfrac{(n+1)^2+(n+1)}{2}\\0&1&n+1\\0&0&1\end{pmatrix}$ y por tanto queda demostrada la validez de $\mathcal{P}$ para $n+1$, $\mathcal{P}(n+1)$. $\square$
-oOo-

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$