Phép nhân chuỗi lũy thừa và lũy thừa


13

Nếu tôi có hai ma trận và , có kích thước lần lượt là và và muốn tính toán , thì việc viết lại biểu thức thành sẽ hiệu quả hơn và chỉ sau đó đánh giá bằng số, vì có kích thước nhưng có kích thước .B 1000 × 2 2 × 1000 ( A B ) 5000 A ( B A ) 4999 B A B 1000 × 1000 B A 2 × 2AB1000×22×1000(AB)5000A(BA)4999BAB1000×1000BA2×2

Tôi muốn giải quyết một phiên bản tổng quát của vấn đề này. Có một thuật toán hợp lý hiệu quả (không phải vũ lực) để tối ưu hóa một biểu thức có chứa:

  • Biến ma trận miễn phí của kích thước đã biết
  • Sản phẩm của subexpression tùy ý
  • Sự phụ thuộc tùy tiện được nâng lên thành sức mạnh tự nhiên

... để mất ít công sức nhất để đánh giá bằng số, sau khi thay thế các biến ma trận tự do bằng các giá trị ma trận cụ thể?

Các ma trận chuỗi nhân vấn đề là một trường hợp đặc biệt của vấn đề của tôi.


Biên tập:

Đây là một câu trả lời dự kiến. Nó có vẻ trực giác với tôi, nhưng tôi không có bằng chứng nào cho thấy nó đúng. Nếu nó trở thành chính xác, tôi vẫn quan tâm đến bằng chứng. (Nếu nó không đúng, tất nhiên, xin vui lòng sửa cho tôi.)

Đối với mọi sản phẩm được nâng lên thành một quyền lực, giả sử, , hãy xem xét mọi hoán vị theo chu kỳ của các yếu tố:(A1A2Ak)n

  • (A1A2Ak)n
  • A1(A2AkA1)n1A2Ak
  • A1A2(A3AkA1A2)n1A3Ak
  • ...
  • A1A2Ak1(AkA1A2Ak1)n1Ak

... đệ quy. Mỗi công suất sẽ được tính bằng cách sử dụng lũy ​​thừa bằng bình phương (rõ ràng) và tất cả các sản phẩm khác sẽ được tính bằng cách sử dụng thứ tự tối ưu được trả về bởi thuật toán nhân chuỗi ma trận.


Biên tập:

Ý tưởng được nêu trong chỉnh sửa trước đây của tôi vẫn còn hơi tối ưu. Phép lũy thừa bằng thuật toán bình phương thực sự đánh giá các biểu thức có dạng hoặc , trong đó không nhất thiết là ma trận danh tính. Nhưng thuật toán của tôi không xem xét khả năng sử dụng lũy ​​thừa bằng thuật toán bình phương với không bằng ma trận danh tính.A n K K KKAnAnKKK


@ gnasher729: Xin lỗi, tôi nên nói rõ hơn. Tôi không muốn vũ phu tất cả các khả năng, vì chính xác cùng một lý do bạn sẽ không muốn giải quyết phép nhân chuỗi ma trận bằng vũ lực. Tôi chỉ chỉnh sửa câu hỏi cho phù hợp.
pyon

Lưu ý rằng ngay cả sau khi bạn yếu tố khéo léo biểu nó vẫn còn thông minh hơn để yếu tố đó là . Điểm là, bạn có thể phải trộn lẫn giữa phép nhân chuỗi ma trận và thuật toán tiêu chuẩn khác để lũy thừa nhanh. Một ( B Một ) 2 * ( 2 * 1249 + 1 ) + 1 BA(BA)4999B
A(BA)2(21249+1)+1B
Apiwat Chantawibul

@Billiska: Thật vậy, đó chính xác là những gì tôi muốn làm: kết hợp phép nhân và lũy thừa chuỗi ma trận bằng cách bình phương thành một thuật toán duy nhất cho bài toán kết hợp. Nhưng có một số vấn đề đáng tiếc. Cho , làm cách nào để ngăn thuật toán tiếp tục thử , , v.v. A B ( A B ) n - 2 A B A B A ( B A ) n - 3 B A BA(BA)n1BAB(AB)n2ABABA(BA)n3BAB
pyon

Chúng ta thay đổi cơ sở thành vectơ Eigen để lũy thừa ma trận và khi tất cả ma trận có công suất 1 thì chúng ta có thể sử dụng phép nhân chuỗi ma trận.
Sâu Joshi

n×nn

Câu trả lời:


3

Tuyên bố từ chối trách nhiệm: Phương pháp sau đây chưa được chứng minh nghiêm ngặt là tối ưu. Một bằng chứng không chính thức được cung cấp.

Vấn đề giảm xuống để tìm thứ tự hiệu quả nhất khi xem xét bình phương của sản phẩm.

(ABC)50(ABC)2ABCABCABC

ABCABC

A(B(CA))BCA(B(CA))49BC


(A1A2An)m(A1A2An)2
(A1A2An)2
GA1A2Gm1An


(AB)nABX×YY×XAB

X×Y
Y×X
Y×Y
X×X

X<YYX

X<Y
ABX×XAB(AB)n

YX
BAY×YABA(BA)n1B

ABAB

Sử dụng nhiều ma trận hơn, đối số là tương tự. Có lẽ một bằng chứng quy nạp là có thể? Ý tưởng chung là việc giải MCM cho hình vuông sẽ tìm ra kích thước tối ưu cho các hoạt động với tất cả các ma trận liên quan được xem xét.

Nghiên cứu điển hình:

julia> a=rand(1000,2);
julia> b=rand(2,1000);
julia> c=rand(1000,100);
julia> d=rand(100,1000);
julia> e=rand(1000,1000);

julia> @time (a*b*c*d*e)^30;
  0.395549 seconds (26 allocations: 77.058 MB, 1.58% gc time)

# Here I use an MCM solver to find out the optimal ordering for the square problem
julia> Using MatrixChainMultiply
julia> matrixchainmultiply("SOLVE_SQUARED", a,b,c,d,e,a,b,c,d,e)
Operation: SOLVE_SQUARED(A...) = begin  # none, line 1:
    A[1] * (((((A[2] * A[3]) * (A[4] * (A[5] * A[6]))) * (A[7] * A[8])) * A[9]) * A[10])
  end
Cost: 6800800

# Use the ordering found, note that exponentiation is applied to the group of 5 elements
julia> @time a*(((((b*c)*(d*(e*a)))^29*(b*c))*d)*e);
  0.009990 seconds (21 allocations: 7.684 MB)

# I also tried using the MCM for solving the problem directly
julia> @time matrixchainmultiply([30 instances of a,b,c,d,e]);
  0.094490 seconds (4.02 k allocations: 9.073 MB)

1
(ABC)2

ABCABC(ABC)n(ABC)nA(BCA)n1BCAB(CAB)n1C

@DavidR Richby là bằng chứng không chính thức được thêm vào?
matteyas

@matteyas: Đó là ít nhiều những gì tôi đã nói trong lần chỉnh sửa đầu tiên cho câu hỏi của mình, phải không?
pyon

ABCABC

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.