Đối với dự án của tôi, tôi cần giải quyết ma trận X cho ma trận Y và K. (XY = K) Các phần tử của mỗi ma trận phải là số nguyên modulo một số nguyên tố 256 bit ngẫu nhiên. Nỗ lực đầu tiên của tôi trong việc giải quyết vấn đề này đã sử dụng chức năng mod_inv(n)
của SymPy. Vấn đề với điều này là tôi đang hết bộ nhớ với ma trận khoảng 30. Suy nghĩ tiếp theo của tôi là thực hiện hệ số ma trận, vì điều đó có thể ít nặng hơn trên bộ nhớ. Tuy nhiên, SymPy dường như không chứa bộ giải mã nào có thể tìm thấy ma trận modulo một số. Bất kỳ cách giải quyết nào hoặc mã tự tạo tôi có thể sử dụng?Sympy: Giải quyết Ma trận trong trường hữu hạn
6
A
Trả lời
5
sympy
's Matrix
lớp hỗ trợ inverses mô-đun. Dưới đây là một ví dụ modulo 5:
from sympy import Matrix, pprint
A = Matrix([
[5,6],
[7,9]
])
#Find inverse of A modulo 26
A_inv = A.inv_mod(5)
pprint(A_inv)
#Prints the inverse of A modulo 5:
#[3 3]
#[ ]
#[1 0]
Phương pháp rref
cho việc tìm kiếm hình thức bậc thang hàng-giảm hỗ trợ từ khóa iszerofunction
cho biết những gì các entry trong một ma trận phải được coi là zero. Tôi tin rằng mục đích sử dụng là để ổn định số (xử lý các số nhỏ bằng 0), nhưng tôi cũng đã sử dụng nó để giảm mô-đun.
Dưới đây là một ví dụ modulo 5:
from sympy import Matrix, Rational, mod_inverse, pprint
B = Matrix([
[2,2,3,2,2],
[2,3,1,1,4],
[0,0,0,1,0],
[4,1,2,2,3]
])
#Find row-reduced echolon form of B modulo 5:
B_rref = B.rref(iszerofunc=lambda x: x % 5==0)
pprint(B_rref)
# Returns row-reduced echelon form of B modulo 5, along with pivot columns:
# ([1 0 7/2 0 -1], [0, 1, 3])
# [ ]
# [0 1 -2 0 2 ]
# [ ]
# [0 0 0 1 0 ]
# [ ]
# [0 0 -10 0 5 ]
Đó là loại đúng, ngoại trừ việc ma trận được trả về bởi rref[0]
vẫn có 5 trong nó và các phần phân đoạn. Giải quyết vấn đề này bằng cách sử dụng công cụ sửa đổi và giải thích các phân số dưới dạng các đầu vào mô-đun:
def mod(x,modulus):
numer, denom = x.as_numer_denom()
return numer*mod_inverse(denom,modulus) % modulus
pprint(B_rref[0].applyfunc(lambda x: mod(x,5)))
#returns
#[1 0 1 0 4]
#[ ]
#[0 1 3 0 2]
#[ ]
#[0 0 0 1 0]
#[ ]
#[0 0 0 0 0]
Các vấn đề liên quan
- 1. Đảo ngược của ma trận trong SymPy?
- 2. Kiểm tra nếu ma trận có thể đảo ngược trên trường hữu hạn
- 3. Bộ phận Ma trận Trái và Giải quyết Numpy
- 4. Thay thế chậm ma trận biểu tượng bằng sympy
- 5. Ma trận của Ma trận trong Perl
- 6. Python SymPy: Lỗi trong khi giải quyết bất bình đẳng
- 7. Hệ thống Giải quyết các phương trình với SymPy
- 8. giải thích về ma trận xoay iOS
- 9. Tạo một ma trận kề ma trận
- 10. Làm thế nào để mở rộng biểu thức ma trận trong sympy
- 11. Phép nhân ma trận chuỗi ma trận
- 12. Ma trận chiếu ma trận trong Xna/OpenGL - 3D
- 13. Tính toán yếu tố quyết định ma trận
- 14. Ma trận biến đổi ma trận bù đắp
- 15. Làm thế nào để thao tác các biểu thức trong ma trận bằng cách sử dụng sympy?
- 16. ma trận dịch ma trận không dịch vector
- 17. Thư viện đại số tuyến tính hữu hạn cho Haskell
- 18. Cách giải quyết hạn chế JDK này?
- 19. Tạo ma trận đối xứng trong R
- 20. Giải quyết lỗi "nạp hạn chế vi phạm" trên "org.w3c.dom.Node" trong một môi trường OSGi
- 21. Ma trận kết hợp?
- 22. Làm thế nào để giải quyết một hệ thống tuyến tính của ma trận trong gió scala?
- 23. Làm thế nào tôi có thể giải quyết hệ phương trình tuyến tính trong SymPy?
- 24. Định hình lại ma trận 3d thành ma trận 2d
- 25. Phép nhân ma trận trong hadoop
- 26. Python: cách sắp xếp mảng ma trận theo hai trường?
- 27. chuyển đổi giữa ma trận OpenCV và ma trận int
- 28. Tạo ma trận co-occurrence
- 29. ma trận xoay trong Eigen
- 30. Ma trận xuất trong r
NB: Chức năng này không phải lúc nào cũng hoạt động. Một ví dụ là Ma trận ([[4,3,1,3], [2,4,1,3]]) trong Z_5. Trong trường hợp này, các cuộc gọi iszerofunc thông thường sử dụng lambda x: x% 5 == 0 cho một ma trận với mẫu số bao gồm một 5. Vì trong Z_5 không có nghịch đảo cho 5, chương trình sẽ thoát. – brunston