Знайдіть потужність матриці


9

Проблема

Створіть програму або функцію, яка може обчислити результат матриці, піднятої до n- ї потужності. Ваш код візьме довільну квадратну матрицю A і невід'ємне ціле число n і поверне матрицю зі значенням A n .

Обмеження

Вбудовані функції, які обчислюють потужність матриці та матричний добуток, не допускаються.

Решта стандартних правил для коду-гольфу застосовуються.

Пояснення

Враховуючи квадратну матрицю A , значення A n = AA ⋯ A (повторне матричне добуток A з самим собою, n разів). Якщо n позитивний, використовується щойно згаданий стандарт. При п дорівнює нулю, то матриця з тим же порядку А є результатом.

Мета

Це код-гольф і виграє найкоротший код.

Випробування

Тут 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

3
Що з вбудованими для матричного продукту чи інверсії матриці?
Денніс

@Dennis Я також розглядав питання про заборону, але це було занадто обмежено.
милі

2
Для мов без вбудованої інверсії матриці це вважає мені проблемою хамелеона, оскільки перевернути матрицю з нуля здається набагато важче, ніж взяти ітераційний продукт.
xnor

2
Я згоден з @xnor. А що, якщо мова не має інверсії матриці, але має потужність матриці? Чи A^-1можна використовувати як заміну inv(A)?
Луїс Мендо

1
Чи exp(k*log(M))дозволено? (Хоча це може не працювати через не унікальні гілки.)
xnor

Відповіді:


4

Желе , 17 16 15 байт

Z×'³S€€
LṬ€z0Ç¡

Спробуйте в Інтернеті!

Постійні посилання з вихідною сіткою: тестовий випадок 1 | тестовий випадок 2 | тестовий випадок 3 | тестовий випадок 4 | тестовий випадок 5

Як це працює

LṬ€z0Ç¡  Main link. Arguments: A (matrix), n (power)

L        Get the length l of A.
 Ṭ€      Turn each k in [1, ..., l] into a Boolean list [0, 0, ..., 1] of length k.
   z0    Zip; transpose the resulting 2D list, padding with 0 for rectangularity.
         This constructs the identity matrix of dimensions k×k.
     Ç¡  Execute the helper link n times.

Z×'³S€€  Helper link. Argument: B (matrix)

Z        Zip; transpose rows and columns of B.
   ³     Yield A.
 ×'      Spawned multiplication; element-wise mutiply each rows of zipped B (i.e.,
         each column of B) with each row of A.
         This is "backwards", but multiplication of powers of A is commutative.
    S€€  Compute the sum of each product of rows.

5

MATL , 20 байт

XJZyXyi:"!J2$1!*s1$e

Спробуйте в Інтернеті!

Пояснення

Це дозволяє уникнути множення матриці, роблячи це вручну, використовуючи мультиплікаційне множення за допомогою трансляції з подальшою векторною сумою. Зокрема, для множення матриць Mта Nобох розмірів s × s :

  1. Перенести M. Виклик отриманої матриці P.
  2. Перестановіть розміри Nтаких, які N"повернуті" осі обертання вздовж першого виміру, даючи 3D × масив s × 1 × s , скажімо Q.
  3. Помножте кожен елемент на Pраз кожного елемента Q, з неявним мовленням. Це означає, що Pавтоматично реплікується s разів вздовж третього виміру, і Qповторюється s разів уздовж другого, щоб зробити їх обома s × s × s , перш ніж відбудеться фактичне множення, що відповідає елементу.
  4. Підсумовуйте уздовж першого виміру, щоб отримати масив 1 × s × s .
  5. Видавіть провідний однотонний розмір, щоб отримати результат s × s .

Коментований код:

XJ      % take matrix A. Copy to clipboard J
ZyXy    % generate identity matrix of the same size
i:      % take exponent n. Generate range [1 2 ... n] (possibly empty)
"       % for each element in that range
  !     %   transpose matrix with product accumulated up to now (this is step 1)
  J     %   paste A
  2$1!  %   permute dimensions: rotation along first-dimension axis (step 2)
  *     %   element-wise multiplication with broadcast (step 3)
  s     %   sum along first dimension (step 4)
  1$e   %   squeeze out singleton dimension, i.e. first dimension (step 5)
        % end for. Display

