VẤN ĐỀ TÍNH TOÁN SỐ LỚN TRÊN MÁY TÍNH.doc

14 1.7K 0
VẤN ĐỀ TÍNH TOÁN SỐ LỚN TRÊN MÁY TÍNH.doc

Đ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

VẤN ĐỀ TÍNH TOÁN SỐ LỚN TRÊN MÁY TÍNH

Trang 1

Chơng II :

Vấn đề tính toán số lớn trên máy tính

I Các vấn đề khai báo số lớn và các phép toán cơ bản trên máy tính.

1 Khai báo số lớn:

Nh đã trình bày trong những phần trớc hệ mật RSA của chúng ta chỉ làm việc trên số nguyên tố Hơn nữa để hệ mật của chúng ta an toàn thì nhất thiết các số nguyên tố của chúng ta phải đủ lớn làm cho các thuật toán phân tích hữu hiệu nhất cũng không có khả năng phân tích Trong phần này em xin trình bày một cách khai báo số lớn trên để làm việc trên máy tính.

Nh chúng ta biết ngôn ngữ C++ là một ngôn ngữ khá mạnh trong công cụ lập trình và nó hỗ trợ rất nhiều kiểu dữ liệu khác nhau nh int, char, float Nhng trong hệ mật RSA muốn bảo mật thì chúng phải làm việc trên số nguyên tố lớn nếu chúng ta sử dụng cách khai báo thông th-ờng thì không thể đáp ứng đợc, chẳng hạn nếu ta dùng kiểu số nguyên (int) thì ta chỉ có thể khai báo các số từ -32769 đến 32767, hoặc khai báo theo kiểu số thực (float hoặc double) thì số lợng số mũ cũng có thể đáp ứng đợc nhng kết quả lại không chính xác mà hệ mật của chúng ta lại yêu cầu độ chính xác rất cao Vì vậy, ta không thể sử dụng các kiểu dữ liệu chuẩn đợc mà phải tự tạo ra kiểu dữ liệu mới để chứa kết quả Cách tốt nhất là ta khai báo dới dạng mảng để chứa các chữ số Trong đó với mỗi phần tử mảng sẽ chứa một số các chữ số Sau đây là cách khai báo số lớn dùng trong chơng trình:

Trang 2

#define C_max 200

typedef unsigned short WORD;typedef WORD So_Lon[C_max];

2 Cách phép toán cơ bản trong trờng dữ liệu.

Sau khi tạo ra kiểu dữ liệu rồi, ta phải định nghĩa các thao tác trên kiểu dữ liệu này Nh chúng ta đã biết, mọi phép toán số học đều đợc định nghĩa qua các phép toán sau đây: Cộng, trừ, nhân, chia và so sánh hai số Nhng trong hệ mật RSA ta chỉ quan tâm đến các phép toán công, trừ, nhân và phép so sánh Sau đây là việc phân tích các thủ tục đó:

a Thủ tục cộng:

Để cộng hai số biểu diễn dới dạng mảng So_Lon ta thực hiện các thao tác sau đây : Lần lợt cộng các phần tử tơng ứng của mảng So_Lon lần lợt từ các phần tử biểu diễn hàng thấp nhất với một byte đợcgọi là “byte nhớ” Byte này xuất phát đợc gán bằng 0 và sau mỗi bớc nó sẽ đợc xác định tuỳ theo việc tính tổng của các phần tử trên còn thuộc hay ngoài phạm vi khai báo của phần tử mảng So_Lon.

Sau đây là thủ tục cài đặt trong môi trờng C : void cong_SL(So_Lon x, So_Lon y)

Trang 3

b Thủ tục trừ:

Đối với thủ tục trừ số lớn sẽ đợc thực hiện tơng tự nh thủ tục cộng ta chỉ cần thay phép cộng trong thủ tục cộng bằng phép trừ cho thủ tục trừ.

Sau đây là thủ tục trừ đã đợc cài đặt trong chơng trình: void tru_SL(So_Lon x, So_Lon y)

Trang 4

Trong thủ tục so sánh hai mảng So_Lon ta làm theo trình tự ngợc lại, tức là lần lợt xét sự bằng nhau của các phần tử tơng ứng bắt đầu từ phần tử biểu diễn hàng cao nhất cho đến khi tìm ra vị trí khác nhau Kết luận lớn hay bé của hai mảng So_lon tơng đơng kết luận tơng ứng của hai

