Về độ phức tạp của các thuật toán số học luận văn thạc sĩ toán học

51 995 4
Về độ phức tạp của các thuật toán số học luận văn thạc sĩ toán học

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC VINH LÊ THANH XUÂN VỀ ĐỘ PHỨC TẠP CỦA CÁC THUẬT TOÁN SỐ HỌC LUẬN VĂN THẠC TOÁN HỌC Nghệ An, 12. 2011 1 MỤC LỤC Trang Mục lục 1 Mở đầu 2 Chương 1: Các kiến thức cơ sở về độ phức tạp của các thuật toán 5 1.1. Khái niệm về thuật toán……………………………… . 5 1.2. Các dạng diễn đạt thuật toán……………………… . 11 1.3. Độ phức tạp thuật toán………………………………. 13 1.4. Đánh giá độ phức tạp của thuật toán………………… 17 Chương 2: Độ phức tạp của các thuật toán số học 20 2.1. Biểu diễn số nguyên và các phép tính số học ………… 20 2.2. Số nguyên tố………………………………………… 28 2.3. Thuật toán Euclid……………………………………… 38 2.4. Thuật toán J.Stein……………………………………… 41 2.5. Thuật toán Euclid mở rộng ………………………. 42 2.6. Phân số liên tục …………………………………… 43 Kết luận 49 Tài liệu tham khảo …………………………………… 50 2 MỞ ĐẦU Nếu như trước thập kỷ 70 của thế kỷ XX, Số học vẫn được xem là một trong những ngành lý thuyết xa rời thực tiễn nhất, thì ngày nay những thành tựu mới nhất của Số học có ứng dụng trực tiếp vào các vấn đề của đời sống, như thông tin mật mã, kỹ thuật máy tính. Một phương hướng mới của Số học ra đời và phát triển mạnh mẽ: Số học thuật toán. Có thể nói rằng, Số học thuật toán - đó là chiếc cầu nối giữa Số học và Tin học. Sự phát triển của Tin học đòi hỏi phải xây dựng các lý thuyết toán học làm cơ sở cho việc thiết lập các thuật toán và phần mềm. Một trong những lý thuyết toán học đó là lý thuyết về Độ phức tạp của thuật toán. Thời gian mà máy tính khi thực hiện một thuật toán không chỉ phụ thuộc vào bản thân thuật toán đó, ngoài ra còn tùy thuộc từng máy tính. Để đánh giá hiệu quả của một thuật toán, có thể xét số các phép tính phải thực hiện khi thực hiện thuật toán này. Thông thường số các phép tính được thực hiện phụ thuộc vào cỡ của bài toán, tức là độ lớn của đầu vào. Vì thế độ phức tạp thuật toán là một hàm phụ thuộc đầu vào. Tuy nhiên trong những ứng dụng thực tiễn, chúng ta không cần biết chính xác hàm này mà chỉ cần biết một ước lượng đủ tốt của chúng. Để ước lượng độ phức tạp của một thuật toán, ta thường dùng khái niệm bậc O-lớn và bậc Θ (bậc Theta). Các độ phức tạp thường gặp đối với các thuật toán thông thường gồm có: - Độ phức tạp hằng số, O(1). Số phép tính/thời gian chạy/dung lượng bộ nhớ không phụ thuộc vào độ lớn đầu vào. Chẳng hạn như các thao tác hệ thống: đóng, mở file. 3 - Độ phức tạp tuyến tính, O(n). Số phép tính/thời gian chạy/dung lượng bộ nhớ có xu hướng tỉ lệ thuận với độ lớn đầu vào. Chẳng hạn như tính tổng các phần tử của một mảng một chiều. - Độ phức tạp đa thức, O(P(n)), với P là đa thức bậc cao (từ 2 trở lên). Chẳng hạn như các thao tác tính toán với mảng nhiều chiều (tính định thức ma trận). - Độ phức tạp lôgarit, O(logn) (chú ý: bậc của nó thấp hơn so với O(n)) . Chẳng hạn thuật toán Euclid để tìm ước số chung lớn nhất. - Độ phức tạp hàm mũ, O(2 n ). Với những lý do như đã trình bày, chúng tôi chọn đề tài của Luận văn là “Về độ phức tạp của các thuật toán số học” nhằm tìm hiểu sâu hơn ứng dụng về các thuật toán số học trong Tin học. Với mục đích đó, ngoài phần mở đầu và kết luận, Luận văn được chia làm hai chương. Chương 1. Các kiến thức cơ sở về độ phức tạp của các thuật toán Trong chương này chúng tôi trình bày một số kiến thức cơ sở về độ phức tạp của các thuật toán cần dùng cho các chứng minh ở chương sau. Chương 2. Độ phức tạp của các thuật toán số học Trong chương này chúng tôi trình bày các kết quả cơ sở về độ phức tạp của thuật toán, một số thuật toán số họcđộ phức tạp của một số thuật toán số học. Luận văn được hoàn thành tại trường Đại học Vinh dưới sự hướng dẫn tận tình, chu đáo và nghiêm khắc của thầy giáo, PGS.TS Nguyễn Thành Quang. Tác giả xin bày tỏ lòng biết ơn sâu sắc của mình đến thầy. Tác giả xin chân thành cảm ơn Ban chủ nhiệm khoa Đào tạo Sau Đại học, Ban chủ nhiệm khoa Toán, các thầy cô trong chuyên ngành Đại số và Lý thuyết số, Khoa Toán học thuộc Trường Đại học Vinh, những thầy cô đã nhiệt tình giảng dạy và giúp đỡ tác giả trong suốt thời gian học tập. 4 Tác giả xin chân thành cảm ơn Trường Đại học Sài Gòn đã tạo mọi điều kiện thuận lợi cho tác giả trong suốt quá trình học tập. Tác giả xin cảm ơn các đồng nghiệp, gia đình và bạn bè đã cộng tác, giúp đỡ và khích lệ tôi trong suốt quá trình học tập nghiên cứu. Mặc dù đã có nhiều cố gắng, nhưng Luận văn không tránh khỏi những hạn chế, thiếu sót. Tác giả rất mong nhận được những ý kiến đóng góp của các thầy, cô giáo và bạn đồng nghiệp. Nghệ An, tháng 12 năm 2011 Tác giả 5 CHƯƠNG 1 VỀ ĐỘ PHỨC TẠP CỦA THUẬT TOÁN 1.1. Khái niệm về thuật toán 1.1.1. Giới thiệu. Có thể định nghĩa thuật toán theo nhiều cách khác nhau. Trong chương này, chúng tôi không có ý định trình bày về thuật toán như trong một giáo trình lôgic, mà sẽ hiểu khái niệm thuật toán theo một cách thông thường nhất. Thuật toán Một số từ khóa If (điều kiện) then {…} else for (điều kiện) do {…} while (điều kiện) do {…} procedure (T,a,b) {…} function (A) {…return r;} 1.1.2. Định nghĩa. Thuật toán là một quy tắc để với những dữ liệu ban đầu đã cho, tìm được lời giải sau một khoảng thời gian hữu hạn. 6 Dữ kiện vào Kết quả ra Quá trình tính toán Một dãy các bước tính toán Thuật toán sắp xếp Dãy số được sắp xếp Một dãy số Để minh họa cách ghi một thuật toán, cũng như tìm hiểu các yêu cầu đề ra cho thuật toán, ta xét trên các ví dụ cụ thể sau đây: Cho n số X[1], X[2],…, X[n], ta cần tìm m và j sao cho ][max][ 1 kXjXm nk ≤≤ == và j là lớn nhất có thể. Điều đó có nghĩa là cần tìm cực đại của các số đã cho, và chỉ số lớn nhất trong các số đạt cực đại. Với mục tiêu tìm số cực đại với chỉ số lớn nhất, ta xuất phát từ giá trị X[n]. Bước thứ nhất, vì mới chỉ có một số, ta có thể tạm thời xem m = X[n] và j = n. Tiếp theo, ta so sánh X[n] với X[n - 1]. Trong trường hợp n - 1 = 0, tức n = 1, thuật toán kết thúc. Nếu X[n - 1] ≤ X[n], ta chuyển sang so sánh X[n] với X[n - 2]. Trong trường hợp ngược lại, X[n - 1] chính là số cực đại trong hai số đã xét và ta phải thay đổi m và j: đặt m = X[n - 1], j = n -1. Với cách làm như trên, ở mỗi bước, ta luôn nhận được số cực đại trong những số đã xét. Bước tiếp theo, so sánh nó với những số đứng trước, hoặc kết thúc thuật toán trong trường hợp không còn số nào đứng trước nó. Thuật toán mô tả trên đây được ghi lại như sau: 1.1.3. Thuật toán tìm cực đại M1. [Bước xuất phát] Đặt j ← n, k ← n – 1, m ← X[n]. M2. [Đã kiểm tra xong?] Nếu k = 0, thuật toán kết thúc. M3. [So sánh] Nếu X[k] ≤ m, chuyển sang M5. M4. [Thay đổi m] Đặt j ← k, m ← X[k]. (Tạm thời m đang là cực đại) M5. [Giảm k] Đặt k ← k - 1, quay về M2. Dấu “←” dùng để chỉ một phép toán quan trọng là phép thay chỗ (replacement). 7 Trên đây, ta ghi một thuật toán bằng ngôn ngữ thông thường. Trong trường hợp thuật toán được viết bằng ngôn ngữ của máy tính, ta có một chương trình. 1.1.4. Bài toán Tháp Hà Nội. Có n cái đĩa kích thước nhỏ dần xếp chồng lên nhau ở cọc A, đĩa lớn ở dưới, đĩa nhỏ ở trên. a) Hãy tìm cách chuyển chồng đĩa này sang cột C sao cho : 1. Mỗi lần chỉ chuyển 1 đĩa từ cọc này sang cọc khác và được lấy cọc B làm cọc trung gian. 2. Không được xếp đĩa lớn trên đĩa nhỏ. b) Ký hiệu L(n) là số lần chuyển đĩa trong bài toán n đĩa. Bằng quy nạp, chứng minh rằng có một cách sắp xếp sao cho L(n) = 2 n - 1. Lời giải. a) Trường hợp n = 1: Chuyển đĩa từ cọc A → C. Như vậy L(1) = 1 = 2 1 – 1. bài toán được giải quyết với n = 1. b) Trường hợp n = 2: Lần lượt chuyển như sau - Chuyển đĩa nhỏ nhất từ A → B; - Chuyển đĩa to nhất từ A → C; - Chuyển đĩa nhỏ nhất từ B→ C. Như vậy, L(2) = 3 = 2 2 – 1. Bài toán được giải quyết với n = 2. Giả sử bài toán n – 1 đĩa đã được giải quyết, khi đó bài toán n đĩa sẽ được thực hiện qua 3 bước như sau: 1. Chuyển n – 1 đĩa trên cùng từ A → B (theo giả thiết quy nạp bài toán này thực hiện được). 2. Chuyển đĩa to nhất còn lại từ A → C (Bài toán 1 đĩa). 3. Chuyển n – 1 đĩa trên cùng từ B → C (theo giả thiết quy nạp bài toán này thực hiện được). 8 Do đó, bài toán n + 1 đĩa được giải quyết và số lần chuyển trong bài toán gồm n + 1 đĩa sẽ là: L(n + 1) = 1 + L(n) + L(n) = 1 + 2L(n) = 1 + 2(2 n - 1) = 2 n + 1 - 1. Như vậy, nếu 1 giây chuyển được 1 đĩa từ cột này tới cột kia, thì thời gian chuyển 64 đĩa sẽ là 2 64 - 1 giây (khoảng 58 tỉ năm). 1.1.5. Thuật toán giải đệ quy bài toán Tháp Hà Nội - Đặt tên các cọc là A, B, C những tên này có thể chuyển ở các bước khác nhau (ở đây: A = Cọc Nguồn, C = Cọc Đích, B = Cọc Trung Gian). - Gọi n là tổng số đĩa. - Đánh số đĩa từ 1 (nhỏ nhất, trên cùng) đến n (lớn nhất, dưới cùng) Để chuyển n đĩa từ cọc A sang cọc B thì cần: 1. chuyển n - 1 đĩa từ A sang B. Chỉ còn lại đĩa n trên cọc A 2. chuyển đĩa n từ A sang C 3. chuyển n - 1 đĩa từ B sang C cho chúng nằm trên đĩa n Phương pháp trên được gọi là thuật giải đệ quy: để tiến hành bước 1 và 3, áp dụng lại thuật giải cho n - 1. Toàn bộ quá trình là một số hữu hạn các bước, vì đến một lúc nào đó thuật giải sẽ áp dụng cho n = 1. Bước này chỉ đơn giản là chuyển một đĩa duy nhất từ cọc A sang cọc C. 1.1.6. Ngôn ngữ Pascal biểu diễn thuật toán giải bài toán tháp Hà Nội VAR n: Integer; Procedure chuyen (sodia: Integer; CotNguon: Char; CotDich: Char; CotTG: Char); Begin If sodia > 0 then begin chuyen (sodia-1, CotNguon, CotTG, CotDich); writeln (CotNguon, '->', CotDich); { Dia lon nhat hien tai } 9 chuyen (sodia-1, CotTG, CotDich, CotNguon) end; End; BEGIN write('Hay nhap so dia: '); Readln(n); chuyen(n,'A','C','B'); {chuyen tu cot A sang cot C voi cot B lam trung gian} readln; END. 1.1.7. Ngôn ngữ C viết trên Dev C++ của thuật toán giải bài toán Tháp Hà Nội #include <cstdlib> #include <iostream> #include <conio.h> using namespace std; void chuyen(int sodia, char CotNguon, char CotDich, char CotTG) { if (sodia>0) { chuyen(sodia- 1, CotNguon, CotTG, CotDich); cout<<CotNguon<<"->"<<CotDich<<"\n"; chuyen(sodia -1, CotTG, CotDich, CotNguon); } } int main() { char CotNguon,CotDich,CotTG; int n; 10 . tôi trình bày các kết quả cơ sở về độ phức tạp của thuật toán, một số thuật toán số học và độ phức tạp của một số thuật toán số học. Luận văn được hoàn. tôi chọn đề tài của Luận văn là Về độ phức tạp của các thuật toán số học nhằm tìm hiểu sâu hơn ứng dụng về các thuật toán số học trong Tin học. Với mục

Ngày đăng: 23/12/2013, 19:11

Hình ảnh liên quan

Để hình dung được phần nào độ phức tạp của các các thuật toán khi làm việc với những số lớn, ta xem bảng dưới đây, cho khoảng thời gian cần thiết  để phân tích một số nguyên  n  ra thừa số nguyên tố bằng thuật toán nhanh  nhất được biết hiện nay: - Về độ phức tạp của các thuật toán số học luận văn thạc sĩ toán học

h.

ình dung được phần nào độ phức tạp của các các thuật toán khi làm việc với những số lớn, ta xem bảng dưới đây, cho khoảng thời gian cần thiết để phân tích một số nguyên n ra thừa số nguyên tố bằng thuật toán nhanh nhất được biết hiện nay: Xem tại trang 38 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan