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

TÌM HIỂU VỀ THƯ VIỆN TÍNH TOÁN SỐ LỚN

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 (132.13 KB, 15 trang )

HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA AN TOÀN THÔNG TIN

BÁO CÁO BÀI TẬP LỚN MÔN HỌC
MẬT MÃ HỌC NÂNG CAO
Chủ đề số 26
TÌM HIỂU VỀ THƯ VIỆN TÍNH TOÁN SỐ LỚN
Giảng viên: TS. Nguyễn Tuấn Anh
Thực hiện : Sinh viên lớp AT8C
1. Vũ Trường Giang
HÀ NỘI, 2015
Ý KIẾN CỦA GIẢNG VIÊN









Tìm hiểu về thư viện tính toán số lớn 2
MỤC LỤC
Tìm hiểu về thư viện tính toán số lớn 3
DANH MỤC KÝ HIỆU VÀ TỪ VIẾT TẮT
Viết tắt Giải thích
GMP GNU Multiple Precision
CLN Common Lisp Number
GPL General Public License
LGPL Lesser General Public License
Tìm hiểu về thư viện tính toán số lớn 4


LỜI NÓI ĐẦU
Có thể nói trong thời đại ngày nay,với sự phát triển nhanh chóng của
công nghệ thông tin và một số lĩnh vực khác như:toán học,tin học,…thì
chúng ta phải đối mặt với việc tính toán với các số nguyên lớn nhỏ khác
nhau.Trên những lĩnh vực đó thì những con số được tính toán rất lớn và
những số rất lớn như vậy được người ta gọi chung là “Số Nguyên Lớn”.
Vấn đề tính toán với các số lớn có ý nghĩa rất lớn trong thực tế. Chẳng
hạn như thuật toán mã hóa công khai RSA (do Rivers, Shamir và Adleman
viết ra vào năm 1978 ) sử dụng tới 512 số khóa (thuật toán này có liên quan
tới việc phân tích các số nguyên tố). Trong nhiều ngành khoa học kĩ thuật
chúng ta phải sử dụng tới các con số lớn hơn thế rất nhiều.
Một số vấn đề liên quan tới việc tính toán với các số lớn như: kiểm tra
tính nguyên tố của một số lớn , khai căn bậc hai của số lớn, vấn đề tính lũy
thừa với số lớn theo modulo, vấn đề tính phần tử nghịch đảo theo modulo,
vấn đề tính giai thừa số lớn, vấn đề các phép toán trên số lớn…
Mục tiêu đặt ra khi thực hiện đề tài này gồm:
1. Sự cần thiết của thư viện tính toán số lớn
2. Tổng quan về các thư viện tính toán số lớn
3. So sánh các thư viện tính toán số lớn
4. Viết chương trình minh họa sử dụng thư viện tính toán số lớn để thưc hiện
các phép tính với các số nguyên lớn
Mục đích khi thực hiện đề tài này là tìm hiểu về sự cần thiết của thư viện
tính toán số lớn trong việc hỗ trợ lập trình ứng dụng mật mã
Tìm hiểu về thư viện tính toán số lớn 5
CHƯƠNG 1:
TỔNG QUAN VỀ CÁC THƯ VIỆN TÍNH TOÁN SỐ LỚN
1.1. Sự cần thiết của thư viện tính toán số lớn
Để đảm bảo mức độ cần thiết của sức mạnh mật mã, chức năng toán
học được sử dụng trong chương trình khóa công khai yêu cầu hoạt động trên
các số nguyên lớn các kích thước khác nhau giữa 768-2048 bit, cũng như