Trang 5

Để nhân hai số kiểu So_Lon với nhau ta không thể dùng phơng pháp nhân thông thờng mà ta cần phải định nghĩa phép nhân cho nó ở đây em muốn nhắc đến một phơng pháp nhân mà tất cả chúng ta đã đợc học khi còn học phổ thông, đó là phép nhân dọc Đây là một phép toán rất phổ thông, em xin nêu một thí dụ nhỏ sau mô tả phép toán nhân dọc nhằm đa ra cơ sở để định nghĩa phép toán cho kiểu dữ liệu đợc khai báo ở trên :

Chúng ta thấy phơng pháp nhân trên đợc thực hiên bởi các tao tác sau :

◊ Lấy lần lợt phần tử của số hạng thứ hai nhân với tất cả các phân tử của số hạng thứ nhất.

◊ Dịch trái một số bớc phù hợp

◊ Cộng hai kết quả nhân trên lại

Theo phần trình bày ở trên kiểu dữ liệu của chúng ta là một mảng số nên ta có thể áp dụng phơng pháp nhân trên cho kiểu dữ liệu của chúng ta nh sau:

◊Ta coi mỗi phần tử trong mảng So_Lon nh là một chữ số trong hai số hạng trên và sử dụng một byte làm số nhớ, ban đầu gán giá trị 0 cho số nhớ.

◊Thực hiện nhân từng phần tử của một số hạng với toàn bộ phần tử của mảng còn lại, sau đó cộng với số nhớ, đợc kết quả đem chia cho

Trang 6

hÖ c¬ sè ( ë trong ch¬ng tr×nh em lÊy hÖ c¬ sè =65536), lÊy sè d lµm kÕt qu¶ cña cña hµng t¬ng øng, th¬ng lµ sè nhí cña sè nhí míi.

◊Céng c¸c kÕt qu¶ trªn l¹i.

§Ó mih ho¹ cho ph¬ng ph¸p trªn em xin ®a ra mét thÝ dô nhá, cã ®iÒu h¬i kh¸c ë ®©y hÖ c¬ sè lµ 10 chø kh«ng ph¶i lµ 65536 nh trong ch¬ng tr×nh :

Gi¶ sö ta nh©n sè 14 víi 12 th×

◊a[1]=1, a[2]=4, b[1]=1, b[2]=2 ta tiÕn hµnh nh sau

◊§Æt nho=0;

◊kq[1]=a[1]* b[1] + nho =1*1+0 =1 → nho=0

◊kq[2] = a[1]*b[2] + nho + a[2]*b[1] +nho = 4*1+0+2*1+0 = 6 →

nho = 0

◊ kq[3] = a[2]*b[2]+nho = 2*4 + 0 → nho = 0.

Mét chó ý khi khai b¸o trong phÐp nh©n lµ m¶ng chøa kÕt qu¶ cã sè ch÷ sè ph¶i gÊp 2 lÇn x, y v× khi x cã n ch÷ sè vµ y cã n ch÷ sè th× tÝch

Trang 8

II Các thuật toán tính Modulo.

1 Thuật toán dựa vào cơ sở đoán nhận thơng nhanh.

ở phần trớc chúng ta đã có một thuật toán tính Modulo theo phơng pháp lùi dần từng chữ số trên cơ sở đoán nhận thơng nhanh trong mỗi b-ớc tính toán, sau đây em sẽ giới thiệu một số thuật toán cùng một kiểu đoán nhận thơng nhanh nhng cho phép trong mỗi bớc của nó có thể lùi lại đợc nhiều chữ số.

a Cơ sở của phơng pháp đoán nhận nhanh.

Điều đầu tiên chúng ta thấy rằng, độ dài của hai số không quá tổng các độ dài của các số đó cộng 1 do vậy nếu N là số có dạng :

Tức là biểu diễm q phân của N= n0n1 nm0 01 với s phần tử bằng 0 ngay trớc phần tử cuối cùng và giá trị của phân tử cao nhất bằng 1, thì rõ ràng ta có:

N=n0+n1q+ +nmqm+qm+s+1.(2.1)

Trang 9

