Cách nhanh nhất để giải một hệ phương trình tuyến tính


8

Tôi phải giải một hệ thống lên tới 10000 phương trình với 10000 ẩn số càng nhanh càng tốt (tốt nhất là trong vài giây). Tôi biết rằng việc loại bỏ Gaussian quá chậm cho điều đó, vậy thuật toán nào phù hợp cho nhiệm vụ này?

Tất cả các hệ số và hằng số là số nguyên không âm modulo p (trong đó p là số nguyên tố). Có đảm bảo chỉ có 1 giải pháp. Tôi cần giải pháp modulo p.

Câu trả lời:


10

Một phân tích lu của một ma trận có thể được tính trong O ( M ( n ) ) thời gian, nơi M ( n ) là thời gian để nhân hai n × n ma trận. Vì vậy, bạn có thể tìm thấy một giải pháp cho một hệ thống n phương trình tuyến tính trong n ẩn số trong O ( M ( n ) ) thời gian. Chẳng hạn, thuật toán của Strassen đạt được M ( n ) = O (n×nÔi(M(n))M(n)n×nnnÔi(M(n)) , nhanh hơn loại bỏ Gaussian. Xemhttps://en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversion.M(n)= =Ôi(n2,8)

Thay vì cố gắng tự thực hiện điều này, tôi khuyên bạn nên sử dụng thư viện: ví dụ: thư viện BLAS.


Cũng giảm modulo p khi kết thúc tính toán.
fade2black

2
@ fade2black, thực sự, có lẽ sẽ tốt hơn nhiều khi sử dụng một triển khai được thiết kế để sử dụng với số học mod p (nghĩa là giảm mod p ở mỗi bước, không chỉ ở cuối).
DW

Trong trường hợp liên kết Wikipedia thay đổi, có thể tìm thấy tham chiếu đưa ra cho kết quả ví dụ như trong phần 28.2 của phiên bản thứ 3 của Cormen et al, Giới thiệu về Thuật toán . Cụ thể, họ cho thấy "sự tương đương thuật toán" giữa phép nhân ma trận và nghịch đảo ma trận. Nhưng có lẽ người ta có thể liên kết nghịch đảo ma trận và phân rã LU. Ôi(M(n))
Chill2Macht

4

Có những gì bạn muốn đạt được, và có thực tế, và đôi khi chúng bị xung đột. Trước tiên, bạn kiểm tra xem vấn đề của bạn là một trường hợp đặc biệt có thể được giải quyết nhanh hơn, ví dụ như một ma trận thưa thớt. Sau đó, bạn tìm kiếm các thuật toán nhanh hơn; Sự phân hủy LU sẽ kết thúc nhanh hơn một chút. Sau đó, bạn điều tra những gì Strassen có thể làm cho bạn (không nhiều lắm; nó có thể tiết kiệm 1/2 các thao tác nếu bạn nhân kích thước của vấn đề lên 32).

Và sau đó bạn sử dụng vũ lực. Sử dụng một hệ thống đa bộ xử lý với nhiều luồng. Sử dụng các đơn vị vector có sẵn. Sắp xếp dữ liệu và hoạt động của bạn để thân thiện với bộ đệm. Nghiên cứu cách nhanh nhất để thực hiện tính toán modulo p cho một số p cố định. Và bạn thường có thể lưu các hoạt động bằng cách không thực hiện các thao tác modulo p (kết quả trong phạm vi 0 ≤ kết quả <p) nhưng thoải mái hơn một chút (ví dụ kết quả trong phạm vi -p <result <p).


2

Cách tốt nhất để giải các phương trình tuyến tính lớn là sử dụng song song hoặc bằng cách nào đó để phân phối các tính toán giữa các CPU hoặc hơn.

Xem CUDA, OpenCL, OpenMP.

Rất nhiều người đề nghị Strassen's algorithmnhưng nó có một hằng số ẩn rất lớn khiến nó không hiệu quả.

Nhân tiện: phương trình tuyến tính của bạn có thể rất thưa thớt (rất nhiều số không), có một vài tối ưu rất gọn gàng để giải quyết chúng song song.


Kích thước ma trận là 10.000 đến 10.000 vì vậy tôi cho rằng Strassen sẽ có thể lưu thứ gì đó. Chỉ là không nhiều lắm.
gnasher729

1
@ gnasher729 Tôi có một số nghi ngờ, Alex Stapanov trong một trong những bài giảng của mình, người ta đã đề cập rằng Boing đã sử dụng thuật toán của Strassen cho các ma trận thực sự lớn (1Mx1M afair) và họ không hài lòng với hiệu suất. Nhưng tôi nghĩ thông tin này đã lỗi thời đối với phần cứng hiện đại.
Oleg Kovalov
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.