các hoạt động đường cong elliptic trên các lĩnh vực với các yếu tố kích
thước trong khoảng 140-240 bit. Phần mềm thực hiện các phép tính số học
như vậy là rất khó vì chỉ có thể xử lý với kích thước giới hạn là 64 bit.
Các thư viện tính toán số lớn nhằm mục đích hỗ trợ cho các lập trình viên
khi tương tác,xử lý trên các số nguyên lớn.Các thư viện tính toán số lớn có
độ chính xác số học tùy ý,vận hành trên các số nguyên,số hữu tỷ,và số dấu
chấm động,số mũ.Độ chính xác không có giới hạn,ngoại trừ phụ thuộc vào
bộ nhớ có trên hệ thống mà thư viện đang chạy.Các thư viện có một tập
phong phú các hàm và các hàm đều có quy tắc biểu diễn.
Mục tiêu chính của thư viện tính toán số lớn là các ứng dụng mật mã và
nghiên cứu các ứng dụng bảo mật Internet,hệ thống đại số,nghiên cứu tính
toán đại số….
1.2. Thư viện tính toán số lớn GMP
• Ngôn ngữ hỗ trợ:C,C++
• Bản quyền:mã nguồn mở,giấy phép GPL
• Nhà phát triển: GNU Project
Thư viện lập trình số lớn GMP được xây dựng và phát triển bởi tổ chức mã
nguồn mở GNU,nhằm mục đích hỗ trợ cho các lập trình viên khi tương
tác,xử lý trên các số nguyên lớn.
Tìm hiểu về thư viện tính toán số lớn 6
GMP là một thư viện miễn phí với độ chính xác số học tùy ý,vận hành
trên các số nguyên, số hữu tỷ, và số dấu chấm động. Thực tế,độ chính xác
không có giới hạn, ngoại trừ phụ thuộc vào dung lượng bộ nhớ có trên hệ
thống mà GMP đang chạy. GMP có một tập phong phú các hàm,và các hàm
đều có quy tắc biểu diễn.
Mục tiêu ứng dụng chính của GMP là các ứng dụng mật mã và nghiên
cứu các ứng dụng bảo mật Internet, hệ thống đại số, nghiên cứu tính toán đại
số,…GMP được thiết kế để chạy nhanh nhất có thể, cho cả các toán hạng
nhỏ và các toán hạng rất lớn.Tốc độ đạt được bằng cách sử dụng “full-
words” cho các loại số học cơ bản, sử dụng thuật toán tính nhanh, với các

mã Assembly được tối ưu hóa cao cho các vòng lặp trong nhiều loại CPU
phổ biến
Phiên bản GMP đầu tiên được phát hành vào năm 1991, nó tiếp tục được
phát triển và duy trì với các phiên bản mới sau mỗi một năm. Tính đến thời
điểm tháng 6 năm 2013, phiên bản GMP mới nhất là 5.1.2
GMP được phân phối dưới giấy phép GNU LGPL. Giấy phép này cho
phép thư viện được sử dụng miễn phí, chia sẻ và cải tiến. Giấy phép cung
cấp tự do, nhưng cũng đặt ra các hạn chế với các hãng, công ty sử dụng thư
viện với các chương trình không miễn phí.
Nền tảng chính của GMP là các hệ thống kiểu UNIX, như
GNU/Linux,Solaris,HP-UX, MAC OS X/Darwin, BSD, AIX, …. Nó cũng
hoạt động trên các hệ thống Windows 32 bit và Windows 64 bit.
GMP có đặc điểm là cực nhanh, ban đầu được thiết kế cho ngôn ngữ C
nhưng sau này có hỗ trợ cả C++. Bên cạnh C/C++,còn có các interfaces cho
các ngôn ngữ khác như Perl,PHP,Java. Ví dụ PHP có extension php_gmp
giúp việc sử dụng GMP trở nên dễ dàng.
Thư viện GMP có thể dùng trong tính toán cơ bản (cộng, trừ, nhân, chia)
các số nguyên,số thực.Nhược điểm của GMP là khá khó sử dụng vì phải viết
Tìm hiểu về thư viện tính toán số lớn 7
code theo dạng ngôn ngữ bậc thấp, thiếu tính trừu tượng. Các hàm cơ bản
nhất của GMP có dạng như sau:
- Khai báo: mpz_t xf,yf,xf;
- Khởi tạo (1):mpz_init(xf);
- Khởi tạo (2):mpz_init2(xf, bits);
- Giải phóng: mpz_clear(xf);
- Thay thế: mpz_set_str(xf, str, base);
- Cộng: mpz_add(zf, xf, yf);
- Trừ: mpz_mul(zf, xf, yf);
- Nhân: mpz_mul(zf, xf, yf);
Tuy nhiên khi đã làm quen với các hàm trên thì có thể viết chương trình lớn

