Như trong cách biểu diễn số nguyên ta đã có khái niệm bù chín, bù mười đối với số thập phân và phương pháp bù hai với số nhị phân. Việc thực hiện trừ hai số lớn a và b được thực hiện như sau:
- Đảm bảo số a và b có độ dài như nhau. Phần nào còn thiếu ở số trừ thì thêm số 0.
- Cộng số bị trừ với số bù mười của số trừ.
- Bỏ bít nhớ cuối cùng của kết quả ta có kết quả của phép trừ giữa hai số a và b.
Thí dụ 2.11.Có số lớn c = 56789 – 456, số bị trừ là 56789, số trừ là 456 - Thêm số 0 vào số trừ cho đủ chiều dài với số 56789: 00456
- Lấy bù mười của số trừ: 99544.
- Cộng số bị trừ với bù mười của số trừ: 56789 + 99544 = 156333. - Bỏ số nhớ cuối cùng (số 1) ta được kết quả là: 56333.
Tuy nhiên, số lớn a và b được biểu diễn với cấu trúc dữ liệu và xử lý trong luận văn này sử dụng các phép toán thao tác trên dãy bit nhị phân nên ta áp dụng như sau:
- Ta chuyển số trừ b thành số bù hai (theo phương pháp bù hai).
- Lấy số a cộng số bù hai của số b.
Algorithm 2.2 (Lấy bù hai của số lớn BigNuminteger).
Input: Object big integer n to get complement.
Output: Object big integer r = -(n)
1. r ← n;
2. For i from 0 to MaxLength - 1 step 1 do the following
r.Data[i] ← (~(n.Data[i])); //1’complement.
3. val ← 0, c ← 1, index ← 0; //Get 2’complement.
4. While c != 0 and index < MaxLength, do the following:
4.1. val ← r.Data[index];
4.2. val++;
4.3. r.Data[index] = val & 0xFFFFFFFF;
4.4. c ← val >> 32; index++;
5. r.LengthData ← MaxLength;
While r.LengthData > 1
and r.Data[r.LengthData - 1] = 0 do
r.LengthData--;
47
Algorithm 2.3 (Giải thuật trừ hai số lớn a và b).
Input: Two big unsign integer a, b.
Output: Big integer r = a – b.
1. c ← -(b); //Using Algorithm 2.2 of chapter II.
2.r ← a + c; //Using Algorithm 2.1 of chapter II.
3.Return (r).
Đánh giá độ phức tạp: O n . Với n là chiều dài dãy bit truyền vào.
Thí dụ 2.12.Cho a = 56789, b = 456. Tính Result = a - b ? Số a và b được biểu diễn chi tiết như sau
a[n-1] … a[1] a[0](56789)
000…000 000…000 000…000 00000000000000001101110111010101
Hình 2.8. Minh họa cách tổ chức, biểu diễn số bị trừ a
b[n-1] … b[1] b[0](456)
000…000 000…000 000…000 00000000000000000000000111001000
Hình 2.9. Minh họa cách tổ chức, biểu diễn số trừ b
Lấy bù hai theo Algorithm 2.2 của số b, ta được đối tượng BigNum như sau
a[n-1] … a[1] a[0](4294966840)
111…111 111…111 111…111 11111111111111111111111000111000
Hình 2.10. Minh họa cách tổ chức, biểu diễn số bù hai của số trừ BigNum.
Thực hiện cộng a và BigNum (số bù hai của b). Result = a + BigNum.
Dùng giải thuật Algorithm 2.1. Ta được kết quả là 56333, biểu diễn như sau
Result[n-1] … Result[1] Result[0](56333)
000…000 000…000 000…000 00000000000000001101110000001101
Hình 2.11. Minh họa cách tổ chức, biểu diễn kết quả của phép trừ.