En álgebra lineal , el algoritmo de Strassen , que lleva el nombre de Volker Strassen , es un algoritmo para la multiplicación de matrices . Es más rápido que el algoritmo estándar de multiplicación de matrices para matrices grandes, con una mejor complejidad asintótica (versus), aunque el algoritmo ingenuo suele ser mejor para matrices pequeñas. El algoritmo de Strassen es más lento que los algoritmos más rápidos conocidos para matrices extremadamente grandes, pero estos algoritmos galácticos no son útiles en la práctica, ya que son mucho más lentos para matrices de tamaño práctico. Para matrices pequeñas existen algoritmos aún más rápidos.
El algoritmo de Strassen funciona para cualquier anillo , como plus/multiply, pero no para todos los semianillos , como min-plus o el álgebra booleana , donde el algoritmo ingenuo todavía funciona, y la llamada multiplicación combinatoria de matrices .
Historia
Volker Strassen publicó por primera vez este algoritmo en 1969 y, por lo tanto, demostró que elEl algoritmo general de multiplicación de matrices no era óptimo. [ 1 ] La publicación del algoritmo de Strassen dio lugar a más investigaciones sobre la multiplicación de matrices que condujeron tanto a cotas inferiores asintóticas como a cotas superiores computacionales mejoradas.
Algoritmo

