Chuyên đ
THU T TOÁN S H C
Tác gi : Tr n quang Kh i
I. Gi i thi u chung
S h c thu t toán (Algorithmic number theory) là m t ngành toán h c đang phát tri n m nh, nghiên
c u s h c trên ph ng di n thu t toán. Ta c n chú ý r ng S h c là m t trong nh ng ngành toán ươ
h c c nh t còn thu t toán l i là m t khái ni m m i m ra đ i và phát tri n t trong th k XX. S ế
h c thu t toán đ c xây d ng trên c s nh ng thành t u c a c lý thuy t s h c l n thu t toán. ượ ơ ế
M t trong nh ng bài toán n i ti ng nh t đã đ oc gi i quy t trong th k XX là bài toán th 10 ế ế ế
c a HilbertCó t n t i m t thu t toán t ng quát cho phép ta tr l i m t ph ng trình Diophantine ươ
cho tr c có nghi m hay không ?ướ ’. Ph ng trình Diophantine là ph ng trình có d ng f(x, y, z, … )ươ ươ
= 0 trong đó f(x, y, z, …) là đa th c c a các bi n x, y, z, … có các h s nguyên, và các bi n ch ế ế
nh n giá tr nguyên. Bài toán này đã đ c Michiakêvích gi i quy t tr n v n và câu tr l i là ph ượ ế
đ nh, t c là không có thu t toán nh v y. Bài toán th 10 c a Hilbert đ c gi i quy t là m t thành ư ượ ế
t u quan tr ng c a s h c cũng nh thu t toán. ư
S h c thu t toán không ch phát tri n trên nh ng thành t u c a S h c s c p, mà nó còn t n ơ
d ng nh ng thành t u c a S h c hi n đ i, Đ i s hi n đ i, Hình h c đ i s … Cũng nh các ư
ngành toán h c - thu t toán khác, trong S h c thu t toán cũng có nh ng bài toán NP, t c là không
có thu t gi i trong th i gian đa th c, tiêu bi u là bài toán phân tích m t s ra các th a s nguyên t ,
thu t toán ki m tra nguyên t , …
Trong bài vi t này, ta ch đ c p t i nh ng v n đ c b n nh t c a S h c thu t toán, và trên cế ơ ơ
s c a toán h c s c p. ơ
II. Các phép tính v i s nguyên
Trong máy tính, các s đ u đ c bi u di n h nh phân, h n n a vi c mô t d i d ng nh ượ ơ ướ
phân làm cho các phép tính tr nên đ n gi n h n r t nhi u. ơ ơ
Đ cho t ng quát, ta gi s hai toán h ng đ u có đúng N bit (trong tr ng h p s các bít có nghĩa ườ
nh h n N thì ta thêm 0 vào đ u cho đ ). ơ
1. Phép c ng và phép tr
Đ i v i phép c ng và phép nhân các s N bít, ta có th th c hi n gi ng nh phép c ng tr trên h ư
th p phân : Th c hi n c ng (hay tr ) t ph i sang trái (v i bít ng v i s mũ nh tr c r i s ướ
l n sau).
1. Phép nhân
Đ i v i phép nhân, ta có thu t toán nhân Nga đ c mô t nh sau : ượ ư
Function Mult(a, b : Integer): Integer;
Var
c : Integer;
Begin
c := 0;
repeat
if Odd(b) then c := c + a;
a := a shl 1;
b := b shr 1;
until b = 0;
Mult := c;
End;
N u xét cho kĩ thì th c ra thu t toán nhân Nga có cùng m t d ng v i thu t toán nhân hai s b ngế
ph ng pháp mà bình th ng ta v n dùng đ tính tay, ch có đi u khác là thao tác trên h nh phân. ươ ườ
Thu t toán nhân Nga g m N l n d ch bít, trong tr ng h p t ng quát ph i th c hi n N/2 l n phép ườ
c ng, do đó đ ph c t p tính toán là N 2.
Sau đây, ta s gi i thi u m t thu t toán nhân khác, tuy ph c t p h n nh ng có đ ph c t p nh ơ ư
h n. ơ
Gi s ta ph i th c hi n phép nhân v i hai s có 2N bit A và B. Phân tích :
A = a1*2N + a2
B = b1*2N + b2.
AB = a1*b1 * 22N + (a1b2 + a2b1)*2N + a2b2.
Ta chú ý r ng phép nhân v i m t lu th a c a 2 cũng nh phép c ng có th i gian t l v i N. ư
Nh n xét : (a1+a2)(b1 + b2) - a1b1 - a2b2 = a1b2 + a2b1.
Do đó n u bi t (a1+a2)(b1 + b2), a1b1, a2b2 thì có th tính đ c a1b2 + a2b1. ế ế ượ
Qui v nhân hai s 2N bit v 2 l n nhân N bit và m t s phép tính có th i gian t l v i N.
N u g i F(n) là th i gian nhi u nh t đ th c hi n phép nhân hai s có 2ế n bit, ta có
F(n) = 3F(n-1) + k2n (*) trong đó k là m t h ng s th hi n chi phí các phép tính c ng và d ch bit
trong m i b c g i đ qui. Chia c hai v c a (*) cho 2 ướ ế n ta đ c ượ
. Do đó, F(n) = O(3n) = O( ) hay nói cách khác th i gian th c hi n
phép nhân hai s N bít có đ ph c t p c O( ).
3. Phép chia
Trong ph n này, ta s trình bày thu t toán chia hai s nh phân có N bít A = (A1A2A3…AN) 2, B =
(B1B2…BN)2 cho k t qu th ng Q, d R. ế ươ ư
+B c 1:Q ướ 0, R 0, i 0
+B c 2: i = i+1. N u i > N ướ ế k t thúc thu t toán, ng c l i ế ượ B c 3. ướ
+B c 3: R ướ (R shl 1) or (A[i]). N u R ế B B c 4, ng c l i B c 5. ướ ượ ướ
+B c 4: R ướ R - B, C[i] = 1. Th c hi n B c 2. ướ
+B c 5: C[i] = 0. Th c hi n B c 2. ướ ướ
Hay ta có th mô t b ng ch ng trình : ươ
Procedure Divide(A, B : LongInt; var Q, R : LongInt);
Var
i : Integer;
Begin
Q := 0;
R := 0;
For i := 1 to N do
Begin
If (A and (1 shl (N-i)) <> 0) then R := (R shl 1)+1
else R := R shl 1;
if R >= B then
Begin
Q := Q or (1 shl (N-i));
R := R - B;
End;
End;
End;
Đánh giá đ ph c t p : Thu t toán chia có đ ph c t p (N 2).
III. Thu t toán Euclid
1. Thu t toán Euclid
Thu t toán Euclid dùng đ tìm c chung l n nh t c a hai s nguyên d ng m, n. ướ ươ
Thu t toán ti n hành nh sau : ế ư
B c 0: Đ t a = m, b = n. ướ
B c 1:ướ N u a > b ta thay a b ng ph n d c a phép chia a cho b, ng c l i thay b b ng ph n dế ư ượ ư
c a phép chia b cho a.
B c 2: N u a ho c b b ng 0, thì k t qu là a + b, ng c l i th c hi n b c 1. ướ ế ế ượ ướ
Hay thu t toán đ c mô t b ng m t hàm trong ngôn ng Pascal nh sau : ượ ư
Function Euclid(m, n : Integer) : Integer;
Var
a, b : Integer;
Begin
a := m; b := n;
repeat
if a > b then a := a mod b
else b := b mod a;
until (a = 0) or (b = 0);
Euclid := a + b;
End;
Ta cũng có cách vi t khác nh sau : ế ư
Function Euclid1(m, n : Integer) : Integer;
Var
a, b, r : Integer;
Begin
a := m; b := n;
repeat
r := a mod b;
a := b;
b := r;
until b = 0;
Euclid := a;
End;
Trong s h c ta đã bi t r ng v i hai s nguyên d ng m, n b t kì và d là c chung c a chúng thì ế ươ ướ
luôn t n t i hai s nguyên u, v sao cho u*m + v*n = d. T thu t toán Euclid ta cũng có th ch ra
đ c c th m t c p (u, v) nh v y : ượ ế ư
Ta chú ý r ng t i m i b c c a vòng l p repeat, a và b đ u t n t i c p (x, y) v i x, y ướ Z tho
mãn x*m + y*n = a (= b). Ban đ u a = m có m t c p t ng ng là (1, 0), c p t ng ng v i b = n ươ ươ
là (0, 1) vì :
1*m + 0*n = m = a
0*m + 1*n = n = b
Trong vòng l p, ta có phép gán a := a mod b, phép gán này t ng đ ng a := a - q*b trong đó q là ươ ươ
th ng c a phép chia a cho b (q := a div b). Khi đó c p (xươ a, ya) t ng ng v i a bi n đ i t ng ng ươ ế ươ
xa := xa - q*xb
ya := ya - q*yb
Nh v y, a và b luôn có th bi u di n d i d ng x*m + y*n và k t qu c chung b ng a + b sư ướ ế ướ
có c p x, y t ng ng là x ươ a + xb , ya + yb. Nh v y, thu t toán tìm c p u, v trên c s thu t toánư ơ
Euclid s đ c vi t nh sau : ượ ế ư
Procedure Euclid2(m, n : Integer; var u, v : Integer);
Var
a, b, q, r : Integer;