Trigonometría (matemática): ¿Cómo puedo obtener un triple pitagórico de una hipotenusa dada (si existe)?

Para un triple pitagórico integral, es decir, [matemática] (a, b, c) [/ matemática] que satisface [matemática] a ^ 2 + b ^ 2 = c ^ 2 [/ matemática], la forma general [3] es:

  • [matemáticas] a = k \ veces (m ^ 2 – n ^ 2) [/ matemáticas]
  • [matemáticas] b = k \ veces (2 millones) [/ matemáticas]
  • [matemáticas] c = k \ veces (m ^ 2 + n ^ 2) [/ matemáticas]

Suponga que debe calcular todos los triples pitagóricos dada una sola hipotenusa c [2], un algoritmo bastante eficiente se ve así:

  1. Agotar todos los divisores k de c.
  2. Para cada k, agote n st, [math] n ^ 2 \ le \ frac {c} {k} [/ math], y resuelva para m.
  3. Si n es un número entero, agregue [math] (kn, km, c) [/ math] al resultado.

El paso 1 llevaría tiempo [matemático] O (\ sqrt {c}) [/ matemático] con un enfoque ingenuo, y esto podría acelerarse con algún procesamiento previo (por ejemplo, cuando necesita procesar muchas instancias [2]) . Y solo necesitamos hacer los pasos 2-3 para f veces, donde f es el número de factores para una c dada , que es pequeño en la práctica. Para el paso 2, lleva [math] O (\ sqrt {c}) [/ math] tiempo para k = 1, y menos para otras k ‘ s.

Complejidad del tiempo total (un límite superior bastante suelto): ~ [matemática] O (f \ sqrt {c}) [/ matemática]. Parece ser bastante rápido para [math] c \ le 10 ^ 7 [/ math]. ( f es como máximo 448, para c = 8648640, en este rango)


Si está interesado, aquí hay un pseudocódigo aproximado:

c: = Input () // Una hipotenusa entera
ListOfPairs: = [] // Almacenamiento (a, b) st, a ^ 2 + b ^ 2 = c ^ 2
Para k en Factores de (c):
s: = c / k
Para n: = 0 a Sqrt (s / 2): // Optimización local, sabemos que m> = n
mSquare = s – n ^ 2
m: = Piso ( Sqrt (mSquare))
Si m * m = mSquare:
a = m ^ 2 – n ^ 2
b = 2 nm
ListOfPairs.Push ((ka, kb))
ListOfPairs.Push ((kb, ka))
Return ListOfPairs.RemoveDuplicates ()


Observaciones:
[1] El algoritmo propuesto se verifica resolviendo un problema de codificación que requiere generar todos los triples pitagóricos dados una hipotenusa.
[2] Si necesita resolver muchas instancias a la vez con un rango de entrada conocido, tal vez recorrer en bucle ( k, n, m ) y luego generar todos los triples pitagóricos (de abajo hacia arriba) podría ser más eficiente.
[3] Para los triples pitagóricos primitivos, suelta la k de la forma general.

Tenga en cuenta que cada triple pitagórico primitivo integral se genera mediante las siguientes ecuaciones:

[matemáticas] a = m ^ 2-n ^ 2 [/ matemáticas]
[matemáticas] b = 2mn [/ matemáticas]
[matemáticas] c = m ^ 2 + n ^ 2 [/ matemáticas]

[math] a, b, c [/ math] se consideran la longitud de las dos patas y la hipotenusa respectivamente y [math] m, n [/ math] son ​​enteros arbitrarios.

Dado un cierto valor de [matemática] c [/ matemática], podemos encontrar [matemática] m, n [/ matemática] que satisface [matemática] c = m ^ 2 + n ^ 2 [/ matemática] si y solo si La parte libre de cuadrados de [matemáticas] c [/ matemáticas] es congruente con [matemáticas] 1 [/ matemáticas] mod [matemáticas] 4 [/ matemáticas] por el teorema de dos cuadrados de Fermat.

Es una tarea no trivial encontrar realmente [matemáticas] c [/ matemáticas] como la suma de dos cuadrados. Una manera simple de hacer esto es tomar la parte cuadrada de [math] c [/ math] y dividirla en números primos. Luego podemos escribir estos números primos como la suma de dos cuadrados o buscarlos en una tabla. Entonces podemos usar una identidad de Euler para escribir el producto de la suma de dos cuadrados como la suma de dos cuadrados:

[matemáticas] (a ^ 2 + b ^ 2) (c ^ 2 + d ^ 2) = (ac-bd) ^ 2 + (ad + bc) ^ 2 [/ matemáticas]

