Cómo implementar esto en Python: dada una matriz, encuentre tres números a, byc de modo que a ^ 2 + b ^ 2 = c ^ 2

Mi solución se ejecuta en ejecuciones en tiempo O (N ^ 2) y se basa en el famoso problema 3SUM:

def pythagorean_triple (nums):
nums.sort ()

para ci en reversa (xrange (2, len (nums))):
ai = 0
bi = ci – 1

mientras ai <bi:
pythagorean_sum = nums [ai] * nums [ai] + nums [bi] * nums [bi]
c_squared = nums [ci] * nums [ci]

if pythagorean_sum == c_squared:
regresar nums [ai], nums [bi], nums [ci]
elif pythagorean_sum <c_squared:
ai + = 1
más:
bi – = 1

EDITAR: El OP solicitó una explicación más exhaustiva.

El problema de 3SUM es encontrar tres números enteros a, byc en una matriz de manera que a + b + c = 0. Antes de explicar 3SUM, observe este problema.

Primero ordenamos los números. Tenga en cuenta que c siempre debe ser mayor que a y b. Por lo tanto, en la lista ordenada, c siempre estará a la derecha de a y b. Entonces, podemos iterar de derecha a izquierda para verificar cada posible c, y verificar cada posible a y b a la izquierda de la c.

Si quisiéramos, podríamos verificar todos los pares de números a y b a la izquierda de la c para ver si a ^ 2 + b ^ 2 = c ^ 2, pero eso sería lento. Podríamos hacer esto más rápido eligiendo solo ayb de modo que a esté a la izquierda de b, lo que nos permite hacer un truco especial. Supongamos que verificamos cada posible a comenzando desde el lado izquierdo y cada posible b comenzando desde el lado derecho mientras a <b. Aquí está la parte "crucial": si a ^ 2 + b ^ 2 c ^ 2, entonces b debe ser demasiado grande, para que podamos verificar con seguridad el siguiente b a la izquierda.

Esta optimización reduce el algoritmo de O (N ^ 3) a O (N ^ 2).

3SUM podría resolverse casi de la misma manera, excepto que uno verificaría si a + b + c es mayor, igual o menor que cero.

Este es el código escrito en Python 2.7.8

array = raw_input (). split ()
t = len (matriz)
numarray = [0] * t
para i en rango (t):
numarray [i] = int (matriz [i])
para i en rango (t):
para j en el rango (t):
para k en el rango (t):
if (numarray [i] ** 2) == ((numarray [j] ** 2) + (numarray [k] ** 2)):
print ‘% d% d% d’% (matriz numérica [i], matriz numérica [j], matriz numérica [k])

Aquí está su código de ejecución si desea verificar
http://ideone.com/HkG5vT