Sau khi chuẩn bị xong hàm con “is_primen” ở trên ta bắt đầu giải bài toán: Trước tiên ta khởi tạo một danh sách rỗng để lưu trữ các số nguyên tố.X Sau đó, vòng lặp đầu tiên chạy qua
Trang 1BÀI TIỂU LUẬN GIỮA KÌ MÔN ĐẠI SỐ TUYẾN TÍNH
CHO CÔNG NGHỆ THÔNG TIN
MIDTERM ESSAY: Applied Linear
Algebra for IT
Người hướng dẫn: PHẠM QUỐC HUY Người thực hiện: NGÔ XUÂN BÌNH – 52200270
Lớp : 22050401 Khoá : 26
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2023
Trang 2LỜI CẢM ƠN
Tôi muốn gửi lời cảm ơn chân thành nhất tới Thầy vì đã giúp đỡ tôi hoàn thànhbài tiểu luận của mình Sự hỗ trợ và sự chỉ dẫn từ Thầy đã giúp tôi vượt qua những khókhăn và thách thức trong quá trình nghiên cứu và viết bài tiểu luận
Thật sự, những lời khuyên và góp ý từ Thầy đã giúp tôi cải thiện bài tiểu luậncủa mình, và giúp tôi hiểu rõ hơn về chủ đề mà tôi đang nghiên cứu Tôi biết rằngkhông có gì quý giá hơn kiến thức mà Thầy đã truyền đạt cho tôi
Với sự giúp đỡ của Thầy, tôi đã hoàn thành bài tiểu luận của mình một cáchthành công và tự tin hơn Tôi chân thành cảm kích và đánh giá cao tình cảm và sự quantâm của Thầy dành cho sinh viên của mình
Một lần nữa, tôi xin cảm ơn Thầy rất nhiều vì đã trợ giúp tôi hoàn thành bài tiểuluận của mình Sự giúp đỡ và động viên của Thầy là một niềm động lực to lớn đối vớitôi, và tôi hy vọng sẽ tiếp tục được học hỏi và phát triển dưới sự hướng dẫn của Thầytrong tương lai
Trân trọng,
Ngô Xuân Bình
Trang 3TIỂU LUẬN ĐƯỢC HOÀN THÀNH
TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi / chúng tôi và được sựhướng dẫn của TS Nguyễn Văn A; Các nội dung nghiên cứu, kết quả trong đề tài này
là trung thực và chưa công bố dưới bất kỳ hình thức nào trước đây Những số liệu trongcác bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính tác giả thuthập từ các nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo
Ngoài ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như số liệucủa các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc
Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách nhiệm
về nội dung đồ án của mình Trường đại học Tôn Đức Thắng không liên quan đến
những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện (nếu có)
TP Hồ Chí Minh, ngày 17 tháng 4 năm 2023
Tác giả (ký tên và ghi rõ họ tên)
Ngô Xuân Bình
Trang 4PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊNPhần xác nhận của GV hướng dẫn
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)
Phần đánh giá của GV chấm bài
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)
Trang 5TÓM TẮT
Tập trung giải quyết 8 bài toán về biến đổi ma trận trên ngôn ngữ lập trìnhpython và đưa ra lời giải chi tiết cho nhưng bài trên
Trang 6MỤC LỤC
LỜI CẢM ƠN i
TIỂU LUẬN ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG ii
PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN iii
TÓM TẮT iv
MỤC LỤC 1
CHƯƠNG 1 – PHƯƠNG PHÁP GIẢI QUYẾT BÀI TẬP 3
1.1 Bài 1d: Lưu các số nguyên lẻ trong ma trận A vào một vector mới, in véc tơ kết quả ra màn hình 3
1.2 Bài 1e: Lưu các số nguyên tố trong ma trận A vào một véc tơ mới, in vector tổng ra màn hình 3
1.3 Bài 1f: Cho ma trận D = CB, đảo ngược các phần tử ở các hàng lẻ của ma trận D và in ma trận kết quả ra màn hình 5
1.4 Bài 1g: Đối với ma trận A, hãy tìm các hàng có số nguyên tố nhiều nhất và in các hàng đó ra màn hình 5
1.5 Bài 1h: Đối với ma trận A, hãy tìm các hàng có dãy số lẻ liền kề dài nhất và in các hàng đó ra màn hình 7
CHƯƠNG 2 – MÃ NGUỒN VÀ ĐẦU RA 10
2.1 Triển khai các ma trận ban đầu và hàm con bổ trợ 10
2.2 Bài 1a: 10
2.2.1 Mã nguồn 10
2.2.2 Đầu ra 10
2.3 Bài 1b: 11
2.3.1 Mã nguồn 11
2.3.2 Đầu ra 11
2.4 Bài 1c: 12
Trang 72.4.1 Mã nguồn 12
2.4.2 Đầu ra 12
2.5 Bài 1d: 12
2.5.1 Mã nguồn 12
2.5.2 Đầu ra 12
2.6 Bài 1e: 13
2.6.1 Mã nguồn 13
2.6.2 Đầu ra 13
2.7 Bài 1f: 14
2.7.1 Mã nguồn 14
2.7.2 Đầu ra 14
2.8 Bài 1g: 14
2.8.1 Mã nguồn 14
2.8.2 Đầu ra 15
2.9 Bài 1h: 15
2.9.1 Mã nguồn 15
2.9.2 Đầu ra 16
Trang 8CHƯƠNG 1 – PHƯƠNG PHÁP GIẢI QUYẾT BÀI TẬP
1.1 Bài 1d: Lưu các số nguyên lẻ trong ma trận A vào một vector mới, in véc
tơ kết quả ra màn hình.
Để có thể chọn ra các phần tử lẻ của ma trận và lưu chúng vào một vector mớiA
có tên là Ta sử dụng đoạn code sau Z "Z = A[A % 2 == 1]".
Cách thức hoạt động của đoạn code:
“A % 2 == 1” sẽ tạo ra một ma trận boolean có cùng kích thước với ma
trận , trong đó các phần tử bằng A “True” nếu tương ứng với phần tử ở
ma trận là số lẻ, và A “False” nếu là số chẵn
Sau đó, chúng ta sử dụng ma trận boolean này để chọn các phần tử của
ma trận bằng cách sử dụng toán tử A “[]” như một cách để truy xuất từngphần tử của mảng theo một điều kiện nào đó Cụ thể, các phần tử đượcchọn sẽ có chỉ số tương ứng với các phần tử của ma trận boolean bằng
“True” Kết quả là một vector mới chứa các phần tử lẻ của ma trận A 1.2 Bài 1e: Lưu các số nguyên tố trong ma trận A vào một véc tơ mới, in vector tổng ra màn hình.
Để có thể lưu các số nguyên lẻ trong ma trận vào một vector mới ta cần 1 hàmA
con “is_prime(n)”
"def is_prime(n):
if n < 2:
return False for i in range(2, int(np.sqrt(n))+1):
if n % i == 0:
return False return True"
Trang 9Cách thức hoạt động của hàm “is_prime(n)”:
Nếu n < 2, nó không phải là số nguyên tố và hàm trả về “False”.
Ngược lại, nếu n >= 2, chúng ta bắt đầu kiểm tra tính nguyên tố của ,n
Để kiểm tra n có phải là số nguyên tố hay không, chúng ta sẽ dùng vònglặp với một biến từ đến i 2 “int(np.sqrt(n)) + 1”. Nếu chia hết cho n i (n
% i == 0), nghĩa là n không phải là số nguyên tố và hàm trả về False.
Nếu không có số nào từ đến mà chia hết cho , nghĩa là là sối 2 n n nguyên tố và hàm trả về “True”.
Sau khi chuẩn bị xong hàm con “is_prime(n)” ở trên ta bắt đầu giải bài toán:
Trước tiên ta khởi tạo một danh sách rỗng để lưu trữ các số nguyên tố.X
Sau đó, vòng lặp đầu tiên chạy qua các hàng của ma trận (được đạiA
diện bởi biến ) và vòng lặp thứ hai chạy qua các cột của ma trận (đượci A
đại diện bởi biến ) Trong mỗi vòng lặp, chúng ta kiểm tra xem giá trịj
của phần tử tại vị trí (i, j) có phải là số nguyên tố hay không bằng cách sửdụng hàm “is_prime(n)”
Nếu giá trị là số nguyên tố, thì giá trị đó được thêm vào danh sách X
bằng cách sử dụng phương thức append() của danh sách Cuối cùng, khi
đã duyệt qua toàn bộ các phần tử trong ma trận , danh sách sẽ chứaA X
tất cả các số nguyên tố có trong ma trận A
1.3 Bài 1f: Cho ma trận D = CB, đảo ngược các phần tử ở các hàng lẻ của
ma trận D và in ma trận kết quả ra màn hình.
Trang 10Để có thể đảo ngược các phần tử của các hàng lẻ trong ma trận “D = C.B” taphải tạo ra ma trận bằng cú pháp D “D = np.dot(C, B)”. Sau đó ta bắt đầu giải bàitoán:
“for i in range(D.shape[0]):
if i % 2 == 0:
continue D[i, :] = D[i, ::-1]”
Ta dùng vòng lặp for duyệt qua từng hàng của ma trận , được xác địnhD bởi biến i
Trong vòng lặp, nếu chỉ số hàng i là số chẵn, câu lệnh “continue” sẽ
được thực thi để bỏ qua hàng này và tiếp tục vòng lặp đến hàng tiếp theo
Nếu chỉ số hàng là số lẻ, các phần tử trong hàng đó sẽ được đảo ngượci
bằng cách sử dụng phép gán "D[i, :] = D[i, ::-1]" gán các phần tử đã bịđảo ngược của hàng lẻ thứ vào hàng lẻ đó trong ma trận Trong đó,i D
“D[i, :]” là một slice của ma trận D, chỉ định tất cả các phần tử của hàng
thứ và i “D[i, ::-1]” cũng là một slice của ma trận , chỉ định tất cả cácD
phần tử của hàng thứ i nhưng đảo ngược thứ tự của chúng
1.4 Bài 1g: Đối với ma trận A, hãy tìm các hàng có số nguyên tố nhiều nhất
và in các hàng đó ra màn hình.
Để có thể tìm các hàng có nhiều số nguyên tố nhất trong ma trận , ta cần dùngA
1 hàm đã định nghĩa trước đó ở 1.1.2 Task 1e và tạo 1 hàm mới:
hàm “is_prime(n)” để xác định số nguyên tố trong hàng của ma trận
hàm mới “count_primes(row)” để đếm số nguyên tố đã xác định trong
hàng của ma trận đó
“def count_primes(row):
count = 0
Trang 11for num in row:
if is_prime(num):
count += 1 return count”
Cách thức hoạt động của hàm “count_primes(row)”:
“count_primes(row)” nhận đầu vào là một hàng (row) trong ma trận vàtrả về số lượng số nguyên tố trong hàng đó Hàm bắt đầu bằng cách khởitạo một biến count với giá trị ban đầu là 0
Sau đó, hàm lặp qua từng phần tử num trong hàng và kiểm tra xem num
có phải số nguyên tố không bằng cách gọi hàm “is_prime(n)” (đã đượcđịnh nghĩa trong đoạn code trước đó) Nếu num là số nguyên tố, count
sẽ được tăng lên Cuối cùng, hàm trả về giá trị của biến 1 count, là sốlượng số nguyên tố trong hàng
Sau khi chuẩn bị xong 2 hàm con, ta bắt đầu giải bài toán:
elif count == max_count:
max_rows.append(A[i])”
Cụ thể, đoạn mã bắt đầu bằng cách khởi tạo biến max_count = 0 và biến
max_rows bằng một danh sách rỗng Tiếp theo, vòng lặp for được sửdụng để duyệt qua mỗi hàng của ma trận , đánh chỉ số của hàng bằngA biến i
Trang 12 Với mỗi hàng, hàm “count_primes(row)” được sử dụng để đếm sốlượng số nguyên tố trong hàng đó và lưu kết quả vào biến count.
Tiếp theo, chúng ta kiểm tra xem giá trị count có lớn hơn giá trị
max_count hiện tại hay không Nếu có , max_count được cập nhật thành
count và max_rows được đặt bằng một danh sách chứa hàng hiện tại.
Nếu giá trị count bằng với max_count hiện tại, hàng hiện tại được thêm
vào danh sách max_rows Cuối cùng, khi vòng lặp kết thúc, các hàng có
số lượng số nguyên tố lớn nhất sẽ được lưu trong danh sách max_rows
Vì kết quả cuối cùng trả về là 1 danh sách nên khi in ra màn hình bằng cáchthông thường, mà ta phải dùng vòng lặp for:
“for row in max_rows:
current_seq_length = 0
Trang 13 Trong mỗi vòng lặp này, biến current_seq_length được khởi tạo lại
thành và 0 max_seq_length cũng được khởi tạo thành 0
Tiếp theo, vòng lặp thứ hai “for j in range(A.shape[1])”: được sử dụng
để duyệt qua tất cả các phần tử trong hàng hiện tại đang được xét
Nếu phần tử hiện tại là số lẻ, thì biến current_seq_length sẽ được tăng lên một đơn vị Nếu current_seq_length > max_seq_length, thì max_seq_length sẽ được cập nhật với giá trị mới của current_seq_length.
Trang 14 Nếu phần tử hiện tại là số chẵn, thì biến current_seq_length sẽ được
khởi tạo lại thành , vì chuỗi số lẻ đã bị phá vỡ.0
Sau khi duyệt qua tất cả các phần tử trong hàng hiện tại, chúng ta kiểmtra nếu max_seq_length cho hàng này > longest_seq_length hiện tại.Nếu là như vậy, thì longest_seq_length sẽ được cập nhật với giá trị mớicủa max_seq_length, và danh sách odd_rows sẽ được cập nhật lại để chỉchứa chỉ số của hàng hiện tại
Nếu max_seq_length = longest_seq_length, thì chúng ta thêm chỉ sốcủa hàng hiện tại vào danh sách odd_rows, vì hàng này có độ dài chuỗi
số lẻ liên tiếp bằng với chuỗi số lẻ liên tiếp dài nhất được tìm thấy trướcđó
Cuối cùng, danh sách odd_rows sẽ chứa các chỉ số của các hàng có chuỗi
số lẻ liên tiếp dài nhất Các chỉ số này có thể được sử dụng để truy cập và
Trang 15CHƯƠNG 2 – MÃ NGUỒN VÀ ĐẦU RA
2.1 Triển khai các ma trận ban đầu và hàm con bổ trợ.
2.2 Bài 1a: Tính , và in kết quả ra màn hình.
2.2.1 Mã nguồn.
2.2.2 Đầu ra.
2.3 Bài 1b: Tính , và in ra màn hình.
Trang 162.3.1 Mã nguồn.
2.3.2 Đầu ra.
Trang 172.4 Bài 1c: Lưu các hàng lẻ của ma trận A thành một ma trận mới và in ma trận kết quả ra màn hình.
Trang 182.6 Bài 1e: Lưu các số nguyên tố trong ma trận A vào một véc tơ mới, in vector tổng ra màn hình.
2.6.1 Mã nguồn.
2.6.2 Đầu ra.
Trang 192.7 Bài 1f: Cho ma trận D = CB, đảo ngược các phần tử ở các hàng lẻ của
Trang 202.8.2 Đầu ra.
2.9 Bài 1h: Đối với ma trận A, hãy tìm các hàng có dãy số lẻ liền kề dài nhất
và in các hàng đó ra màn hình.
2.9.1 Mã nguồn.
Trang 212.9.2 Đầu ra.