Probablemente hay formas más eficientes de encontrar [matemática] m, n [/ matemática] tal que [matemática] m ^ 2 + n ^ 2 = c [/ matemática]. En cualquier caso, una vez que se encuentran [math] m, n [/ math], podemos conectarlos a las primeras ecuaciones para encontrar [math] a, b [/ math].

Si esa explicación fue un poco densa, el siguiente ejemplo puede ayudar:

Considerar:
[matemáticas] c = 493 [/ matemáticas]
[matemáticas] 493 = 17 \ veces 29 [/ matemáticas]

[matemáticas] 17 = 4 ^ 2 + 1 ^ 2 [/ matemáticas]
[matemáticas] 29 = 2 ^ 2 + 5 ^ 2 [/ matemáticas]

[matemáticas] 17 \ veces 29 = (8-5) ^ 2 + (20 + 2) ^ 2 = 3 ^ 2 + 22 ^ 2 = 484 + 9 = 493 [/ matemáticas]

Entonces podemos decir que [matemáticas] m = 22, n = 3 [/ matemáticas]. Encontramos eso:

[matemáticas] a = 22 ^ 2-3 ^ 2 = 475 [/ matemáticas]
[matemáticas] b = 132 [/ matemáticas]

[matemática] (475,132,493) [/ matemática] es, por lo tanto, un triple pitagórico.

Confirmemos:

[matemáticas] 475 ^ 2 + 132 ^ 2 = 225625 + 17424 = 243049 = 493 ^ 2 [/ matemáticas]

Sip. Un triple pitagórico.

Por lo que sé (que, sinceramente, no es una tonelada) no puedes. Al menos no de manera determinista o metódica.

Hay muchas fórmulas que generan triples. Hay estrategias que podría emplear que reducirían el número de posibilidades, pero no le darían un método perfecto para encontrar una. Esto tiene sentido (para mí de todos modos) considerando que puede haber múltiples triples para una hipotenusa dada, o ninguno en absoluto.

¿Aún quieres probar? Aquí hay algunas opciones.

Método uno: usa una lista.

101 triples pitagóricos primitivos

Si tiene una hipotenusa que está en esta lista o es un múltiplo de una hipotenusa en esta lista, está listo para comenzar.

Método dos:
Hay algunas formas de generar triples (pero no todos los triples) que se pueden utilizar a la inversa.

(robado de Wikipedia)
Las ecuaciones

encontrará ciertos triples por cada entero positivo n. Entonces, si puede resolver c = 2n (n + 1) + 1 para n, y cualquier valor es un entero positivo, puede usarlo para encontrar sus otros dos lados.

(también robado de Wikipedia)
Las ecuaciones

funcionará tan bien si resuelve para m. Debe quedar claro que esto solo funciona si su hipotenusa es uno más que un cuadrado perfecto.

Método tres: Adivina y verifica, con algunas estrategias empleadas.

Primero, debemos eliminar tantos factores de dos como sea posible de su hipotenusa. Las hipotenusas de todos los triples primitivos (triples que no obtienes al aumentar otro triple) son extrañas. Esto debería facilitar la búsqueda del triple primitivo, y luego puede volver a escalarlo más tarde.

Ahora, toma ese número y restarlo por un cuadrado perfecto. O ab debe ser la diferencia entre su número y un cuadrado perfecto si es un triple primitivo. (Si su hipotenusa es primo, esto siempre funcionará, porque solo puede generar un triple primitivo).

Si esto no funciona, podría considerar eliminar otros factores distintos de dos y buscar triples primitivos con el método anterior.

Ninguno de estos le garantizará encontrar un triple, pero es de esperar que este sea un buen lugar para comenzar.

Dibuja un cuadrado con longitud lateral h. Tenga en cuenta que si dibuja otro cuadrado con la longitud del lado 1 adentro, con un vértice común y 2 lados superpuestos, ahora tiene algunas formas de formular el área del cuadrado grande.

H ^ 2 = (h-1) ^ 2 + 2 (h-1) +1

Entonces el conjunto que estamos buscando es
H
H-1
Cuadrado (2h-1)

Pero 2h-1 no siempre es un cuadrado perfecto. Resulta que no todas las hipotenusas pueden ser parte de un triple pitagórico perfecto. Por lo tanto, no puede comenzar con una hipotenusa y obtener un triple, puede comenzar desde un lado siempre que la longitud del lado sea impar.

Podemos decir
sqrt (2h-1) = s

Nuestro conjunto se convierte
S
(S ^ 2-1) / 2
(S ^ 2 + 1) / 2

Entonces, si s es 3, tenemos 3,4,5. Si s es 7, tenemos 7,24,25. Si s es 15, tenemos 15,112,113 y así sucesivamente.

Multiplicar cualquiera de estos conjuntos por un escalar genera otro triple pitagórico.