Не виходить за 0 ....
CalculatorFeline

@CatsAreFluffy Дякую! Виправлено
Луїс Мендо

3

APL, 32 31 символів

{⍺=0:(⍴⍵)⍴1⍨1+≢⍵⋄+.×⍨⍣(⍺-1)⊣⍵}

Зліва аргументуйте силу для підняття, праву аргументуйте матрицю. Найскладніший (найбільш затратний на місце) біт - це побудова матриці ідентичності для випадку, коли бажаний показник дорівнює 0. Фактичне обчислення базується на тому, що узагальнений внутрішній продукт ( .) з операндами +і ×як його ефективно є матричним твором. Це в поєднанні з оператором живлення ("повторити") утворює м'ясо розчину.


1: Ви СТЕФАНО, який побив Дана та Ніка одним байтом у грі 2016 року ?! 2. (1+≢⍵)↑1=> 1↑⍨1+≢⍵зберегти один байт.
Zacharý

Так, це я.
lstefano

2

Шавлія, 112 байт

lambda A,n:reduce(lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A],[A]*n,identity_matrix(len(A)))

Спробуйте в Інтернеті

Пояснення:

Внутрішня лямбда ( 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.


2

Юлія, 90 86 68 байт

f(A,n)=n<1?eye(A):[A[i,:][:]⋅f(A,n-1)[:,j]for i=m=1:size(A,1),j=m]

Це рекурсивна функція, яка приймає матрицю ( Array{Int,2}) і ціле число і повертає матрицю.

Безголівки:

function f(A, n)
    if n < 1
        # Identity matrix with the same type and dimensions as the input
        eye(A)
    else
        # Compute the dot product of the ith row of A and the jth column
        # of f called on A with n decremented
        [dot(A[i,:][:], f(A, n-1)[:,j]) for i = (m = 1:size(A,1)), j = m]
    end
end

Спробуйте в Інтернеті! (включає всі, крім останнього тестового випадку, який занадто повільний для сайту)

Збережено 18 байт завдяки Деннісу!


2

Python 2.7, 158 145 байт

Найгірша відповідь тут, але мій найкращий гольф на Python поки. Принаймні, це було весело, навчаючись робити матричне множення.

Гольф:

def q(m,p):
 r=range(len(m))
 if p<1:return[[x==y for x in r]for y in r]
 o=q(m,p-1)
 return[[sum([m[c][y]*o[x][c]for c in r])for y in r]for x in r]

Пояснення:

#accepts 2 arguments, matrix, and power to raise to
def power(matrix,exponent):
 #get the range object beforehand
 length=range(len(matrix))
 #if we are at 0, return the identity
 if exponent<1:
  #the Boolean statement works because Python supports multiplying ints by bools
  return [[x==y for x in length] for y in length]
 #otherwise, recur
 lower=power(matrix,exponent-1)
 #and return the product
 return [[sum([matrix[c][y]*lower[x][c] for c in length]) for y in length] for x in length]

1

JavaScript (ES6), 123 байти

(n,a)=>[...Array(n)].map(_=>r=m(i=>m(j=>m(k=>s+=a[i][k]*r[k][j],s=0)&&s)),m=g=>a.map((_,n)=>g(n)),r=m(i=>m(j=>+!(i^j))))&&r

У мене була 132-байтна версія, reduceале я просто відображала aтак часто, що виявилося на 9 байт коротше, щоб написати допоміжну функцію для мене. Працює, створюючи матрицю ідентичності та aмножуючи її на довгі nрази. Існує ряд виразів, які повертаються 0або 1для, i == jале всі вони здаються довжиною 7 байт.



1

R, 49 байт

f=function(m,n)`if`(n,m%*%f(m,n-1),diag(nrow(m)))

Рекурсивна функція, яка займає mатрикс і потужність, nщоб підняти її. Рекурсивно викликає %*%, який обчислює крапковий продукт. Початкове значення для рекурсії - матриця ідентичності такого ж розміру, що і m. Оскільки m %*% m = m %*% m %*% Iце працює просто чудово.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.