Bổ đề 3 : Cho N là số nguyên tố có dạng (2.1), khi đó nếu X có độ dài dài của N0 là m còn độ dàicủa xm+s+1 xl-1 xl -1 ≤ 1- (m+s+1)= 1-m-s-1 ≤

(m+2s)-(m+s+1)= s-1 cho nên độ dài của tích N0(xm+s+1 xl-1 xl-1) sẽ không quá m+(s -1)+1 =m+s, tức là N0(xm+s+1 xl-1 xl -1) ≤ qm+s+1

hay Z ≥ xm+s+1 xl-1 xl -1 và bổ đề đã đợc chứng minh.

Với kết quả trên ta thấy rằng thơng của hai số X và N thoả mãn giả thiết của bổ đề 3 dễ dàng tìm đợc bởi công thức (2.2) hoặc (2.2’), điều này có nghĩa là nếu N thoả mãn giả thiết của bổ đề 1 thì việc đoán nhận thơng của phép chia sô X cho N sẽ rất dễ dàng.

Bổ đề 4 : Cho số N = n0n1 nk khi đó với mọi i tự nhiên luôn tồn tại số Mi=m0m1 mk0 1 (với i số 0) là bội của N.

Trang 10

Chứng minh :

kí hiệu Mi* = N + qk+i+1 Giả sử R= Mi* mod N rõ ràng R < N, nên nếu lấy Mi = Mi* - R = qk+i+1 (N-R) thì Mi là bội của N và có dạng nh đã nêu.

b Thuật toán tính tích hai số theo modulo N.

Cho trớc N có độ dài là l Khi đó tích hai số X,Y ∈ ZN có độ dìa m< 2l Bây giờ ta xét bộ Mi đợc xác định nh sau i=jk ở đây j1=r jk=2(jk-1-1) và jk<1 Dễ dàng ta thấy rằng

(XY) mod M1 = ( ((XY) mod Mjk mod Mjk-1) mod M1) thì trong mỗi bớc lấy modulo của vế phải ta luôn thực hiện đợc phơng pháp đoán nhận nhanh thơng và do vậy số bớc lấy modulo sẽ chỉ còn lại là LogT với T là số bớc lấy modulo theo phơng pháp đã đợc nêu trong phần trên để tính đợc (X,Y) mod N ta chỉ cần tính thêm r bớc modulo nh phơng pháp trên Ngoài ra ta thấy rằng trong mỗi bớc của thuật toán thì do có thể không cần lấy đúng modulo của Mi nên ta có thể xác định thơng luôn trong công thức (2.2’) thì thời gian thực hiện thuật toán sẽ đợc cải thiện chút ít.

c Việc sử dụng thuật toán tính Modulo trong tính toán luỹ thừa modulo các số lớn.

Trong phần trên (phần b) ta thấy rằng trong thuật toán tính modulo theo phơng pháp đoán nhận thơng nhanh chúng ta cần đến k+r bớc modulo nhanh Trong việc tính XY mod N ta cần thực hiện nhiều lần phép modulo của tích hai số nhng không cần biết kết quả thực của phép tính trung gian này ở đây nếu ta chọn số r lớn nhất để ngay tích hai số độ dài l+r cũng có độ dài không quá l+2jk-1 và thực hiện các phép tính modulo trong phép luỹ thừa nhanh chỉ là modulo k bớc đoán nhanh th-ơng rồi kết quả cuối cùng mới thực hiện nổt thuật toán theo thủ tục chia

Trang 11

thì số bớc tính modulo thành phần sẽ giảm là (T-1)r với T là số phép toán nhân cần thiết trong phép luỹ thừa nhanh.

2 phơng pháp không cần biết thơng.

Nói chung, các thuật toán tính các modulo đều dựa vào cơ sở đoán nhận thơng nh trong [Thành-Trờng], [Arazi], [BrMoZu], {Brickell] Trong [Montgomery] tác giả đá đa ra thuật toán mà với nó không cần thiết thơng khi tính modulo Thực chất của thuật toán là sự thay đổi cho việc tính toán modulo theo số N bằng một modulo một số R khác mà việc tính modulo R cực kỳ đơn giản chẳng hạn R = qs thì với số X= x0 Xs-1 xm thì X mod R = x0 xs-1 còn X div R = xs xm Tại phần này em sẽ trình bày lại ý tởng này và nêu thêm cách dùng phơng pháp đó khi thực hiện phép tính luỹ thừa modulo.

