ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Đề tài:
Vấn Đề Tính Toán Với Các Số Lớn
Môn h c: M t Mã và An Toàn D Li u
Giáo viên h ng d n: PGS.TS Tr nh Nh t Ti n
Ng i th c hi n: Tr n Th Mùi
1
Gi i Thi uớ ệ
M t s bài toán liên quan t i vi c tính toán v i ộ ố ớ ệ ớ
các s l n th ng g p là:ố ớ ườ ặ
- 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 mũ l n, theo Moduloấ ề ừ ớ ố ớ
- V n đ tính ph n t ngh ch đ o các s l n, 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 ( c ng, tr , ấ ề ố ớ ộ ừ
nhân, chia)
2
N i Dung Trình Bàyộ
3
Phát bi u bài toán ể
1
2
4
6
Ch ng trình Demo ươ
T t ng th c hi n ư ưở ự ệ
3
1. Phát bi u bài toánể
Cho hai s nguyên l n a và b có đ dài l n l t là m và ố ớ ộ ầ ượ
n (ch a m và n ch s ). Th c hi n hai nhi m v :ứ ữ ố ự ệ ệ ụ
- X lý d li u v i hai s nguyên l n a và bử ữ ệ ớ ố ớ
- Th c hi n các phép toán: c ng , tr , nhân, chia.ự ệ ộ ừ
4
2. T t ng th c hi nư ưở ự ệ
Vi c h tr ki u d li u s nguyên và các phép toán ệ ỗ ợ ể ữ ệ ố
s h c đ i v i các s có s các ch s l n trong các ố ọ ố ớ ố ố ữ ố ớ
ngôn ng l p trình c p cao nh pascal, C# v n còn b ữ ậ ấ ư ẫ ị
gi i h n ớ ạ 1 m c nào đó nên đ gi i quy t bài toán này ở ứ ể ả ế
ta c n xây d ng riêng cho mình m t c u trúc d li u có ầ ự ộ ấ ữ ệ
th l u tr đ c s l n và các phép toán s h c trên ể ư ữ ượ ố ớ ố ọ
c u trúc d li u đó.ấ ữ ệ
5
2.1.X Lý D Li u ử ữ ệ
- Đ a d li u v các ki u ư ữ ệ ề ể
s nguyên đã có mà máy ố
h tr s n đ t o ra ỗ ợ ẵ ể ạ
ki u s l n.ể ố ớ
- Th c hi n bi u di n ự ệ ể ễ
thành các kh i, m i kh i ố ỗ ố
g m 4 byteồ
- Th c hi n đ a các ch ự ệ ư ữ
s vào trong các kh iố ố
- Xác đ nh b i công th c: ị ở ứ
- result = result + (multiplier
* posVal);
- multiplier = multiplier
*radix;
Ví d : ụ
A=…345
- result= 0+(1*a[0])=5
multiplier= 1*10=10
- result=5+(10*4)=45
multiplier= 10*10=100
6
2.2. Phép C ngộ
Xác đ nh công th c:ị ứ
Ví d :ụ
long sum =
(long)bi1.data[i] +
(long)bi2.data[i] + carry;
carry = sum >> 32;
result.data[i] = (uint)(sum
& 0xFFFFFFFF);
a= 19 10011
b= 151111
Sum=a[0]+b[0]+0=1+1+0=
0
carry=1
Data[0]=(0&0xFFFFFFFF)
=0
7
2.3. Phép Trừ
Công th c:ứ
Ví d : ụ
- long diff =
(long)bi1.data[i] -
(long)bi2.data[i] -carry;
- result.data[i] = (uint)(diff
& 0xFFFFFFFF);
- N u diff<0: carry=1ế
- Ng c l i: carry=0ượ ạ
a= 19 10011
b= 151111
- diff= a[0]-b[0]-0=1-1-
0=0;
data[0]=0;
carry=0;
8
2.3. Phép Nhân
Công th c:ứ
Ví d :ụ
- Ulong Val=
bi1.data[i]*bi2.data[j]+
result.data[k]+mcarry;
- Result.data[k]= (unit)
(Val&0xFFFFFFFF)
- Mcarry=(val>>32)
a= 123; b= 12
i=0, j=0,k=0(k=i,k++)
Val=a[0]*b[0]+data[0]+0=2*
3+0+0=6;
Data[0]=6. mcarry=0;
i=0,j=j,k=1
Val=a[0]*b[1]+data[1]+0=1*
3+0+0=3;
Data[1]=3;
9
2.4. Phép Chia
- B c 1ướ : Khi i< đ dài m ng (a) -1ộ ả
+N u xâu t a[0] đ n a[i] v n còn nh h n b thì i++(n u ế ừ ế ẫ ỏ ơ ế
i v t quá đ dài m ng (a) -1 thì du=a[0]…a[i], d ng ượ ộ ả ừ
ch ng trình. Xu ng b c 2.ươ ố ướ
Bi n tam đ l u tr th ng c a các ph n nh ( đây ế ể ư ữ ươ ủ ầ ỏ ở
chính là xâu : a[0]… a[i]) cho b. Khi ph n nh v n còn ầ ỏ ẫ
l n h n b thi tr d n ph n nh đã xét v i b, l u s ớ ơ ừ ầ ở ầ ỏ ớ ư ố
l n tr đ c vào bi n tam. Đó là k t qu m i ch s ầ ừ ượ ế ế ả ỗ ữ ố
trong th ng m i l n chia. M ng du = ph n nh .ươ ở ỗ ầ ả ầ ỏ
10
2.4. Phép Chia
+ Thêm vào c giá tr c a tam. ị ủ
+ Lo i b h t ch s t a[0] đ n a[i] . Sau đó ghép ạ ỏ ế ữ ố ừ ế
m ng du vào tr c m ng a.ả ướ ả
+ Đ t l i i=0. du=“”, tam=ặ ạ 0.
- B c ướ 2: Ki m tra và xóa các ch s 0 vô nghĩa s ể ữ ố ở ố
d và cho ra m ng k t qu cư ả ế ả
11
3. Chương Trình Demo
12
13