Dejar,sean dos matrices cuadradas sobre un anilloPor ejemplo, matrices cuyas entradas son números enteros o números reales. El objetivo de la multiplicación de matrices es calcular el producto de la matriz.. La siguiente exposición del algoritmo supone que todas estas matrices tienen tamaños que son potencias de dos (es decir,), pero esto solo es conceptualmente necesario, si las matrices,no son de tipoLas filas y columnas "faltantes" se pueden rellenar con ceros para obtener matrices con tamaños que son potencias de dos, aunque las implementaciones reales del algoritmo no hacen esto en la práctica.
Las particiones del algoritmo de Strassen,yen matrices de bloques de igual tamaño
conEl algoritmo ingenuo sería:
Esta construcción no reduce el número de multiplicaciones: todavía se necesitan 8 multiplicaciones de bloques de matriz para calcular elmatrices, el mismo número de multiplicaciones necesarias que cuando se utiliza la multiplicación de matrices estándar.
El algoritmo de Strassen define nuevos valores:
utilizando solo 7 multiplicaciones (una por cada) en lugar de 8. Ahora podemos expresar elen términos de:
Iteramos recursivamente este proceso de división hasta que las submatrices degeneran en números (elementos del anillo).). Si, como se mencionó anteriormente, la matriz original tenía un tamaño que no era una potencia de 2, entonces el producto resultante tendrá filas y columnas cero, al igual queyy estos serán eliminados en este punto para obtener la matriz (más pequeña)Realmente lo queríamos.
Las implementaciones prácticas del algoritmo de Strassen cambian a métodos estándar de multiplicación de matrices para submatrices suficientemente pequeñas, para las cuales esos algoritmos son más eficientes. El punto de cruce particular para el cual el algoritmo de Strassen es más eficiente depende de la implementación y el hardware específicos. Autores anteriores habían estimado que el algoritmo de Strassen es más rápido para matrices con anchos de 32 a 128 para implementaciones optimizadas. [ 2 ] Sin embargo, se ha observado que este punto de cruce ha ido aumentando en los últimos años, y un estudio de 2010 encontró que incluso un solo paso del algoritmo de Strassen a menudo no es beneficioso en las arquitecturas actuales, en comparación con una multiplicación tradicional altamente optimizada, hasta que los tamaños de matriz superan los 1000 o más, e incluso para tamaños de matriz de varios miles el beneficio suele ser marginal en el mejor de los casos (alrededor del 10% o menos). [ 3 ] Un estudio más reciente (2016) observó beneficios para matrices tan pequeñas como 512 y un beneficio de alrededor del 20%. [ 4 ]
Mejoras en el algoritmo de Strassen
Es posible reducir el número de sumas de matrices utilizando en su lugar la siguiente forma descubierta por Winograd en 1971: [ 5 ]
dónde.
Esto reduce el número de sumas y restas de matrices de 18 a 15. El número de multiplicaciones de matrices sigue siendo 7, y la complejidad asintótica es la misma. [ 6 ]
El algoritmo se optimizó aún más en 2017 utilizando una base alternativa, [ 7 ] reduciendo el número de sumas de matrices por paso bilineal a 12 mientras se mantiene el número de multiplicaciones de matrices, y de nuevo en 2023: [ 8 ]
Complejidad asintótica
El esquema del algoritmo anterior mostró que se puede prescindir de las 7 multiplicaciones de matrices tradicionales para los subbloques de la matriz, en lugar de las 8. Por otro lado, es necesario realizar sumas y restas de bloques, aunque esto no afecta la complejidad general: Sumar matrices de tamañorequiere solooperaciones mientras que la multiplicación es sustancialmente más costosa (tradicionalmenteoperaciones de suma o multiplicación).
La pregunta entonces es cuántas operaciones se necesitan exactamente para los algoritmos de Strassen, y cómo se compara esto con la multiplicación de matrices estándar que toma aproximadamente(dóndeoperaciones aritméticas, es decir, una complejidad asintótica.
El número de sumas y multiplicaciones requeridas en el algoritmo de Strassen se puede calcular de la siguiente manera: seasea el número de operaciones para unamatriz. Luego, mediante la aplicación recursiva del algoritmo de Strassen, vemos que, por alguna constanteEso depende del número de sumas realizadas en cada aplicación del algoritmo. Por lo tanto, es decir, la complejidad asintótica para multiplicar matrices de tamañousar el algoritmo de Strassen es Sin embargo, la reducción en el número de operaciones aritméticas conlleva una menor estabilidad numérica [ 9 ] , y el algoritmo también requiere mucha más memoria que el algoritmo ingenuo. Ambas matrices iniciales deben tener sus dimensiones expandidas a la siguiente potencia de 2, lo que implica almacenar hasta cuatro veces más elementos, y las siete matrices auxiliares contienen cada una una cuarta parte de los elementos de las matrices expandidas.
El algoritmo de Strassen debe compararse con la forma "ingenua" de realizar la multiplicación de matrices, que requeriría 8 multiplicaciones de subbloques en lugar de 7. Esto daría lugar a la complejidad que se espera del enfoque estándar:La comparación de estos dos algoritmos muestra que asintóticamente , el algoritmo de Strassen es más rápido: existe un tamañoDe modo que las matrices más grandes se multiplican de forma más eficiente con el algoritmo de Strassen que con el método "tradicional". Sin embargo, la afirmación asintótica no implica que el algoritmo de Strassen sea siempre más rápido, incluso para matrices pequeñas, y en la práctica esto no es así: para matrices pequeñas, el coste de las sumas adicionales de bloques de matriz supera el ahorro en el número de multiplicaciones. También existen otros factores no contemplados en el análisis anterior, como la diferencia de coste en el hardware actual entre cargar datos de la memoria a los procesadores y el coste de realizar operaciones con estos datos. Como consecuencia de estas consideraciones, el algoritmo de Strassen se suele utilizar solo en matrices "grandes". Este efecto es aún más pronunciado con algoritmos alternativos como el de Coppersmith y Winograd : aunque asintóticamente es incluso más rápido, el punto de inflexiónes tan grande que el algoritmo no se suele utilizar en matrices que se encuentran en la práctica.
Complejidad de rango o bilineal
La complejidad bilineal o rango de una aplicación bilineal es un concepto importante en la complejidad asintótica de la multiplicación de matrices. El rango de una aplicación bilineal :\mathbf {A} \times \mathbf {B} \rightarrow \mathbf {C} } sobre un campo F se define como (en cierto modo un abuso de notación )
En otras palabras, el rango de una aplicación bilineal es la longitud de su cálculo bilineal más corto. [ 10 ] La existencia del algoritmo de Strassen muestra que el rango deLa multiplicación de matrices no supera los siete términos. Para comprobarlo, expresemos este algoritmo (junto con el algoritmo estándar) como un cálculo bilineal. En el caso de las matrices, los espacios duales A * y B * consisten en aplicaciones al cuerpo F inducidas por un producto escalar doble (es decir, en este caso, la suma de todas las entradas de un producto de Hadamard ).
Se puede demostrar que el número total de multiplicaciones elementalesEl valor requerido para la multiplicación de matrices está fuertemente ligado asintóticamente al rango., es decir, o más específicamente, puesto que las constantes son conocidas,. Una propiedad útil del rango es que es submultiplicativo para productos tensoriales , y esto permite demostrar queLa multiplicación de matrices se puede realizar con no más demultiplicaciones elementales para cualquier. (Este-producto tensorial de pliegue delMapa de multiplicación de matrices consigo mismo : unLa potencia tensorial -ésima se obtiene mediante el paso recursivo del algoritmo mostrado.
Comportamiento de la caché
El algoritmo de Strassen es ajeno a la caché . El análisis de su comportamiento en la caché ha demostrado que incurre en
fallos de caché durante su ejecución, suponiendo una caché idealizada de tamaño(es decir conlíneas de longitud). [ 11 ] : 13
Consideraciones para la implementación
La descripción anterior indica que las matrices son cuadradas, su tamaño es una potencia de dos y que se debe usar relleno si es necesario. Esta restricción permite dividir las matrices por la mitad, recursivamente, hasta alcanzar el límite de la multiplicación escalar . La restricción simplifica la explicación y el análisis de la complejidad, pero en realidad no es necesaria; [ 12 ] y, de hecho, rellenar la matriz como se describe aumentará el tiempo de cálculo y puede anular fácilmente el ahorro de tiempo relativamente pequeño obtenido al usar el método inicialmente.
Una buena implementación observará lo siguiente:
- No es necesario ni deseable utilizar el algoritmo de Strassen hasta el límite de escalares. En comparación con la multiplicación de matrices convencional, el algoritmo añade un coste considerable.carga de trabajo en sumas/restas; por lo tanto, por debajo de cierto tamaño, será mejor usar la multiplicación convencional. Así, por ejemplo, unano necesita ser acolchado para, ya que podría subdividirse hastaA ese nivel se pueden utilizar matrices y la multiplicación convencional.
- El método se puede aplicar a matrices cuadradas de cualquier dimensión. [ 3 ] Si la dimensión es par, se dividen por la mitad como se describe. Si la dimensión es impar, primero se aplica un relleno de ceros de una fila y una columna. Este relleno se puede aplicar sobre la marcha y de forma diferida, y las filas y columnas adicionales se descartan a medida que se forma el resultado. Por ejemplo, supongamos que las matrices son. Se pueden dividir de manera que la parte superior izquierda quedey la parte inferior derecha es. Dondequiera que las operaciones lo requieran, dimensiones dese rellenan con ceros paraPrimero. Nótese, por ejemplo, que el productose utiliza únicamente en la fila inferior de la salida, por lo que solo se requiere que seafilas de altura; y por lo tanto el factor izquierdoutilizado para generarlo solo necesita serfilas de altura; por consiguiente, no hay necesidad de rellenar esa suma parafilas; solo es necesario rellenaracolumnas para coincidir.
Además, no es necesario que las matrices sean cuadradas. Las matrices no cuadradas se pueden dividir por la mitad utilizando los mismos métodos, obteniendo matrices no cuadradas más pequeñas. Si las matrices son suficientemente no cuadradas, valdrá la pena reducir la operación inicial a más productos cuadrados, utilizando métodos sencillos que son esencialmente , por ejemplo:
- Un producto de tamañose puede hacer como 20 separadosoperaciones, dispuestas para formar el resultado;
- Un producto de tamañose puede hacer como 10 por separadooperaciones, sumadas para formar el resultado.
Estas técnicas harán que la implementación sea más complicada, en comparación con simplemente rellenar hasta un cuadrado que sea potencia de dos; sin embargo, es razonable suponer que cualquiera que emprenda una implementación de Strassen, en lugar de la multiplicación convencional, dará mayor prioridad a la eficiencia computacional que a la simplicidad de la implementación.
En la práctica, el algoritmo de Strassen se puede implementar para lograr un mejor rendimiento que la multiplicación convencional incluso para matrices tan pequeñas como, para matrices que no son cuadradas en absoluto, y sin requerir espacio de trabajo más allá de los búferes que ya se necesitan para una multiplicación convencional de alto rendimiento. [ 4 ]
Véase también
- Complejidad computacional de las operaciones matemáticas
- Eliminación de Gauss-Jordan
- Complejidad computacional de la multiplicación de matrices
- Curva de orden Z
- Algoritmo de Karatsuba , para multiplicar enteros de n dígitos enen lugar de entiempo
- Un algoritmo de multiplicación compleja similar multiplica dos números complejos usando 3 multiplicaciones reales en lugar de 4.
- El algoritmo de Toom-Cook es una generalización más rápida del algoritmo de Karatsuba que permite la descomposición recursiva de divide y vencerás en más de 2 bloques a la vez.
Referencias
- ↑ Strassen, Volker (1969). "La eliminación gaussiana no es óptima". Numer. Math . 13 (4): 354– 356. doi : 10.1007/BF02165411 . S2CID 121656251 .
- ↑ Skiena, Steven S. (1998), "§8.2.3 Multiplicación de matrices", The Algorithm Design Manual , Berlín, Nueva York: Springer-Verlag , ISBN 978-0-387-94860-7.
- 1 2 D'Alberto, Paolo; Nicolau, Alexandru (2005). Uso de la recursión para mejorar el rendimiento de ATLAS (PDF) . Sexto Simposio Internacional sobre Computación de Alto Rendimiento.
- 1 2 Huang, Jianyu; Smith, Tyler M.; Henry, Greg M.; van de Geijn, Robert A. (13 de noviembre de 2016). El algoritmo de Strassen recargado . SC16: Conferencia internacional sobre computación de alto rendimiento, redes, almacenamiento y análisis . IEEE Press. págs. 690–701 . doi : 10.1109/SC.2016.58 . ISBN 9781467388153Consultado el 1 de noviembre de 2022 .
- ↑ Winograd, S. (octubre de 1971). "Sobre la multiplicación de matrices de 2 × 2" . Álgebra lineal y sus aplicaciones . 4 (4): 381– 388. doi : 10.1016/0024-3795(71)90009-7 .
- ↑ Knuth (1997) , pág. 500.
- ↑ Karstadt, Elaye; Schwartz, Oded (24 de julio de 2017). «Multiplicación de matrices, un poco más rápida» . Actas del 29.º Simposio ACM sobre paralelismo en algoritmos y arquitecturas . ACM. págs. 101–110 . doi : 10.1145/3087556.3087579 . ISBN 978-1-4503-4593-4.
- ↑ Schwartz, Oded; Vaknin, Noa (31 de diciembre de 2023). "Juego de pebbling y base alternativa para la multiplicación de matrices de alto rendimiento" . SIAM Journal on Scientific Computing . 45 (6): C277– C303. Bibcode : 2023SJSC...45C.277S . doi : 10.1137/22M1502719 . ISSN 1064-8275 .
- ↑ Webb, Miller (1975). "Complejidad computacional y estabilidad numérica". SIAM J. Comput . 4 (2): 97– 107. doi : 10.1137/0204009 .
- ↑ Burgués; cláusulas; Shokrollahi (1997). Teoría de la complejidad algebraica . Springer-Verlag. ISBN 3-540-60582-7.
- ↑ Frigo, M.; Leiserson, CE ; Prokop, H .; Ramachandran, S. (1999). Algoritmos ajenos a la caché (PDF) . Actas del Simposio IEEE sobre Fundamentos de la Informática (FOCS). págs. 285–297 .
- ↑ Higham, Nicholas J. (1990). "Exploiting fast matrix multiplication within the level 3 BLAS" (PDF) . ACM Transactions on Mathematical Software . 16 (4): 352– 368. doi : 10.1145/98267.98290 . hdl : 1813/6900 . S2CID 5715053 .
- Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest y Clifford Stein . Introducción a los algoritmos , segunda edición. MIT Press y McGraw-Hill, 2001. ISBN 0-262-03293-7Capítulo 28: Sección 28.2: Algoritmo de Strassen para la multiplicación de matrices, págs. 735 – 741.
- Knuth, Donald (1997). El arte de la programación informática , algoritmos seminuméricos . Vol. II (3.ª ed.). Addison-Wesley. ISBN 0-201-89684-2.
Enlaces externos
- Weisstein, Eric W. "Fórmulas de Strassen" . MundoMatemático .(También incluye fórmulas para la inversión rápida de matrices )
- Tyler J. Earnest, el algoritmo de Strassen en el motor de banda ancha celular
- Algoritmos de multiplicación de matrices
- Algoritmos de divide y vencerás