a Định nghĩa và tính chất DEDC.

REDC(X) =x- N trong trờng hợp ngợc lại (2.5) và gọi giá trị của hàm REDC tại đối số X Tính chất 1: REDC là ánh xạ từ ZNR vào ZN Chứng minh:

Từ (2.3) ta có m = (XN’) mod R hay mN ≡ (XNN’) mod R.

Trang 12

Do đó X +mN ≡ 0 mod R, từ (2.4) ta đợc x= (X +mN)/R là số nguyên Mặt khác từ (2.3) ta có 0 ≤ m <R và 0 ≤ X < RN nên 0 ≤ X+mN < 2RN hay 0 ≤x <2N Theo (2.5) hiển nhiên ta đợc 0 ≤ REDC(X) <N hay REDC(X)∈ZN và đây là điều cần chứng minh.

Tính chất 2: ∀ 0 X<RN ta có REDC (X) =(XR-1) mod N Chứng minh:

Từ (2.4) ta có x= (X + mN)/R vậy xR ≡ X mod N Mặt khác theo (2.5) và tính chất 1 ta có REDC (X) ≡ x mod N ta có REDC (X).R ≡ X mod N hay REDC (X) ≡ (XR-1) mod N và đây là điều cần chứng minh.

b ý nghĩa hàm REDC.

Để thấy đợc ý nghĩa của hàm REDC ta xét đến hệ quả sau : Hệ quả 1 : REDC (REDC(X) (R2 mod N))0 mod N.

Quả vậy, do REDC(X) và R2 mod N là các số ∈ ZN nên tích của chúng thoả mãn là đối số của hàm REDC Mặt khác từ tính chất 2 ta có ngay kết quả cần chứng minh.

Theo hệ quả 1 ta thấy rằng có thể thay việc tính X mod N (giá trị vế phải của hệ quả) bằng việc tính giá trị của hàm REDC (giá trị của về trái) mà theo định nghĩa 1 thì việc tính giá trị của hàm REDC đợc tính thông qua các tính toán theo mod R Với chú ý mà ta đã nêu trong phần đầu của mục này tức là lấy R có dạng qs và chỉ cần (N,q) =1 thì chúng ta đã xây dựng đợc một thuật toán tính modulo theo kiểu không cần biết thơng Việc sử dụng hàm REDC để tính theo modulo theo hệ quả 1 chúng ta cần lu ý rằng giá trị R2 mod N sẽ đợc tính sẵn.

Trang 13

c Việc sử dụng thuật toán tính modulo không cần biết thơng trong tính toán luỹ thừa modulo các số lớn.

Trong phép luỹ thừa nhanh chúng ta đã biết, nếu Y= y0 yk thì XY mod N ≡ ((X2 mod N)) mod N (2.6)

Nếu ta thaymỗi phép tính nhân hoặc bình phơng mod N trong (2.6) bằng phép REDC thì kết quả thu đợc W tính chất 2 sẽ là (XY Rt) mod N với t là số phép toán REDC đợc thực hiện và tính bằng công thức t=-1 Nh vậy nếu đặt Z ≡ Rt+1 mod N thì XY mod N ≡ REDC(WZ) Nh vậy ta có thể giảm số phép toán REDC xuống gần một nửa trong một lần tính XY mod N.

3 Kết luận về phép modulo đợc dùng trong chơng trình.

ở trên em đã trình bày hai thuật toán có tính kinh điển khi tính toán modulo của tích hai số Để giải quyết việc chọn thuật toán nào vào việc phục vụ việc lập trình mã dịch em xin đa ra bảng đối chứng về thời gian tình của 3 thuật toán tìm modulo đã nêu trong 2 phần trên nh sau:

Trong việc giới thiệu một vài giải pháp nhằm tăng tốc độ tính toán khi sử dụng các phơng pháp trên cho phép tính luỹ thừa modulo của chúng tôi còn co thể cải tiến hơn nữa, việc làm này xin đợc dành cho các độc giả quan tâm bổ xung thêm.

Ngày đăng: 25/08/2012, 14:01

Hình ảnh liên quan

Bảng 1 - VẤN ĐỀ TÍNH TOÁN SỐ LỚN TRÊN MÁY TÍNH.doc

Bảng 1.

Xem tại trang 13 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