Tìm sức mạnh ma trận


9

Vấn đề

Tạo một chương trình hoặc hàm có thể tính kết quả của ma trận được nâng lên lũy thừa thứ n . Mã của bạn sẽ lấy một ma trận vuông A tùy ý và một số nguyên n không âm và trả về một ma trận có giá trị A n .

Những hạn chế

Các hàm tích hợp tính toán công suất ma trận và sản phẩm ma trận không được phép.

Phần còn lại của các quy tắc tiêu chuẩn cho mã golf-áp dụng.

Giải trình

Cho ma trận vuông A , giá trị của A n = AA A (tích ma trận lặp lại của A với chính nó, n lần). Nếu n là dương, tiêu chuẩn vừa đề cập được sử dụng. Khi n bằng 0, ma trận danh tính có cùng thứ tự A là kết quả.

Mục tiêu

Đây là mã golf và mã ngắn nhất sẽ thắng.

Các trường hợp thử nghiệm

Ở đây, A là ma trận đầu vào, n là số nguyên đầu vào và r là ma trận đầu ra trong đó 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
Điều gì về tích hợp cho sản phẩm ma trận hoặc đảo ngược ma trận?
Dennis

@Dennis Tôi đã xem xét việc cấm những người đó, nhưng nó cảm thấy quá hạn chế.
dặm

2
Đối với các ngôn ngữ không có nghịch đảo ma trận tích hợp, điều này đánh tôi như một thách thức của tắc kè hoa vì đảo ngược ma trận từ đầu có vẻ khó hơn nhiều so với việc lấy sản phẩm lặp.
xnor

2
Tôi đồng ý với @xnor. Và nếu một ngôn ngữ không có đảo ngược ma trận nhưng có sức mạnh ma trận thì sao? Có thể A^-1được sử dụng như là một thay thế cho inv(A)?
Luis Mendo

1
Được exp(k*log(M))phép? (Mặc dù nó có thể không hoạt động vì các nhánh không độc đáo.)
xnor

Câu trả lời:


4

Thạch , 17 16 15 byte

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

Hãy thử trực tuyến!

Permalinks với đầu ra lưới: trường hợp thử nghiệm 1 | trường hợp kiểm tra 2 | trường hợp kiểm tra 3 | trường hợp kiểm tra 4 | trường hợp thử nghiệm 5

Làm thế nào nó hoạt động

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 byte

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

Hãy thử trực tuyến!

Giải trình

Điều này tránh được phép nhân ma trận bằng cách thực hiện thủ công, sử dụng phép nhân phần tử với phát sóng theo sau là tổng hợp vector. Cụ thể, để nhân ma trận MN, cả hai kích thước s × s :

  1. Chuyển vị M. Gọi ma trận kết quả P.
  2. Hoán vị kích thước của Nnhư vậy mà Nđược "quay" với một trục quay dọc theo chiều đầu tiên, đưa ra một s × 1 × s mảng 3D, nói Q.
  3. Nhân từng phần tử của Pmỗi lần mỗi phần tử của Q, với phát sóng ngầm. Điều này có nghĩa rằng Pđược tự động sao chép s lần dọc theo chiều thứ ba, và Qđược sao chép s lần dọc theo thứ hai, để làm cho họ cả s × s × s , trước khi nhân tố khôn ngoan thực tế diễn ra.
  4. Tính tổng theo chiều thứ nhất để tạo ra mảng 1 × s × s .
  5. Bóp chiều singleton dẫn ra, để tạo ra một s × s kết quả.

Mã nhận xét:

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

Thất bại cho 0 ....
Máy

@CatsAreFluffy Cảm ơn! Đã sửa
Luis Mendo

3

APL, 32 31 ký tự

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

Đối số trái sức mạnh để nâng lên, phải đối số ma trận. Bit khó nhất (tiêu tốn nhiều dung lượng nhất) đang xây dựng ma trận danh tính cho trường hợp số mũ mong muốn là 0. Tính toán thực tế dựa trên thực tế là sản phẩm bên trong tổng quát ( .) với +×như toán hạng thực sự là sản phẩm ma trận. Điều này kết hợp với toán tử điện ("lặp lại") tạo thành thịt của dung dịch.


1: Bạn có phải là Stefano đã đánh bại Dan & Nick một byte trong trò chơi năm 2016?! 2. (1+≢⍵)↑1=> 1↑⍨1+≢⍵để lưu một byte.
Zacharý

Vâng, đó là tôi.
lstefano

2

Sage, 112 byte

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)))

Dùng thử trực tuyến

Giải trình:

Lambda bên trong ( lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A]) là một triển khai đơn giản của phép nhân ma trận. Lambda ( lambda A,n:reduce(...,[A]*n,identity_matrix(len(A)))) bên ngoài sử dụng reduceđể tính công suất ma trận bằng cách nhân ma trận lặp (sử dụng hàm nhân ma trận tự chế đã nói ở trên), với ma trận nhận dạng là giá trị ban đầu để hỗ trợ n=0.


2

Julia, 90 86 68 byte

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

Đây là hàm đệ quy chấp nhận ma trận ( Array{Int,2}) và số nguyên và trả về ma trận.

Ung dung:

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

Hãy thử trực tuyến! (bao gồm tất cả trừ trường hợp thử nghiệm cuối cùng, quá chậm đối với trang web)

Đã lưu 18 byte nhờ Dennis!


2

Python 2.7, 158 145 byte

Câu trả lời tồi tệ nhất ở đây, nhưng golf tốt nhất của tôi trong Python chưa. Ít nhất đó là niềm vui học cách làm phép nhân ma trận.

Chơi gôn

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]

Giải trình:

#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 byte

(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

Tôi đã có một phiên bản 132 byte bằng cách sử dụng reducenhưng tôi chỉ lập bản đồ athường xuyên đến nỗi nó ngắn hơn 9 byte để viết một hàm trợ giúp để làm điều đó cho tôi. Hoạt động bằng cách tạo ma trận danh tính và nhân nó với thời gian adài n. Có một số biểu thức trả về 0hoặc 1cho i == jnhưng tất cả chúng có vẻ dài 7 byte.



1

R, 49 byte

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

Hàm đệ quy cần một matrix và sức mạnh nđể nâng nó lên. Gọi đệ quy %*%, tính toán sản phẩm chấm. Giá trị ban đầu cho đệ quy là ma trận danh tính có cùng kích thước với m. Vì m %*% m = m %*% m %*% I, điều này hoạt động tốt.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.