martes, 17 de enero de 2017

VBA: Ternas Pitagóricas en Excel

Todos más o menos conocemos el Teorema de Pitágoras, si no es así, puedes leer algo m´sa en la Wikipedia o ver este post del blog
En esta entrada en concreto hablaremos de la generación de Ternas Pitagóricas que, según indica nuestra referencia Wikipedia es:
Una terna pitagórica consiste en una tupla de tres enteros positivos a, b, c que cumplen que a² + b² = c². El nombre deriva del teorema de Pitágoras, el cual plantea que en cualquier triángulo rectángulo, se cumple que x² + y² = z² (siendo x e y las longitudes enteras de sus catetos y z la de la hipotenusa).
En sentido contrario también se cumple, o sea, cualquier terna pitagórica se puede asociar con las longitudes de dos catetos y una hipotenusa, formando un triángulo rectángulo.


En definitiva se trata de conseguir números enteros que conformen un triángulo rectángulo perfecto y que verifique el famoso teorema.

Uno de los métodos que se explican en ese artículo es el descrito por el autor Dario Lanni: "Teorema de Generación de terna pitagóricas de números primos", el cual se incluyo en un Tratado sobre Sextales, material que se publicó con motivo de su presentación al XXXII Coloquio de Matemáticos del Perú (ver algo más sobre el autor).

Si nos basamos en ese teorema, y siguiendo las descripciones que aparecen en Wikipedia, podremos generar ternas pitagóricas primas irreductibles (es decir primas entre si y con cateto menor primo). En la que el cateto mayor, la hipotenusa, el área, el perímetro e incluso las funciones trigonométricas de un triangulo rectángulo de lados enteros, solamente dependen del CATETO MENOR: El cateto mayor es la semi diferencia del cuadrado del cateto menor menos uno. La hipotenusa es igual al cateto mayor mas uno. El área de dicho triángulo es la suma de tres consecutivos dividido entre cuatro donde el término del medio es el cateto menor; y mas curiosamente resulta el cálculo del perímetro de dicho triangulo que es igual simplemente al producto del cateto menor por su consecutivo superior. Con esto se consiguen infinitas ternas primas de la forma mas simple y sencilla.
a2 + b2 = h2 Teorema de Pitágoras

Para todo "a" primo se cumple:
a cateto menor
b = (a2-1)/2 cateto mayor
h = (a2+1)/2 hipotenusa


Sobre esta base es la que trabajaremos nuestra macro en Excel.
A partir del desarrollo para la obtención de números primos expuesto en este post ampliaremos, con el teorema de Lanni, y listaremos unas ternas pitagóricas primas irreductibles.


En la ventana de código de nuestra módulo estándar incluimos el siguiente procedimiento:

Sub Ternas_Pitagoricas()
Dim x As Integer, y As Integer
Dim contador As Integer, divisores As Integer
Dim Primos() As Long
'un número primo es un número natural mayor que 1 que tiene únicamente dos divisores distintos:
'él mismo y el 1.

'Contador para insertar el valor en las celdas
contador = 1

ReDim Primos(1 To 25) As Long
'recorremos del 2 al 100
'ya que el 1 no se considera primo
For x = 2 To 100
    'reiniciamos el número de divisores de x
    divisores = 0
    For y = 2 To 100
        'si el resto del cociente es cero es que es divisor
        If (x Mod y = 0) Then
            'incrementamos el contador
            divisores = divisores + 1
        End If
    Next y
    'si hemos encontrado un solo divisor entonces es primo
    'el resto de número tendrá al menos uno (>=1)
    'en todos los casos además de por el uno!!
    If divisores = 1 Then
        'llevamos el número a la Array...
        Primos(contador) = x
        contador = contador + 1
    End If
Next x

'Método LANNI
' a2 + b2 = h2      Teorema de Pitágoras
' a                 cateto menor
' b = a^{2}-1/2     cateto mayor
' h = a^{2}+1/2     hipotenusa

'Generamos los valores para ver la secuencia de ternas pitagóricas (y su comprobación)
zzz = 1
For elto = 1 To UBound(Primos)
    If Primos(elto) > 2 Then
        b = (-1 + Primos(elto) ^ 2) / 2     'cateto mayor
        h = (1 + Primos(elto) ^ 2) / 2      'hipotenusa
        Cells(zzz, "A").Value = "Terna " & zzz
        Cells(zzz, "B").Value = Primos(elto)    'cateto menor (el número primo)
        Cells(zzz, "C").Value = b               'cateto mayor
        Cells(zzz, "D").Value = h               'la hipotenusa
        'la comprobación
        Cells(zzz, "F").Value = Primos(elto) ^ 2 + b ^ 2
        Cells(zzz, "G").Value = h ^ 2

        zzz = zzz + 1
    End If
Next elto

End Sub



Al lanzar la macro obtenemos lo siguiente:

VBA: Ternas Pitagóricas en Excel



Comprobando como se cumplen los requisitos de las ternas...

Entiéndase que con este artículo solo pretendo ver cómo Excel se puede aplicar a diferentes entornos, y que en ningún caso intento entrar en discusiones teóricas de modelos, teoremas, etc. fuera de mi competencia.

1 comentario: