Cộng hai số tự nhiên lớn

Một phần của tài liệu (LUẬN văn THẠC sĩ) cài đặt máy turing và ứng dụng máy turing đánh giá độ phức tạp thuật toán (Trang 62 - 74)

- Tư tưởng thuật toán:

Với bài toán này học viên quy định bộ dữ liệu đầu vào được viết theo quy cách: “a+b=”. Với a, b là các số tự nhiên lớn (nhiều chữ số không quy định độ dài với mỗi số a và b). “a” là số hạng 1, “b” là số hạng 2.

Ví dụ:

Input: 123+45=

Bước 1: Khởi tạo bộ nhớ imem và bộ nhớ ngăn xếp (stack).

Bước 2: Tìm chữ số phải nhất của số hạng 1. Đầu đọc ghi máy Turing gặp bất cứ kí tự nào tự động dịch phải cho đến khi gặp kí tự “+” đầu đọc ghi dịch trái tìm chữ số phải nhất của số hạng 1. Khi đầu đọc ghi trỏ vào chữ số phải nhất của số hạng 1 chia thành hai trường hợp:

+ imem rỗng (chưa nhớ) ghi kí tự đang được trỏ vào imem.

+ imem khác rỗng (đang nhớ) cộng kí tự đang được trỏ vào imem. Chuyển kí tự vừa xét thành ?.

Bước 3: Tìm chữ số phải nhất của số hạng 2. Chuyển đầu đọc ghi của máy Turing về phải. Khi gặp kí tự “=”, đầu đọc ghi dịch trái tìm chữ số phải nhất của số hạng 2. Khi đầu đọc ghi máy Turing tìm được chữ số phải nhất của số hạng 2 cộng dồn vào bộ nhớ imem. Cộng xong chuyển kí tự đang được đầu đọc ghi trỏ vào thành “?”. Chuyển đầu đọc ghi về sau kí tự “=” ghi giá trị trong imem. Chuyển đầu đọc về chữ số phải nhất của kết quả tạm, ghi kí tự này vào bộ nhớ stack, chuyển kí tự vừa xét thành “#”. Dịch trái đầu đọc ghi, xảy ra hai trường hợp sau:

+ Đầu đọc ghi trỏ vào kí tự “1”, phép cộng có nhớ. Làm rỗng imem, ghi “1” vào imem. Chuyển “1” thành “#”, dịch trái đầu đọc ghi về đầu xâu.

+ Đầu đọc ghi trỏ vào kí tự “=”, phép cộng không nhớ, dịch trái đầu đọc ghi về đầu xâu.

Trở về trạng thái ban đầu. Bắt đầu vòng lặp.

Bước 4: Điều kiện kết thúc là khi các chữ số của hai số a,b được chuyển thành “?”, bộ nhớ imem, bộ nhớ stack được làm rỗng.

Các trường hợp kết thúc:

+ a và b có số chữ số bằng nhau. Khi máy Turing xác nhận trạng thái tất cả chữ số của số hạng 1 chuyển thành kí tự “?” và gặp trạng thái tất cả chữ số của số hạng 2 chuyển thành kí tự “?”. Đầu đọc ghi dịch phải đến vị trí sau dấu bằng “=”, nếu imem không rỗng nạp kí tự đó vào stack, làm rỗng imem, ghi kết quả. Dừng chương trình.

+ a có ít chữ số hơn b. Khi máy Turing xác nhận trạng thái tất cả chữ số của số hạng 1 chuyển thành kí tự “?” và số hạng 2 vẫn còn chữ số chưa chuyển thành kí tự “?”. Đầu đọc dịch phải đến hết xâu, dịch trái tìm chữ số phải nhất của số hạng 2. Khi tìm được, nếu imem rỗng nạp kí tự đó vào stack, dịch trái đến khi gặp trạng thái tất cả chữ số của số hạng 2 chuyển thành kí tự “?” (đầu đọc gặp kí tự “+”) chuyển đầu đọc ghi về vị trí sau dấu bằng “=” ghi kết quả, làm rỗng imem và stack.

+ a có nhiều chữ số hơn b. Khi máy Turing xác nhận trạng thái tất cả chữ số của số hạng 2 chuyển thành kí tự “?” và số hạng 1 vẫn còn chữ số chưa chuyển thành “?”. Đầu đọc ghi chuyển về vị trí sau dấu bằng “=”, ghi kết quả trong imem vào stack, nếu có nhớ làm rỗng imem ghi số nhớ, dịch trái con trỏ tìm chữ số phải nhất của số hạng 1 nạp vào imem, chuyển thành “?”. Lặp lại quá trình trên đến khi gặp trạng thái tất cả chữ số của số hạng 2 chuyển thành kí tự “?” (đầu đọc gặp kí tự “+”) chuyển đầu đọc ghi về vị trí sau dấu bằng “=” ghi kết quả, làm rỗng imem và stack.

- Mã lệnh chương trình:

%=========================

% Cong hai so tu nhien lon

% ************************

// khoi tao imem stack

1 _ $i N 2 // khoi tao imem

2 _ $s N 3 // khoi tao stack

// bat dau

3 + _ L 4 tim thay +

4 {0,1,2,3,4,5,6,7,8,9} _ N 5 // tim chu so nho nhat

4 ? _ L 4 // day trai tim so hang can cong

4 # _ N 120 // sh1 het

5 _ $I N 6 7 // xet imem rong

6 {0,1,2,3,4,5,6,7,8,9} $< N 8 // day chu so nho nhat vao imem (1)

8 {0,1,2,3,4,5,6,7,8,9} ? N 12 // chuyen chu so da cong thanh ? (2)

7 _ $- N 9 // lam rong stack

9 {0,1,2,3,4,5,6,7,8,9} $< N 10 // (1)

10 _ $+ N 11 // tra lai 1 da xoa o imem

11 {0,1,2,3,4,5,6,7,8,9} ? N 12 // (2)

12 _ _ R 12 // day phai tim chu so o sh 2

12 = _ N 13 13 _ _ L 13 13 + _ N 80 // sh2 het // tim so hang 2 13 9 _ N 15 13 8 _ N 16 13 7 _ N 17 13 6 _ N 18 13 5 _ N 19 13 4 _ N 20

13 3 _ N 21

13 2 _ N 22

13 1 _ N 23

// cong don sh2 vao imem

15 _ $+ N 16 16 _ $+ N 17 17 _ $+ N 18 18 _ $+ N 19 19 _ $+ N 20 20 _ $+ N 21 21 _ $+ N 22 22 _ $+ N 23 23 _ $+ N 24

24 {0,1,2,3,4,5,6,7,8,9} ? N 24 // bien chu so da cong thanh ?

// ghi ket qua tam

24 _ _ R 24

24 = _ R 25 // tim dau =

25 _ $> N 26 // lay gia tri tu imem

26 _ _ R 26 // tim # o cuoi

26 # _ L 27 // tim thay #

