6. Ý nghĩa khoa học và thực tiễn cửa đề tài
2.2.4 Phép nhân hai số lớn không âm [2], [4], [5], [9]
Có nhiều cách để nhân hai số, trong luận văn này việc phép nhân hai số lớn sẽ áp dụng theo thuật toán Ấn Độ. Theo thuật toán Ấn Độ việc nhân hai số chỉ cần thực hiện các phép tính tự chia hai, phép tự nhân hai và phép tính cộng. Tƣ tƣởng của thuật toán này nhƣ sau:
“Có một thùng nước rất to và có một cái gáo nhỏ 25 lít, nếu múc 66 gáo thì đầy cái thùng lớn, như vậy người múc nước họ mới nghĩ rằng lấy cái gáo lớn gấp đôi (50 lít) thì chỉ cần 33 lần là đầy. Họ đã nghĩ được như vậy thì sao không lấy cái gáo gấp 4 lần (100 lít) thì múc 16 lần sẽ đầy nhưng mà nếu vậy thì ăn gian mất một gáo 50 lít rồi, khỏi cần suy nghĩ, người đó sẽ múc một gáo 50 lít bỏ vào trước. Tiếp tục như vậy đã có cái gáo gấp 4 lần thì việc gì không tìm cái gáo gấp 8 lần (200 lít) để chỉ cần múc 8 lần là đây, cứ như vậy nếu cái gáo gấp 16 lần (400 lít) thì chỉ cần múc 4 lần là đầy, cái gáo gấp 32 lần (800 lít) chỉ cần múc 2 lần là đầy, cái gáo gấp 64 (1600 lít) thì múc 1 lần là đầy, cái gáo gấp 128 lần (3200 lít) thì múc 0 lần là đầy, nếu như vậy thì ăn gian rồi vì đến đây
không thể thực hiện được mà phải múc 1 gáo 1600 lít bỏ vào thùng đã. Để ý xem trong thùng chúng ta đã có lượng nước = gáo 50 lít rồi giờ cộng thêm gáo 1600 lít nữa là 1650 lít là đầy thùng.”
Từ ý tƣởng đó chúng ta xây dựng cách nhân 2 số tự nhiên bất kỳ x y nhƣ sau, chia x cho 2 và nhân y cho 2 quá trình trên lặp lại đến khi không chia đƣợc x
nữa thì dừng (nên nhớ x, y thuộc N), chỗ nào mà x lẻ thì sẽ cộng y tƣơng ứng vào nhƣ vậy sẽ ra kết qủa.
Thí dụ: Tính tích Z của x = 62 với y = 25 Z = x y 66 25 33 50 16 100 8 200 4 400 2 800 1 1600 0 3200 Z = 50 + 1600
Cơ sở toán học của thuật toán nhƣ sau:
Z = x y = 2y nếu x là chẵn
Z = x y = 2y + y nếu x là lẻ 33 50 = 100 + 50
33 50 = (32 + 1) 50 = 32 50 + 50 = 1600 + 50 = 1650
Input: Hai đối tƣợng số lớn không âm x, y có độ dài len1 và len2 Output: Đối tƣợng Z = x y Algorithm: Mult(x,y) 1 x.chia2(); y.nhan2() 2 Z = 0; 3 While(x !=0 ) if (x lẻ) Z = Z + y; x.chia2(); y.nhan2(); } 4 Return Z;
Độ phức tạp của thuật toán: