Problème
Créez un programme ou une fonction qui peut calculer le résultat d'une matrice élevée à la n ème puissance. Votre code prendra une matrice carrée arbitraire A et un entier non négatif n , et renverra une matrice avec la valeur A n .
Restrictions
Les fonctions intégrées qui calculent la puissance matricielle et le produit matriciel ne sont pas autorisées.
Les autres règles standard du code-golf s'appliquent.
Explication
Étant donné une matrice carrée A , la valeur de A n = AA ⋯ A (produit matriciel répété de A avec lui-même, n fois). Si n est positif, la norme qui vient d'être mentionnée est utilisée. Lorsque n est zéro, la matrice d'identité avec le même ordre de A est le résultat.
Objectif
C'est le code-golf et le code le plus court l'emporte.
Cas de test
Ici, A est la matrice d'entrée, n est l'entier d'entrée et r est la matrice de sortie où 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
A^-1
être utilisé comme substitutinv(A)
?exp(k*log(M))
autorisé? (Bien que cela puisse ne pas fonctionner en raison de branches non uniques.)Réponses:
Gelée ,
171615 octetsEssayez-le en ligne!
Permaliens avec sortie réseau: cas de test 1 | cas de test 2 | cas de test 3 | cas de test 4 | cas de test 5
Comment ça fonctionne
la source
MATL , 20 octets
Essayez-le en ligne!
Explication
Cela évite la multiplication de la matrice en le faisant manuellement, en utilisant la multiplication par élément avec diffusion suivie d'une somme vectorisée. Plus précisément, pour multiplier les matrices
M
etN
, toutes deux de taille s × s :M
. Appelez la matrice résultanteP
.N
celles quiN
sont "tournées" avec un axe de rotation le long de la première dimension, donnant un tableau 3D s × 1 × s , par exempleQ
.P
fois chaque élément deQ
, avec une diffusion implicite. Cela signifie qu'ilP
est automatiquement répliqué s fois le long de la troisième dimension, etQ
est répliqué s fois le long de la seconde, pour les rendre tous les deux s × s × s , avant que la multiplication réelle par élément n'ait lieu.Code commenté:
la source
APL,
3231 caractèresArgument de gauche le pouvoir d'élever, argument de droite la matrice. Le bit le plus difficile (le plus consommateur d'espace) est la construction de la matrice d'identité pour le cas où l'exposant souhaité est 0. Le calcul réel est basé sur le fait que le produit interne généralisé (
.
) avec+
et×
comme opérandes est effectivement le produit matriciel. Ceci combiné avec l'⍣
opérateur de puissance ("répéter") forme la viande de la solution.la source
(1+≢⍵)↑1
=>1↑⍨1+≢⍵
pour enregistrer un octet.Sauge, 112 octets
Essayez-le en ligne
Explication:
La lambda intérieure (
lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A]
) est une implémentation simple de la multiplication matricielle. La lambda externe (lambda A,n:reduce(...,[A]*n,identity_matrix(len(A)))
) utilisereduce
pour calculer la puissance de la matrice par multiplication de matrice itérée (en utilisant la fonction de multiplication de matrice maison susmentionnée), avec la matrice d'identité comme valeur initiale à prendre en chargen=0
.la source
Julia,
908668 octetsIl s'agit d'une fonction récursive qui accepte une matrice (
Array{Int,2}
) et un entier et renvoie une matrice.Non golfé:
Essayez-le en ligne! (inclut tout sauf le dernier cas de test, qui est trop lent pour le site)
Enregistré 18 octets grâce à Dennis!
la source
Python 2.7,
158145 octetsLa pire réponse ici, mais mon meilleur golf en Python à ce jour. Au moins, c'était amusant d'apprendre à faire la multiplication matricielle.
Golfé:
Explication:
la source
JavaScript (ES6), 123 octets
J'avais une version de 132 octets en utilisant
reduce
mais j'étais juste en train de mappera
si souvent qu'il s'est avéré être 9 octets plus court pour écrire une fonction d'aide pour le faire pour moi. Fonctionne en créant la matrice d'identité et en la multipliant par des tempsa
longsn
. Il existe un certain nombre d'expressions qui renvoient0
ou1
pouri == j
mais elles semblent toutes faire 7 octets de long.la source
Python 3 , 147 octets
Essayez-le en ligne!
la source
R, 49 octets
Fonction récursive qui prend un
m
atrix et le pouvoirn
de l'élever. Appels récursifs%*%
, qui calculent le produit scalaire. La valeur initiale de la récursivité est la matrice d'identité de la même taille quem
. Depuism %*% m = m %*% m %*% I
, cela fonctionne très bien.la source
Python 2 , 131 octets
Essayez-le en ligne!
la source