проблема
Создайте программу или функцию, которая может вычислить результат матрицы, возведенной в n- ую степень. Ваш код возьмет произвольную квадратную матрицу A и неотрицательное целое число n и вернет матрицу со значением A n .
ограничения
Встроенные функции, которые вычисляют мощность матрицы и матричное произведение, не допускаются.
Остальные стандартные правила для code-golf применяются.
объяснение
Для данной квадратной матрицы A значение A n = AA ⋯ A (повторное матричное произведение A на себя, n раз). Если n положительно, используется только что упомянутый стандарт. Когда n равно нулю, единичная матрица с тем же порядком A является результатом.
Цель
Это код-гольф, и выигрывает самый короткий код.
Тестовые случаи
Здесь A - входная матрица, n - входное целое число, а r - выходная матрица, где 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
быть использован в качестве заменыinv(A)
?exp(k*log(M))
разрешено? (Хотя это может не сработать из-за неуникальных ветвей.)Ответы:
Желе ,
171615 байтПопробуйте онлайн!
Постоянные ссылки с выходом сетки: контрольный пример 1 | контрольный пример 2 | контрольный пример 3 | контрольный пример 4 | контрольный пример 5
Как это работает
источник
MATL , 20 байтов
Попробуйте онлайн!
объяснение
Это позволяет избежать умножения матриц, делая это вручную, используя поэлементное умножение с широковещательной передачей, за которой следует векторизованная сумма. В частности, чтобы умножить матрицы
M
иN
оба размера s × s :M
. Назовите полученную матрицуP
.N
таких, которыеN
«повернуты» с осью вращения вдоль первого измерения, давая , скажем, трехмерный массив s × 1 × sQ
.P
каждый элементQ
с неявной трансляцией. Это означает, чтоP
она автоматически реплицируется s раз по третьему измерению и sQ
повторяется по второму, чтобы сделать их s × s × s до того, как произойдет фактическое поэлементное умножение.Код комментария:
источник
APL,
3231 символЛевый аргумент - сила, которую нужно поднять, правый - матрица. Самым сложным (наиболее трудоемким) битом является построение единичной матрицы для случая, когда искомый показатель равен 0. Фактическое вычисление основано на том факте, что обобщенный внутренний продукт (
.
) с операндами+
и в×
качестве операндов фактически является продуктом матрицы. Это в сочетании с⍣
оператором питания («повторить») образует основу решения.источник
(1+≢⍵)↑1
=>1↑⍨1+≢⍵
чтобы сохранить один байт.Sage, 112 байт
Попробуйте онлайн
Объяснение:
Внутренняя лямбда (
lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A]
) является прямой реализацией умножения матриц. Внешняя лямбда (lambda A,n:reduce(...,[A]*n,identity_matrix(len(A)))
) используетreduce
для вычисления мощности матрицы с помощью повторного умножения матриц (используя вышеупомянутую функцию умножения самодельных матриц) с единичной матрицей в качестве начального значения для поддержкиn=0
.источник
Юлия,
908668 байтЭто рекурсивная функция, которая принимает матрицу (
Array{Int,2}
) и целое число и возвращает матрицу.Ungolfed:
Попробуйте онлайн! (включает все тесты, кроме последнего, что слишком медленно для сайта)
Благодаря Деннису сэкономлено 18 байт!
источник
Python 2,7,
158145 байтовХудший ответ здесь, но мой лучший гольф в Python пока. По крайней мере, было весело учиться умножению матриц.
Golfed:
Объяснение:
источник
JavaScript (ES6), 123 байта
Я использовал 132-байтовую версию,
reduce
но яa
так часто отображал ее, что оказалось на 9 байт короче, чтобы написать вспомогательную функцию, которая сделает это для меня. Работает путем создания матрицы тождественности и умножения ее наa
произвольныеn
времена. Есть несколько выражений, которые возвращают0
или1
для,i == j
но все они кажутся длиной 7 байтов.источник
Python 3 , 147 байт
Попробуйте онлайн!
источник
R, 49 байт
Рекурсивная функция, которая берет
m
атрикс и возможностьn
его поднять. Рекурсивно вызывает%*%
, который вычисляет скалярное произведение. Начальным значением для рекурсии является единичная матрица того же размера, что иm
. Так какm %*% m = m %*% m %*% I
, это работает просто отлично.источник
Python 2 , 131 байт
Попробуйте онлайн!
источник