Problema
Crear un programa o función que puede calcular el resultado de una matriz elevada a la n º potencia. Su código tomará una matriz cuadrada arbitraria A y un número entero no negativo n , y devolverá una matriz con el valor A n .
Restricciones
Las funciones incorporadas que calculan la potencia de la matriz y el producto de la matriz no están permitidas.
Se aplica el resto de las reglas estándar para el código de golf.
Explicación
Dada una matriz cuadrada A , el valor de A n = AA ⋯ A (producto matricial repetido de A consigo mismo, n veces). Si n es positivo, se utiliza el estándar que se acaba de mencionar. Cuando n es cero, la matriz de identidad con el mismo orden de A es el resultado.
Objetivo
Este es el código de golf y gana el código más corto.
Casos de prueba
Aquí, A es la matriz de entrada, n es el entero de entrada y r es la matriz de salida donde r = A n .
n = 0
A = 62 72
10 34
r = 1 0
0 1
n = 1
A = 23 61 47
81 11 60
42 9 0
r = 23 61 47
81 11 60
42 9 0
n = 2
A = 12 28 -26 3
-3 -10 -13 0
25 41 3 -4
-20 -14 -4 29
r = -650 -1052 -766 227
-331 -517 169 43
332 469 -1158 -53
-878 -990 574 797
n = 4
A = -42 -19 18 -38
-33 26 -13 31
-43 25 -48 28
34 -26 19 -48
r = -14606833 3168904 -6745178 4491946
1559282 3713073 -4130758 7251116
8097114 5970846 -5242241 12543582
-5844034 -4491274 4274336 -9196467
n = 5
A = 7 0 -3 8 -5 6 -6
6 7 1 2 6 -3 2
7 8 0 0 -8 5 2
3 0 1 2 4 -3 4
2 4 -1 -7 -4 -1 -8
-3 8 -9 -2 7 -4 -8
-4 -5 -1 0 5 5 -1
r = 39557 24398 -75256 131769 50575 14153 -7324
182127 19109 3586 115176 -23305 9493 -44754
146840 31906 -23476 190418 -38946 65494 26468
42010 -21876 41060 -13950 -55148 19290 -406
44130 34244 -35944 34272 22917 -39987 -54864
1111 40810 -92324 35831 215711 -117849 -75038
-70219 8803 -61496 6116 45247 50166 2109
fuente
A^-1
puede utilizar como sustituto deinv(A)
?exp(k*log(M))
permitido? (Aunque podría no funcionar debido a ramas no únicas.)Respuestas:
Jalea ,
171615 bytesPruébalo en línea!
Permalinks con salida de red: caso de prueba 1 | caso de prueba 2 | caso de prueba 3 | caso de prueba 4 | caso de prueba 5
Cómo funciona
fuente
MATL , 20 bytes
Pruébalo en línea!
Explicación
Esto evita la multiplicación de la matriz haciéndola manualmente, usando la multiplicación por elementos con difusión seguida de la suma vectorizada. Específicamente, para multiplicar matrices
M
yN
, ambas de tamaño s × s :M
. Llama a la matriz resultanteP
.N
tal queN
se "gira" con un eje de rotación a lo largo de la primera dimensión, dando una matriz 3D s × 1 × s , digamosQ
.P
veces cada elemento deQ
, con difusión implícita. Esto significa queP
se replica automáticamente s veces a lo largo de la tercera dimensión, yQ
se replica s veces a lo largo de la segunda, para hacer que ambos sean s × s × s , antes de que tenga lugar la multiplicación real por elementos.Código comentado:
fuente
APL,
3231 caracteresArgumento a la izquierda, el poder para elevar, argumento a la derecha, la matriz. El bit más difícil (que consume más espacio) es construir la matriz de identidad para el caso en el que el exponente deseado es 0. El cálculo real se basa en el hecho de que el producto interno generalizado (
.
) con+
y×
como operandos es efectivamente el producto de la matriz. Esto combinado con el⍣
operador de potencia ("repetir") forma la carne de la solución.fuente
(1+≢⍵)↑1
=>1↑⍨1+≢⍵
para guardar un byte.Salvia, 112 bytes
Pruébalo en línea
Explicación:
El lambda interno (
lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A]
) es una implementación sencilla de la multiplicación de matrices. El lambda externo (lambda A,n:reduce(...,[A]*n,identity_matrix(len(A)))
) se usareduce
para calcular la potencia de la matriz mediante la multiplicación matricial iterada (utilizando la función de multiplicación matricial casera mencionada anteriormente), con la matriz de identidad como valor inicial para soportarn=0
.fuente
Julia,
908668 bytesEsta es una función recursiva que acepta una matriz (
Array{Int,2}
) y un entero y devuelve una matriz.Sin golf:
Pruébalo en línea! (incluye todos menos el último caso de prueba, que es demasiado lento para el sitio)
¡Ahorró 18 bytes gracias a Dennis!
fuente
Python 2.7,
158145bytesLa peor respuesta aquí, pero mi mejor golf en Python todavía. Al menos fue divertido aprender a multiplicar matrices.
Golfizado:
Explicación:
fuente
JavaScript (ES6), 123 bytes
Tenía una versión de 132 bytes,
reduce
pero solo estaba mapeando cona
tanta frecuencia que resultó ser 9 bytes más corto para escribir una función auxiliar que lo hiciera por mí. Funciona creando la matriz de identidad y multiplicándola por tiemposa
largosn
. Hay varias expresiones que devuelven0
o1
parai == j
pero todas parecen tener 7 bytes de longitud.fuente
Python 3 , 147 bytes
Pruébalo en línea!
fuente
R, 49 bytes
Función recursiva que toma un
m
atrix y el podern
para elevarlo. Llamadas recurrentes%*%
, que calculan el producto punto. El valor inicial de la recursión es la matriz de identidad del mismo tamaño quem
. Desde entoncesm %*% m = m %*% m %*% I
, esto funciona bien.fuente
Python 2 , 131 bytes
Pruébalo en línea!
fuente