27 {0,1,2,3,4,5,6,7,8,9} $[ N 28 // nap chu so dang o cuoi

29 _ $I N 30 31 30 1 $< N 32 32 1 # L 33 30 = _ N 33 31 _ $- N 29 33 _ _ L 33 33 # _ R 3 // vong lap // sh2 het truoc 80 _ _ R 80 80 # $> N 81 81 _ _ R 82 82 _ _ R 82 82 # _ L 83 83 {0,1,2,3,4,5,6,7,8,9} $[ N 84

84 {0,1,2,3,4,5,6,7,8,9} # L 85 //ghi tam xong

85 _ $I N 86 87 86 1 $< N 88 88 1 # L 89 86 = _ N 89 87 _ $- N 85 // sh2 da cong het 89 _ _ L 89 89 # $> N 92

92 {0,1} $[ N 93 93 {0,1} # N 94 94 _ $I N 95 96 95 _ _ N 100 96 _ $- N 94 89 {0,1,2,3,4,5,6,7,8,9} $I N 90 91 90 {0,1,2,3,4,5,6,7,8,9} $[ L 90 90 # _ N 100 91 _ $- N 97 97 {0,1,2,3,4,5,6,7,8,9} $< N 98 98 _ $+ N 99 99 {0,1,2,3,4,5,6,7,8,9} ? N 111 111 _ _ N 80 // sh1 het 120 _ _ R 120 120 + _ R 121 121 _ _ R 121 121 # _ _ 122 122 _ _ L 122 122 + $I N 100 128 128 _ _ R 128 128 # $> N 129

129 _ _ R 129 129 # _ L 130 130 1 $[ N 131 131 1 # N 132 132 _ _ L 132 132 + _ N 100 122 {0,1,2,3,4,5,6,7,8,9} $I N 123 124 123 _ $[ N 125 125 {0,1,2,3,4,5,6,7,8,9} ? L 122 124 9 0 N 126 126 _ $[ N 127 127 0 ? N 122 124 {0,1,2,3,4,5,6,7,8} $& N 133 133 _ $[ N 134 134 _ $I N 136 137 136 _ ? N 122 137 _ $- N 134 // ket thuc 100 _ _ R 100 100 = _ R 101 101 _ $S N 102 103

102 _ _ _ 0

103 _ $] R 101

E

- Trong mã lệnh trên.

Bảng chữ cái là: các chữ số từ 0 đến 9, dấu cộng “+”, dấu bằng “=”, dấu hỏi chấm “?”, kí tự khoảng trắng mặc định là “#”.

Tập trạng thái: 0,1,2,3,4,5,6,7,8,9… 13, 15, 16… 33,80,81 … 103, 111,120,121… 134. Trong đó trạng thái bắt đầu là 1, trạng thái kết thúc là 0.

Sử dụng bộ nhớ imem, bô nhớ stack và các toán tử liên quan đến imem, stack.

Các kí hiệu %, // là toán tử điều khiển chú thích.

- Mô phỏng với bộ số đầu vào 2015+3999= (hai số 4 chữ số)

Input: #2015+3999=# (10)

Final output: #????+????=6014# (14)

Timer: 315

Vậy với thuật toán trên máy Turing cần 315 bước chuyển và ô nhớ cần 14 ô (vì các bước chuyển trung gian quá dài nên học viên chỉ đưa ra kết quả cuối cùng, số ô nhớ 14 là số ô được dùng trong quá trình xử lý của thuật toán).

- Mô phỏng với bộ số đầu vào 33+3456= (số hạng 1 có ít chữ số số hạng 2)

Input: #33+3456=# (8)

Final output: #??+????=3489# (12)

Vậy với thuật toán trên máy Turing cần 164 bước chuyển và ô nhớ cần 12 ô (vì các bước chuyển trung gian quá dài nên học viên chỉ đưa ra kết quả cuối cùng, số ô nhớ 12 là số ô được dùng trong quá trình xử lý của thuật toán).

- Mô phỏng với bộ số đầu vào 3389+56= (số hạng 2 có ít chữ số số hạng 1)

Input: #3389+56=# (8)

Final output: #??+????=3445# (12)

Timer: 223

Vậy với thuật toán trên máy Turing cần 223 bước chuyển và ô nhớ cần 12 ô (vì các bước chuyển trung gian quá dài nên học viên chỉ đưa ra kết quả cuối cùng, số ô nhớ 12 là số ô được dùng trong quá trình xử lí của thuật toán).

3.5. Kết luận

Trong chương này học viên đã trình bày chương trình cài đặt một số bài toán trên máy Turing và trình bày cụ thể các thành phần, ví dụ mô phỏng quá trình thực hiện của máy. Trong qua trình cài đặt học viên đã sử dụng bộ nhớ được cải tiến ở chương 2 của máy Turing cụ thể như sau:

- Bài toán trừ 1 vào số tự nhiên nhằm giới thiệu cách viết mã lệnh cho máy Turing.

- Bài toán biểu diễn số thập phận n thành (n+1) vạch thẳng “|” và bài toán biểu diễn (n+1) vạch thẳng “|” thành số tự nhiên n. Trong hai bài toán này học viên đã cài đặt bằng 2 phương pháp có so sánh, phương pháp 1 dùng máy Turing thường, phương pháp 2 học viên đã sử dụng bộ nhớ imem để tăng hiệu quả làm việc của máy Turing.

- Bài toán cộng hai số tự nhiên lớn. Trong bài toán này học viên sử dụng hai bộ nhớ imem và ngăn xếp để xử lý, qua bài toán này học viên sử dụng các bộ nhớ cùng lúc để tăng hiệu quả hoạt động của máy Turing.

KẾT LUẬN

Thuật toán và độ phức tạp thuật toán là một mảng rất rộng, nếu tìm hiểu tất cả vấn đề đó là một khối lượng kiến thức khổng lồ. Trong luận văn đã tập trung nghiên cứu, trình bày những kiến thức cơ bản về máy Turing, thuật toán và ứng dụng máy Turing vào đánh giá độ phức tạp thuật toán. Qua đó luận văn đã đạt được một số kết quả như sau:

Về lý thuyết:

Luận văn tập trung nghiên cứu các kiến thức chung nhất về máy Turing, thuật toán và độ phức tạp của thuật toán. Luận văn đã phân tích kỹ về độ phức tạp thuật toán của các bài toán ứng dụng.

Về ứng dụng:

Luận văn đã phân tích và cài đặt máy Turing, thông qua đó cài đặt một số bài toán bằng máy Turing.

Phạm vi và khả năng áp dụng.

Luận văn là một tài liệu tham khảo tốt cho cho những người đang tham gia vào việc nghiên cứu thuật toán và độ phức tạp thuật toán.

Hướng nghiên cứu tiếp theo.

Hoàn thiện và tối ưu cài đặt máy Turing để chuẩn hóa thành thước đo thuật toán chính xác, hiệu quả.

TÀI LIỆU THAM KHẢO

Tài liệu tiếng Việt

[1] Nguyễn Thanh Bình (2007), Giáo trình - bài giảng thuật toán nâng cao, trường Đại học Bách khoa - Đại học Đà Nẵng.

[2] Nguyễn Gia Định (2004), Lý thuyết ngôn ngữ hình thức và ôtômát, Đại học Huế.

[3] Nguyễn Hữu Điển (2002), Một số vấn đề về thuật toán, Nxb Giáo dục. [4] Lê Minh Hoàng (2002), Giải thuật và lập trình, Nxb ĐHSP Hà Nội.

[5] Nguyễn Xuân Huy (2012), Sáng tạo trong thuật toán và lập trình, T1,2,3, Nxb Thông tin và truyền thông.

[6] Đỗ Xuân Lôi (1998), Cấu trúc dữ liệu và giải thuật, Nxb Giáo dục.

Tài liệu tiếng nƣớc ngoài

[7] John E. Hopcroft; Jeffrey D.Ullman (2013), Introduction to Automata Theory, Languages and Computation, 5th Edision, Wesley Publishing Company, (Chapter 7: Turing Machines).

[8] Peter Linz (2011), An Introduction to Formal Languages and Automata, 7th Edision, D.C.Heath and Company.

[9] Garey Michael R-David S Johnson (2007), Computers and Intractability: A Guide to the Theory of NP-Completeness, W.H. Freeman.

Một phần của tài liệu (LUẬN văn THẠC sĩ) cài đặt máy turing và ứng dụng máy turing đánh giá độ phức tạp thuật toán (Trang 62 - 74)