thực hiện các tính toán phức tạp mà không phải lo nghĩ gì tới giới hạn của
các con số (GMP dễ dàng tính toán các số có 600 triệu chữ số).
1.3. Thư viện tính toán số lớn CLN
• Ngôn ngữ hỗ trợ: C++
• Bản quyền: mã nguồn mở,giấy phép GPL
• Nhà phát triển: Bruno Haible and Richard B.Kreckel
CLN là một thư viện miễn phí hỗ trợ các phép toán với độ chính xác
số học tùy ý. Nó thực hiện các phép toán trên số nguyên , số hữu tỷ, số thực,
số lũy thừa,số phức, đa thức đơn biến. Thư viện CLN có thể được sử dụng
bởi ngôn ngữ C++.Phiên bản đầu tiên được ra đời vào năm 1995,nó tiếp tục
được phát triển và duy trì sau mỗi một năm. Phiên bản mới nhất là 1.3.4
được phát hành vào ngày 16/10/2014.
CLN sử dụng kỹ thuật hướng đối tượng và nạp chồng toán tử để đạt
được một cú pháp giống với đại số bình thường:Ví dụ tổng x của hai biến a
và b được viết thành hàm sum(&x, a, b)
Tìm hiểu về thư viện tính toán số lớn 8
CLN sử dụng lớp kế thừa để mô hình hóa các tập con của các kiểu số
tự nhiên có sẵn : Ví dụ: lớp số nguyên là tập con của lớp số hữu tỷ, đơn giản
nó có nghĩa là số nguyên là tập con của số hữu tỷ. Số phức và các kiểu con
của nó y hệt như các kiểu số được biết đến trong ngôn ngữ Lisp, mang lại
cho CLN một ý nghĩa khác: làm nó trở thành từ viết tắt của Common Lisp
Numbers. Do đó nó có thể được sử dụng cho việc triển khai của Common
Lisp, hoặc ngôn ngữ thông dịch khắc hoặc là hệ thống đại số máy tính.
CLN có thể được cấu hình để sử dụng thư viện GNU Multi-Precision
Library (thư viện thao tác với các số cực lớn) như là nhân ở trong các vòng
lặp quan trọng và thực hiện các thuật toán nâng cao như phép nhân
Schönhage–Strassen, chia nhị phân và các công việc khác. Tất cả đối tượng
của CLN hoặc là ngay lập tức hoặc là reference counted (kỹ thuật quản lý bộ
nhớ trong C) giúp cho việc giải phóng bộ nhớ không phải là gánh nặng trong
chương trình chính

CLN có thể được cấu hình để sử dụng một thư viện GMP cài đặt sẵn
cho một số vòng lặp ở mức độ thấp. Tối thiểu phải có bản cài đặt GMP 3.0
đã được cài đặt từ các phiên bản trước nếu không nó sẽ không hỗ trợ cho
CLN và không thể làm việc. Sử dụng GMP là một cách để tăng hiệu suất
làm việc cho CLN
Thông thường, CLN sẽ tự động phát hiện ra GMP và sử dụng nó.Nếu
không muốn CLN sử dụng một thư viện cài đặt sẵn là GMP thì ta có thể cấu
hình và lựa chọn ‘ - -without-gmp’.
Tìm hiểu về thư viện tính toán số lớn 9
CHƯƠNG 2: SO SÁNH CÁC THƯ VIỆN TÍNH TOÁN SỐ LỚN
2.1. Ngôn ngữ hỗ trợ
GMP hỗ trợ được cho hai ngôn ngữ lập trình là C và C++, nhưng đối
với CLN nó chỉ hỗ trợ cho một ngôn ngữ lập trình duy nhất là C++.Chính vì
thế, CLN dễ sử dụng và phổ biến hơn so với GMP
2.2. Ưu điểm và nhược điểm
• Thư viện GMP
- Ưu điểm:
1. GMP là thư viện duy nhất mà không bị phụ thuộc vào sự điều chỉnh của các
ngưỡng,không phụ thuộc vào kích thước của các toán hạng,mà là dựa trên
các kỹ thuật cơ bản của microprocessor
2. Tập hợp các sự điều chỉnh lên các chương trình được được cung cấp bởi
GMP có thể gọi trên mục tiêu để đánh giá thời gian của quy trình GMP và
đề xuất các ngưỡng để tạo ra các kết quả tốt hơn.
3. GMP có đặc điểm là cực nhanh, ban đầu được thiết kế cho ngôn ngữ C
nhưng sau này có hỗ trợ cả C++. Ngoài ra, còn có các interfaces cho các
ngôn ngữ khác như Perl,PHP,Java.
4. GMP có thể dễ dàng tính toán với các con số có 600 triệu chữ số
- Nhược điểm:
1. GMP khá khó sử dụng vì phải viết code theo dạng ngôn ngữ bậc thấp, thiếu
tính trừu tượng

