Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 25 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
25
Dung lượng
249 KB
Nội dung
ỨNG DỤNG NHÂN MA TRẬN TRONG CÁC BÀI TOÁN TIN HỌC Contents I Lý thuyết ma trận 1.1 Định nghĩa ma trận 1.2 Phép cộng phép nhân hai ma trận + Phép cộng hai ma trận A B: +Phép nhân hai ma trận: 1.3 Ma trận vuông + Ví dụ ma trận tam giác trên: .3 + Ví dụ ma trận tam giác dưới: + Ví dụ ma trận chéo: + Ma trận đơn vị In: 1.4 Ma trận đối xứng + Khái niệm ma trận chuyển vị: + Ma trận đối xứng: .4 II Bài tập ứng dụng I Lý thuyết ma trận 1.1 Định nghĩa ma trận Ma trận mảng chữ nhật chứa số đối tượng tốn học khác, mà định nghĩa số phép toán cộng nhân ma trận Hay gặp ma trận trường F mảng chữ nhật chứa đại lượng vô hướng F Bài viết đề cập đến ma trận thực, tức ma trận mà phần tử số thực A 11 A 21 A 12 A 22 A= A m1 A 1n A 2n A m2 A mn Trong Aij €F ( 1≤i≤n; 1≤j≤m), gọi ma trận m hàng n cột với phần tử F Véc tơ hàng ( Ai1 Ai Ain được gọi hàng thứ i ma trận A Véc tơ cột ( A1 Am gọi cột thứ j ma trận A A2 j j j Ma trận gọi ma trận A=(Aij)m×n Tập hợp ma trận m hàng, n cột với phần tử F kí hiệu M(m×n,F) 1.2 Phép cộng phép nhân hai ma trận Ta định nghĩa phép cộng phép nhân vơ hướng M(m×n,F) sau: + Phép cộng hai ma trận A B: A 11 A A A 12 1n A 21 A 2n 22 A m1 A mn A m2 B 11 B + 21 B m1 B B 12 1n B B 2n 22 B mn B m2 A B 11 11 B A = 21 A12 B12 1n 1n A B 21 A B m1 m1 Cài đặt pascal: A B 2n A22 B22 Am Bm 2n A B mn mn for i:=1 to M for j:=1 to N C[i,j]:= A[i,j] + B[i,j]; 3.5 2 Ví dụ: 3.5 6 = 1 3 6 3 + 7 0 8 01 +Phép nhân hai ma trận: Cho hai ma trận A=(Aij) € M (m × n,F), B = (Bjk) € M(n × p,F) Tích AB ma trận A ma trận B ma trận C =(Cik) € M(m × p,F) với phần tử xác định sau: Aij Bjk ,n Cik= ( 1≤ i ≤m, 1≤ k ≤p) j1 Trong Pascal cài đặt sau: for i:=1 to M for k:=1 to P begin C[i,k]:=0; for j:=1 to N C[i,k]:=C[i,k]+A[i,j] * B[j,k]; end Ví dụ: 1 3 0 1 1 × 0 = 1 13 32 Tích số a ma trận A€M(m × n,F) ma trận B€M(m × n,F) A 11 A Ví dụ: a× A 1n A22 A Am A mn 21 A m1 1.3 Ma trận vuông A12 2n aA 11 aA 21 aA 12 aA 22 = aA m1 aA 1n aA 2n aA m2 aA mn Ma trận vuông ma trận có số hàng số cột Ma trận n × n cịn gọi ma trận vng bậc n Bất kì hai ma trận vng bậc thực phép cộng phép nhân với Các phần tử A ii tạo thành đường chéo ma trận vng + Các loại thường gặp: Nếu phần tử A bên đường chéo 0, A gọi ma trận tam giác Tương tự, phần tử A nằm phía đường chéo 0, A gọi ma trận tam giác Nếu phần tử nằm bên ngồi đường chéo khơng A gọi ma trận chéo + Ví dụ ma trận tam giác trên: 2 + Ví dụ ma trận tam giác dưới: 4 5 3 1 0 0 0 0 + Ví dụ ma trận chéo: 0 3 1 + Ma trận đơn vị In: Có số chiều n ma trận n × n phần tử đường chéo tất phần tử khác 0, ví dụ: 1 0 ,…., In = I1= , I3= , I2= 0 0 10 0 0 1 Nó ma trận vng bậc n, trường hợp đặc biệt ma trận chéo Nó ma trận đơn vị thực nhân ma trận với thu ma trận đó: AIn = ImA = A với ma trận A mxn 1.4 Ma trận đối xứng + Khái niệm ma trận chuyển vị: Nếu A ma trận có kích thước m×n với giá trị a ij hàng i cột j ma T trận chuyển vị B = A ma trận có kích thước n × m với giá trị: bji= aij Ví dụ: A= 3 5 T B=A = 5 6 64 + Ma trận đối xứng: T Ma trận vuông A ma trận chuyển vị nó, tức A=A , A ma trận đối xứng = AT Ví dụ: A= 221 II Bài tập ứng dụng Bài LÁT VIỀN Đường viền trang trí nhà có kích thước × lát loại gạch: loại kích thước × loại × Hãy xác định số cách lát khác thực Dữ liệu: Vào từ file vãn TILE.INP Dòng đầu chứa số nguyên dương ( ≤ 10) – số lượng liệu T dòng tiếp, dịng thứ ghi số ngun dương kích thước nhà liệu thứ Kết quả: Đưa file văn TILE.OUT dòng tương ứng kết tìm với liệu theo thứ tự Đưa theo số dư cho 109 + Ví dụ: TILE.INP 12 TILE.OUT 171 2731 số cách tạo đường viền kích thước × Dễ thấy: Hướng dẫn: Gọi = −1 +2 −2 Khi ta có: =[ −1 = −1 × −1 ] × −1 −2 1 với = [ ] Do đó, để tính ta dùng phương pháp nhân ma trận giải toán thời gian (log2 × ( )3) Code mẫu: using namespace std; typedef long long ll; struct matrix { int val[maxn][maxn]; matrix() { memset(val, 0, sizeof(val)); } matrix operator * ( const matrix & x) { matrix res; for (int u = 0; u < 2; u++) for (int v = 0; v < 2; v++) for (int i = 0; i < 2; i++) res.val[u][v] = ((ll)val[u][i] * x.val[i][v] + res.val[u][v] ) % MOD; return res; } }; matrix A, res; long long n; long long F[10000001]; matrix POWW(matrix A, long long b) { matrix C; for (int i = 0; i < 2; i++) C.val[i][i] = 1; for ( ; b; b /= 2, A = A * A) if (b % 2) C = C * A; return C; } int main() { ios_base::sync_with_stdio(0); freopen(Task".inp", "r", stdin); freopen(Task".out", "w", stdout); int T; cin >> T; while (T ){ cin >> n; A.val[0][0] = 1; A.val[0][1] = 2; A.val[1][0] = 1; res= POWW(A,n+1); cout