Các hàm khởi tạo số nguyên lớn

Một phần của tài liệu Thiết kế và cài đặt thư viện số lớn ứng dụng trong mật mã (Trang 55 - 58)

Các hàm khởi tạo đối tượng số lớn trong luận văn này sử dụng sử dụng ngôn ngữ lập trình C# (Version Studio 2013) để thực hiện.

Function 2.1 (Hàm khởi tạo đối tượng số lớn không tham số).

Để khởi tạo đối tượng số lớn không tham số ta thực hiện khai báo như sau

Public BigNumInteger() {

Data = new uint[MaxLength];

LengthData = 1; };

41

Function 2.2 (Hàm khởi tạo đối tượng số lớn với tham số là số lớnBigNumInteger). Tạo đối tượng số lớn bằng cách sao chép dữ liệu từ đối tượng số lớn truyền vào bao gồm chiều dài và mảng Data tương ứng. Ta thực hiện khai báo như sau

Pubic BigNumInteger (BigNumInteger BigNum)

{

Data = new uint[MaxLength];

LengthData = BigNum.LengthData;

For (int i =0; i < LengthData; i++)

Data[i] = BigNum.Data[i]; };

Function 2.3 (Hàm khởi tạo đối tượng số lớn với tham số vào kiểu long).

Ban đầu khởi tạo thuộc tính Data với số index lớn nhất có thể ban đầu. Tiếp theo sử dụng phép toán AND bit của số đầu vào (kiểu long) với mặt nạ (mask) để “cắt” 32

bit đầu tiên, đưa 32 bit đầu tiên này vào index =0 của mảng Data.

Tiếp theo, ta dịch phải 32 bit để “cắt” bit tiếp theo đưa vào mảng Dataindex chạy từ 1, rồi cứ thế tiếp tục cho tới hết số long ban đầu. Ta khởi tạo như sau

pubic BigNumInteger (long value)

{

Data = new uint[MaxLength];

long tempVal = value;

LengthData = 0;

While (value != 0 && LengthData < MaxLength)

{

Data[LengthData]=(uint)(value & 0xFFFFFFFF); value >>= 32;

LengthData++; }

};

Thí dụ 2.6. Khởi tạo số lớn a = 12345678912. Ta thực hiện gọi hàm khởi tạo như sau

BigNumIntegera = new BigNumInteger(12345678912). Khi đó đối tượng số lớn a được tổ chức như sau

42

a[n-1] … a[1] a[0]

000…000 000…000 00000000000000000000000000000010 11011111110111000001110001000000

32 bit 32 bit 32 bit 32 bit

Hình 2.4. Minh họa cách tổ chức lưu trữ dữ liệu của số lớn a

Với mảng biểu diễn trên thì thuộc tính LengthData = 2. Thể hiện thập phân trong C# khi view lần lượt là a[0] =3755744320 và a[1] = 2.

Function 2.4 (Hàm khởi tạo đối tượng số lớn với tham số vào kiểu String).

Đối với số thập phân, chẳng hạn số 123456 thì số bên trái hơn số bên phải 10 lần bắt từ bên phải nhất. Có nghĩa 123456 = 100000+20000+3000+400+50+6. Do đó, để đưa một chuỗi số dạng String vào đối tượng số lớn thì ta thực hiện duyệt từng ký tự số từ phải sang trái cho đến khi hết chuỗi số, mỗi ký tự số duyệt được sẽ chuyển sang dạng số sau đó cộng với phần tử bên trái sau khi đã nhân 10 lần. Nếu phần tử trái nhất của chuỗi mà là ký tự “-” thì đổi dấu.

Ta thực hiện khởi tạo như sau

Public BigNumInteger (String value, int radix)

{

BigNumInteger multiplier = new BigNumInteger(1);

BigNumInteger result = new BigNumInteger();

int limit = 0;

If ( value[0] == '-' ) limit = 1;

For (int i = value.Length – 1; i >= limit; i--)

{

int posVal = (int)value[i];

If (posVal >= '0' && posVal <= '9')posVal = posVal - '0';

If (postVal <= radix)

{

If (value[0] = '-' ) posVal = - posVal;

result = result + (multiplier * posVal);

if ((i - 1) >= limit) multiplier = multiplier *radix;

} }

43

Data = new uint[MaxLength];

For (int i = 0; i < result.LengthData; i++)

Data[i] = result.Data[i];

LengthData = result.LengthData; };

Phép cộng (+), phép trừ (-), phép nhân (*), các phép so sánh... đã được nạp chồng (Overload) trong ngôn ngữ C# để sử dụng cho số tính toán với số lớn.

Thí dụ 2.7. Khởi tạo số lớn a từ chuỗi “1234568795485454545646541212”.

BigNumIntegera = new BigNumInteger(“1234568795485454545646541212”, 10)

Một phần của tài liệu Thiết kế và cài đặt thư viện số lớn ứng dụng trong mật mã (Trang 55 - 58)