• Thư viện CLN
-Ưu điểm:
1. Nó dễ dàng tích hợp vào các phần mềm lớn
2. Giúp thu gom rác thải và giải phóng bộ nhớ cho các chương trình chính
3. Có thể tính toán với tất cả các loại con số(số nguyên,số thực,số hữu tỷ,số lũy
thừa,số phức…)
4. Tạo các địa chỉ cấp phát bộ nhớ,hỗ trợ việc giải phóng bộ nhớ
Tìm hiểu về thư viện tính toán số lớn 10
- Nhược điểm:
1. Chỉ hỗ trợ duy nhất cho ngôn ngữ lập trình C++
Tìm hiểu về thư viện tính toán số lớn 11
CHƯƠNG 3: VIẾT CHƯƠNG TRÌNH MINH HOẠ
Trong chương này, nhóm sẽ viết một chương trình minh hoạ sử dụng
thư viện tính toán số lớn để thực hiện phép tính với các số nguyên lớn.
Chương trình C sử dụng thư viện GMP để nhân 2 số nguyên tố lớn
#include<stdio.h>
#include<stdlib.h>
#include<gmp.h>
int main(void)
{
char a[20], b[20];
do{
printf("\n Nhap so thu nhat: ");
scanf("%s",&a);
printf("\n Nhap so thu hai: ");
scanf("%s",&b);
mpz_t x;
mpz_t y;
mpz_t result;
mpz_init(x);

mpz_init(y);
Tìm hiểu về thư viện tính toán số lớn 12
mpz_init(result);
mpz_set_str(x,a,10);
mpz_set_str(y,b,10);
mpz_mul(result,x,y);
printf("Ket qua nhan hai so la: \n");
gmp_printf("\n %Zd\n*\n %Zd\n \n%Zd\n\n",x,y,result);
mpz_clear(x);
mpz_clear(y);
mpz_clear(result);
} while(1);
getch();
return 0;
//return EXIT_SUCCESS;
}
Tìm hiểu về thư viện tính toán số lớn 13
KẾT LUẬN
Sau gần một tháng nghiên cứu, thử nghiệm, nhóm đề tài đã đạt được
tất cả các mục tiêu đề ra. Cụ thể:
Trong chương 1, nhóm đề tài đã đưa ra sự cần thiết của các thư viện
tính toán số lớn và tổng quan về các thư viện tính toán số lớn
Trong chương 2, nhóm đề tài đã so sánh giữa 2 thư viện tính toán số
lớn và đưa ra ưu nhược điểm của từng thư viện
Trong chương 3, nhóm đề tài đã đưa ra một chương trình nhỏ là nhân
hai số nguyên lớn
Dù nhóm đề tài đã có sự nỗ lực trong nghiên cứu, nhưng vẫn còn tồn
tại hạn chế trong kết quả nghiên cứu. Nhóm sẽ tiếp tục tìm hiểu thêm về các
thư viện tính toán số lớn và ứng dụng của nó trong việc hỗ trợ các lập trình
viên trong việc lập trình.

Tìm hiểu về thư viện tính toán số lớn 14
TÀI LIỆU THAM KHẢO
1. Nguyễn Ngọc Cương, Nguyễn Tuấn Anh, Trần Thị Lượng, Mật mã ứng
dụng trong ATTT, Học viện Kỹ thuật mật mã, 2013
2.GMP
/>3. Class library for Numbers
/>4.CLN, a Class library for Numbers
/>Tìm hiểu về thư viện tính toán số lớn 15

×