BÁO CÁO MÔN HỌC MẬT MÃ VÀ AN TOÀN DỮ LIỆU TÍNH LŨY THỪA VỚI SỐ MŨ LỚN THEO MODULO. Yêu cầu của bài toán tính lũy thừa với số mũ lớn theo phép tính modulo là làm sao tính được phần dư của phép chia ad cho N một cách nhanh nhất, với a, d, N là các số tự nhiên lớn, có thể có hàng trăm chữ số.
Trang 1Lời cảm ơn
Trước tiên, em xin gửi lời cảm ơn sâu sắc nhất đến hai thầy Phạm Bảo Sơn, thầy Nguyễn Phương Thái đã không quản vất vả hướng dẫn em trong suốt thời gian làm khóa luận tốt nghiệp vừa qua.Em cũng chân thành cảm ơn mọi người ở phòng HMI lab đặc biệt là hai anh Nguyễn Quốc Đại và Nguyễn Quốc Đạt đã luôn chỉ bảo mỗi khi em
có những vấn đề vướng mắc
Em xin bày tỏ lời cảm ơn sâu sắc đến các thầy cô giáo trong Trường Đại Học Công Nghệ đã tận tình dạy dỗ em suốt bốn năm học qua
Con xin cảm ơn bố, mẹ và gia đình đã luôn bên con, cho con động lực để làm việc tốt hơn Cảm ơn tất cả bạn bè đã luôn sát cánh cùng tôi
Hà Nội, ngày 20 tháng 5 năm 2011
Ma Trọng Khôi
ĐẠI HỌC CÔNG NGHỆ ĐẠI HỌC QUỐC GIA HÀ NỘI
TÍNH LŨY THỪA VỚI SỐ MŨ LỚN THEO MODULO
BÁO CÁO MÔN HỌC MẬT MÃ VÀ AN TOÀN DỮ LIỆU
Giảng viên : PGS.TS Trịnh Nhật Tiến
Học viên : Ma Trọng Khôi
Hà Nội – 2014
Trang 2Mục lục
Lời cảm ơn 1
Mục lục 1
Chương 1 2
Giới Thiệu 2
Chương 2 3
Phương Pháp Giải Bài Toán 3
1 Thuật toán nhị phân 3
2 Thuật toán m-ary 4
3 Phương pháp cửa sổ trượt 5
3.1 Cửa sổ trượt có độ rộng cố định 6
3.2 Cửa sổ trượt có kích thước không cố định 6
4 Thuật toán cây lũy thừa 7
4.1 Chuỗi cộng 7
4.2 Cây lũy thừa 7
Chương 3 9
Thực Nghiệm 9
Chương 4 13
Kết Luận 13
Tài Liệu Tham Khảo 14
Trang 3Chương 1
Giới Thiệu
Yêu cầu của bài toán tính lũy thừa với số mũ lớn theo phép tính modulo là làm sao
nhiên lớn, có thể có hàng trăm chữ số
Trong Toán học và Mã hóa thong tin thì đây là một phép toán khá quan trọng vì nó được ứng dụng ở rất nhiều lĩnh vực Lấy ví dụ như trong thuật toán mã hóa RSA [1], kiểm tra số nguyên tố [2]
lấy phần dư thì có thể thấy là cách tính không khả thi vì với a, d, N có tới hàng trăm chữ số Máy tính tuy có khả năng tính toán rất lơn nhưng việc thực hiện hàng trăm phép nhân số lớn đòi hỏi một bộ nhớ và thời gian tính toán rất lớn và không thực tế Nội dung báo cáo sẽ giới thiệu các phương pháp để thực hiện phép tính một cách
hiệu quả Trong chương 2 sẽ lần lượt giới thiệu các phương pháp nhị phân [2], m-ary,
cửa sổ trượt, chuỗi cộng và cây lũy thừa Chương 3 sẽ giới thiệu một chương trình
thực của báo cáo Và cuối cùng các kết luận phân tích được sẽ là nội dung của chương 4
Trang 4Chương 2
Phương Pháp Giải Bài Toán
Nội dung chương nhắc lại một số kiến thức cơ bản của đại số tuyến tính để phục vụ cho các nội dung của chương sau
1 Thuật toán nhị phân
Gọi là phương pháp nhị phân vì ta sẽ quy đổi d về dạng nhị phân, khi đó d sẽ có dạng:
Một câu hỏi đặt ra là tại sao lại chọn hệ cơ số 2 để biểu diễn d mà không chọn hệ
cơ số khác lớn hơn, vì hệ cơ số càng lớn thì số phép nhân chẳng phải sẽ càng ít hơn? Câu trả lời là trong máy tính các số được biểu diễn ở dạng nhị phân, nên khi cần tính
số lớn hơn thì ta cần thực hiện các phép toán khác phức tạp và mất nhiều thời gian
Trang 5Dưới đây là chương trình viết bằng ngôn ngữ Pascal sử dụng phương pháp nhị phân [2]
2 Thuật toán m-ary
Cũng tương tự phương pháp nhị phân, nhưng ta biểu diễn số d ở dạng cơ số khác:
Ví dụ: với d = 250, và ta chọn k = 2, m = 4 Khi đó:
d = 250 = 11 11 10 10 Giá trị k = 2 có ý nghĩa khi biểu diễn d ở dạng nhị phân thuật toán sẽ quét lần lượt 2 số trên mỗi vòng lặp (với phương pháp nhị phân là quét 1 số với mỗi vòng lặp)
ví dụ trên ta cần tính a0, a1, a2, a3
Trang 6Sau đấy ta thực hiện vòng lặp quét qua chuỗi nhị phân của d từ trái qua phải (ta cũng có thể quét theo chiều ngược lại nhưng sẽ cần thêm một biến nhớ nữa khi viết chương trình), mỗi vòng lặp ta lấy ra hai bit của d Với ví dụ này ta sẽ cần 4 vòng lặp
và các phép tính cần thực hiện được mô tả như bảng sau
tối ưu hơn bằng cách thay sửa lại bước a ở mỗi vòng lặp, thay vì thực hiện hai phép nhân ta sẽ dùng phép toán dịch chuyển bit, dịch trái hai bit, như vậy số phép nhân cần thực hiện chỉ còn 2 + 3 phép nhân
Độ phức tạp của thuật toán là:
3 Phương pháp cửa sổ trượt
Đây là phương pháp cải tiến cho thuật toán m-ary Ta nhận thấy khi quét các bit của d các phép nhân cần tính sẽ chỉ phát sinh khi ta gặp các bit 1 Phương pháp cửa sổ trượt nhằm hạn chế số phép nhân dư thừa phải thực hiện khi quét mà chỉ gặp bit 0
Trước tiên ta định nghĩa cửa sổ trượt Cửa sổ trượt là số bit ta sẽ xử lỷ trong mỗi vòng lặp khi quét qua các bit của d (trong thuật toán nhị phân cửa sổ trượt có độ rộng
là 1, và trong ví dụ của thuật toán m-ary cửa sổ trượt có độ rộng là 2) Trong phương pháp này các cửa sổ sẽ có độ rộng tùy biến nhằm thực hiện phép tính một cách hiệu quả nhất
Phương pháp cửa sổ trượt lại tria làm hai phương pháp nhỏ khác tương ứng với cửa sổ trượt sử dụng đó là cửa sổ trượt có kích thước cố định và cửa sổ trượt có kích thước không cố định
Trang 73.1 Cửa sổ trượt có độ rộng cố định
Với phương pháp này cửa sổ được chia làm hai loại là cửa sổ chỉ chứa các bit 0 và cửa
sổ có ít nhât một bit 1, cửa sổ có chứa bit 1 sẽ có độ dài cố định là một số tự nhiên w
tự nhiên cho trước Các cửa sổ sẽ được xây dựng theo quy tắc sau
cho trước (w є N, w > 0)
Ví du: với d = 3665 = 111 00 101 0 001 Ta có 5 cửa sổ, các bước tính toán của thuật toán như sau:
3.2 Cửa sổ trượt có kích thước không cố định
Phương pháp này cũng có hai loại cửa sổ, loại 1 là cửa sổ chỉ có bit 0, và cửa sổ có chứa bit khác 0 Hai loại cửa sổ này sẽ được nhận biết theo quy tắc sau:
Cho trước hai số tự nhiên w và q > 0
Ví dụ: với w = 5 và q = 2, d = 11173 Các cửa sổ xác định được: 101 0 11101 00 101
Để đoán nhận được các cửa sổ ta có thể dụng Automat được thiết kế như sau:
Trang 84 Thuật toán cây lũy thừa
Trước khi trình bày vào thuật toán ta sẽ tìm hiểu về chuỗi cộng trước, các tính chất của
chuỗi cộng là cơ sở cho thuật toán cây lũy thừa
4.1 Chuỗi cộng
sao cho ak = ai + aj
Ta có thể thấy với các phương pháp trước các phép nhân cần thực hiện có thể quy đổi
về một chuỗi cộng tương ứng
a8, a16, a23, a32, a55 Để tính được a2 ta phải tính a1 * a1, hay a23 = a7 * a16 Ta có thể thấy các lũy thừa của chuỗi số này chính là một chuỗi cộng: 1, 2, 3, 4, 7, 8, 16, 23, 32, 55 Các phương pháp m-ary, cửa sổ trượt về cơ bản cũng là tìm một chuỗi cộng
4.2 Cây lũy thừa
Phương pháp cây lũy thừa [4] sẽ xây dựng chuỗi cộng trước bằng cách xây dựng một cây lũy thừa có tính chất của chuỗi cộng Sau đó thứ tự các phép nhân sẽ được thực hiện giựa theo cây này Cây lũy thừa được xây dựng theo quy tắc sau:
độ cao là 1 với nút gốc bằng 1)
Trang 9 Ta sẽ xây dựng các nút có độ cao là k+1 Bằng cách ta xét các nút ở độ cao k,
có giá trị bằng tổng Còn nếu tổng của chúng đã có trong cây thì không làm gì cả
Ví dụ: ta xây dựng được một cây lũy thừa như sau:
Sauk hi xây dựng được cây rồi, giả sử ta có d = 26, ta lần ngược từ nút 26 đến nút gốc
phép nhân sau: a1, a2 = a1 * a1, a3 = a2 * a1, a5 = a2 * a3, a10 = a5 * a5, a13 = a10 * a3, a26 =
a13 * a13
Trang 10Chương 3
Thực Nghiệm
Nội dung chương sẽ trình bày về chương trình tính lũy thừa với số mũ lớn theo modulo
Mã nguồn của chương trình được viết bằng Java sử dụng thuật toán nhị phân và
đã được đóng gói vào file ExponentialModulo.jar Để thực thi được chương trình này thì có các yêu cầu sau
Yêu cầu:
( http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html)
Input:
mod N sẽ được biểu diễn trên 1 dòng Chương trình cho phép bạn thực hiện nhiều phép tính cùng một lúc, bằng cách có thể biều diễn trên nhiều dòng các phép tính Trong đó mỗi dòng sẽ là một bộ 3 sô a, d, N tương ứng và cách nhau bởi dấu cách
3 3 4
5 6 7
Output:
ứng với kết quả của file input Với ví dụ input trên kết quả sẽ có hai dòng là: 3
1
Trang 11Mã nguồn của chương trình:
Trang 14Chương 4
Kết Luận
Nội dung báo cáo đã trình bày một số thuật toán thông dụng áp dụng để tính phép toán
lũy thừa với số mũ lớn theo modulo như thuật toán nhị phân, m-ary, cửa sổ trượt, cây
lũy thừa Về bản chất của các thuật toán đều là xây dựng một chuỗi cộng để tính số mũ
và thực hiện phép toán với ít phép nhân nhất Kết quả thực nghiệm cũng cho thấy tính hiệu quả của thuật toán nhanh và chính xác
Trang 15Tài Liệu Tham Khảo
[1] http://en.wikipedia.org/wiki/RSA_(cryptosystem)
[2] Hans Riesel, “Prime Numbers and Computer Methods for Factorization”,
P83-94, ISBN 978-0-8176-8297-2, Springer New York Dordrecht Heidelberg London [3] http://en.wikipedia.org/wiki/Exponentiation_by_squaring
[4] Donald E Knuth “The Art Of Computer Programming Vol 3”.