Tải bản đầy đủ (.docx) (15 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (441.19 KB, 15 trang )

Lờ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
Mục lục
2
Chươ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
tính được phần dư của phép chia a
d
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ố.
a


d
≡ ? (modulo N) (1)
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].
Để giải bài toán này nếu ta thực hiện d-1 phép nhân để tính a
d
sau đấy chia cho N
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.
3
Chươ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:
Với β
i
, 0 ≤ i ≤ log
2
(d) có thể nhận các giá trị 0 và 1. Khi đó a
d


sẽ bằng:
Ta thấy để tính a
d

thì chỉ cần quan tâm đến các trường hợp β
i
= 1, 0 ≤ i ≤ log
2
(d).
Ví dụ: tính c = a
169
Ta có thể tính được kết quả theo bảng trên, c sẽ bằng a
1
* a
8
* a
32
* a
128
. Số phép nhân
cần thực hiện là 7 (tính a
128
) + 3 (các phép nhân a
1
, a
8
, a
32
, a
128

với nhau).
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
các giá trị β
i
ta chỉ cần thực hiện phép toán rất nhanh là dịch chuyển bit. Nếu chọn hệ
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
hơn, ví dụ phép modulo, để tìm β
i

4
Dướ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]
Độ phức tạp của thuật toán phụ thuộc vào d và bằng O(log
2
(d)). Số lượng phép
nhân cần thực hiện bằng log
2
(d) + số phần tử của tập { β
i
= 1| 0 ≤ i ≤ log
2
(d)}. Như
vậy cần tối thiểu là log
2
(d) và tối đa là 2 * log
2
(d).
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:
Phương pháp này sẽ hiệu quả và tối ưu khi ta chọn m = 2
k
(k є N, k > 0)
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).
Đầu tiên thuật toán sẽ phải tính trước các phần dư của a
0
, a
1
,…, a
m-1
cho N. Như
ví dụ trên ta cần tính a
0
, a
1
, a
2
, a
3
.
5
Sau đấ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
Số phép nhân cần thực hiện là: 2 (tính a

2
, a
3
) + 6 (bước a) + 3 (bước b). Ta có thể
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
6
3.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.
• Cửa sổ có các bit chỉ có giá trị 0 thì có chiều dài tùy ý
• Cửa sổ nếu có ít nhất một bit là 1 thì phải có độ dài là w – là một số tự nhiên
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
• Các cửa sổ chỉ chứa bit 0 phải có độ dài tối thiểu lớn hơn q
• Các cửa sổ có chứa bit 1 phải có độ dài không vượt quá w
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:
7
4. 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
Chuỗi cộng là một chuỗi số tự nhiên a
0
, a
1
,…, a
n
. Chuỗi số này có hai tính chất:
• a
0
= 1
• Với một số tự nhiên k ≤ n bất kỳ, ta luôn tìm được hai số tự nhiên i, j: 0 ≤ i,j ≤ n
sao cho a
k
= a
i
+ a
j

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.
Ví dụ: phương pháp nhị phân với d = 55. Để tính được a
55
ta sẽ cần tính a
1
, a
2
, a
3
, a
4
, a
7
,
a
8
, a
16
, a
23
, a
32
, a
55
. Để tính được a2 ta phải tính a
1
* a
1
, hay a

23
= a
7
* a
16
. 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
tương ứng với a
n
= d. Và người ta đã chứng minh được rằng bài toán tìm một chuỗi
cộng ngắn nhất sao cho a
n
= d là một bài toán NP.
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:
• Giả sử đã xây dựng được cây có độ cao là k (ta luôn có thể dựng được cây có
độ cao là 1 với nút gốc bằng 1)
8
• 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,
giả sử ta có nút e
i
có độ cao k. thực hiện phép cộng e
i
với các nút e
j
(j ≤ i) đang
có trên cây. Nếu tổng của chúng chưa có trên cây thì ta tạo nút con mới của e

i
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
sẽ thu được một chuỗi cộng: 1 2 3 5 10 13 26. Như vậy để tính a
25
, ta sẽ thực hiện các
phép nhân sau: a
1
, a
2
= a
1
* a
1
, a
3
= a
2
* a
1
, a
5
= a
2
* a
3
, a
10

= a
5
* a
5
, a
13
= a
10
* a
3
, a
26
=
a
13
* a
13
9
Chươ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:
• Máy tính đã phải được cài đặt JRE
( />1880261.html).
Input:
• Chương trình sẽ đọc dữ liệu từ file input.txt, trong đó mỗi một phép tính a

d
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.
Ví dụ: nếu cần tính 2
3
mod 4 và 5
6
mod 7 thì file input sẽ có hai dòng như sau:
3 3 4
5 6 7
Output:
• Kết quả sẽ được lưu ra file output.txt, trong đấy mỗi dòng sẽ là một số tương
ứ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
10
Mã nguồn của chương trình:
11
12
13
Chươ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.
14

Tài Liệu Tham Khảo
[1]
[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] />[4] Donald E. Knuth. “The Art Of Computer Programming Vol. 3”.
15

×