Problema
Criar um programa ou função que pode calcular o resultado de uma matriz elevada ao n º poder. Seu código utilizará uma matriz quadrada arbitrária A e um número inteiro não negativo n e retornará uma matriz com o valor A n .
Restrições
Funções internas que computam a potência da matriz e o produto da matriz não são permitidas.
O restante das regras padrão para código-golfe se aplica.
Explicação
Dada uma matriz quadrada A , o valor de A n = AA ⋯ A (produto da matriz repetida de A consigo mesmo, n vezes). Se n for positivo, o padrão mencionado acima é usado. Quando n é zero, a matriz de identidade com a mesma ordem de A é o resultado.
Objetivo
Este é o código-golfe e o código mais curto vence.
Casos de teste
Aqui, A é a matriz de entrada, n é o número inteiro de entrada er é a matriz de saída em que 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
fonte
A^-1
ser usado como substitutoinv(A)
?exp(k*log(M))
permitido? (Embora possa não funcionar por causa de ramificações não exclusivas.) #Respostas:
Geléia ,
171615 bytesExperimente online!
Permalinks com saída em grade: caso de teste 1 | caso de teste 2 | caso de teste 3 | caso de teste 4 | caso de teste 5
Como funciona
fonte
MATL , 20 bytes
Experimente online!
Explicação
Isso evita a multiplicação da matriz, fazendo-o manualmente, usando a multiplicação por elementos com broadcast seguida pela soma vetorizada. Especificamente, para multiplicar matrizes
M
eN
, ambos de tamanho s × s :M
. Chame a matriz resultanteP
.N
queN
é "girado" com um eixo de rotação ao longo da primeira dimensão, fornecendo uma matriz 3D s × 1 × s , digamosQ
.P
vezes cada elemento deQ
, com transmissão implícita. Isso significa queP
é automaticamente replicado s vezes ao longo da terceira dimensão eQ
é replicado s vezes ao longo da segunda, para torná-los ambos s × s × s , antes que ocorra a multiplicação por elementos.Código comentado:
fonte
APL,
3231 caracteresArgumento da esquerda o poder de elevar para, argumento da direita a matriz. O bit mais difícil (que consome mais espaço) é criar a matriz de identidade para o caso em que o expoente desejado é 0. O cálculo real é baseado no fato de que o produto interno generalizado (
.
) com+
e×
como operandos é efetivamente o produto da matriz. Isso combinado com o⍣
operador de energia ("repetição") forma a carne da solução.fonte
(1+≢⍵)↑1
=>1↑⍨1+≢⍵
para salvar um byte.Sábio, 112 bytes
Experimente online
Explicação:
O lambda interno (
lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A]
) é uma implementação direta da multiplicação de matrizes. O lambda externo (lambda A,n:reduce(...,[A]*n,identity_matrix(len(A)))
) usareduce
para calcular a potência da matriz por multiplicação de matriz iterada (usando a função de multiplicação de matriz caseira mencionada acima), com a matriz de identidade como o valor inicial a ser suportadon=0
.fonte
Julia,
908668 bytesEsta é uma função recursiva que aceita uma matriz (
Array{Int,2}
) e um número inteiro e retorna uma matriz.Ungolfed:
Experimente online! (inclui todos, exceto o último caso de teste, que é muito lento para o site)
Economizou 18 bytes graças a Dennis!
fonte
Python 2.7,
158145 bytesA pior resposta aqui, mas o meu melhor golfe em Python ainda. Pelo menos foi divertido aprender a fazer multiplicação de matrizes.
Golfe:
Explicação:
fonte
JavaScript (ES6), 123 bytes
Eu tinha uma versão de 132 bytes em uso,
reduce
mas estava apenas mapeando coma
tanta frequência que acabou sendo 9 bytes mais curto para escrever uma função auxiliar para fazer isso por mim. Funciona criando a matriz identidade e multiplicando-o pora
longhandn
vezes. Há várias expressões que retornam0
ou1
para,i == j
mas todas parecem ter 7 bytes de comprimento.fonte
Python 3 , 147 bytes
Experimente online!
fonte
R, 49 bytes
Função recursiva que leva um
m
atrix e o podern
de elevá-lo. Chamadas recursivamente%*%
, que calculam o produto escalar. O valor inicial da recursão é a matriz de identidade do mesmo tamanho quem
. Desde entãom %*% m = m %*% m %*% I
, isso funciona muito bem.fonte
Python 2 , 131 bytes
Experimente online!
fonte