Cac Thuat Toan

Embed Size (px)

Citation preview

TRNG I HC BCH KHOA H NIVin Cng ngh Thng tin v Truyn thng

BI TP LN TON RI RC TI: CC THUT TON S HC C BN V BI TON NHN BIT S NGUYN T

Hc vin thc hin: 1. B nh Hoi. SHSV: 20093452

M lp: 21536 Gio vin hng dn: PGS Nguyn c Ngha

H NI - 2011

0. Li ni uT nhng nm 70, s pht trin ca nn Tin hc S hc ni ring c nhng tc ng quan trng n nhiu mt ca i sng, trong c th k n cc lnh vc x l thng tin, mt m v k thut my tnh. S pht trin song song ny m ra mt hng i mi khi nghin cu v s hc, chnh l s hc thut ton. Bo co xin php c trnh by s qua v mt vi thut ton s hc c bn, v i su hn vo cc thut ton nhn bit s nguyn t, cng nhng phn tch, nh gi s c ni n c th tng phn. D rt c gng tm hiu, song bo co ny chc chn khng th trnh khi nhng sai st, khim khuyt c v mt ni dung ln vn trnh by. Rt mong nhn c nhng gp qu gi ca thy bo co c hon thin hn. Em xin cm n thy!

1. nh ngha Thut tonThut ton l mt (hoc mt tp hp) quy tc, thao tc vi d liu u vo cho, ta tm c li gii sau mt khong thi gian hu hn.

V c bn, thut ton cn tha mn 2 yu cu sau: Tnh xc nh: Ti mi bc, cc thao tc phi c xc nh c th, hay ni cch khc l phi ch r c vic cn lm. Tnh hu hn: Thut ton phi kt thc sau mt khong thi gian hu hn. Khi thut ton kt thc, ta phi thu c li gii cho vn c a ra.

2. Mt vi thut ton s hc c bn2.1. Thut ton Karatsuba-OfmanCng, tr, nhn v chia chnh l 4 php ton c bn i vi s nguyn m chng ta s lun phi s dng trong cc thut ton, vic ti u ha cc thao tc tnh ton c bn ny s nh hng ng k n thi gian thc hin ca cc thut ton lin quan. V c bn, vi cc quy tc thng thng trong ton hc ta thy rng php ton cng v tr i vi 2 s nguyn di k bit s cn n bit, cn i vi php nhn v chia, s php tnh bit s l . php tnh

D rng thut ton c bn dng nhn 2 s nguyn l c th chp nhn c trong phn nhiu trng hp vi nhu cu x l d liu n gin, tuy nhin trong mt s lnh vc khoa hc cn tnh Trang 2

ton vi cc s nguyn ln, ta cn n mt thut ton khc hiu qu hn, hay ni cch khc l mt thut ton c thi gian thc hin ngn hn. 2.1.1. tng Xt php nhn 2 s nguyn kch thc 2n bit: a= b= Tin hnh biu din li: a= vi b= vi v v

.

.

Khi ny, php nhn cc s c kch thc 2n bit c a v cc php nhn cc s n bit cng vi cc php cng v php dch bit (nhn vi ly tha ca 2): a.b =

2.1.2. Thut ton Thut ton Karatsuba-Ofman ng dng vo vic nhn 2 s nguyn da trn phng php chia tr c trnh by theo cc bc sau (gi m trong C++): u vo: 2 s a v b c kch thc n bit. Nu n l, ta thm bit 0 vo trc cc s n chn.

int ko(int a, int b) { if (n == 1) { return a*b; }

Phn tch a, b thnh cc phn kch thc a = b =

bit:

;

Trang 3

a*b = int z2 = ko( int z1 = ko( int z1 = ko( int g = d + e - f; , , ); ); , ) - z2 - z0;

return ( (z2 1) ) + z0 ); }

p dng nh l th rt gn, ta tm c thi gian tnh ca thut ton Karatsuba-Ofman:

(

)

Vi bc 1.53, thut ton Karatsuba-Ofman s mang li hiu qu ng k khi thc hin tnh ton vi cc s nguyn ln so vi phng php tnh ton thng thng! 2.1.3. Ci t trn C++

typedef unsigned __int64 UInt;

int getBitLength(UInt);

UInt ko(UInt a, UInt b) { UInt x = max(a, b); int bits = getBitLength(x);

if (bits == 1) { return (a & b); }

bits = (bits + 1) >> 2;

/* To dy bit 11...11 (gm bits bit) * v dng cc php ton logic, dch bit tch cc phn ca s */ UInt getLow = (UInt(1) bits); UInt b0 = (b & getLow); UInt b1 = (b >> bits);

UInt z2 = ko(a1, b1); UInt z0 = ko(a0, b0); UInt z1 = ko(a1 + a0, b1 + b0) - z2 - z0;

return ( (z2 0);

return len; }

2.2. Thut ton Euclid2.2.1. Thut ton D c tui i kh lu, nhng cho n nay thut ton Euclid vn l thut ton tt nht c bit n trong vic tm c s chung ln nht ca 2 s a v b. Da trn nguyn tc: c chung ln nht ca 2 s a v b (a < b) khng thay i nu ta thay a bi (b - a), thut ton c pht biu nh sau:

{

Vi n l s bit biu din 2 s a v b, ta nhn thy s php chia ca thut ton l php chia li cn php tnh bit, nn thut ton Euclid c phc tp l

, mi

Trang 5

2.2.2. Ci t trn C++

int gcdEuclid(int a, int b) { int r;

while (b != 0) { r = a % b; a = b; b = r; }

return a; }

2.2.3. Thut ton Stein Nm 1967, da trn thut ton Euclid, J.Stein xy dng mt thut ton tng i hiu qu khi lm vic vi cc s nh phn (cc php nhn vi ly tha ca 2 c thay bng cc php dch bit). Thut ton c thc hin vi cc thao tc sau: 1. . Trong trng hp c bit ta quy c . . V 2 l c s chung.

2. Nu a v b cng chn: Lp li bc ny tm k l s m ca 2. 3. Nu a chn v b l: Tng t cho trng hp a l v b chn. 4. Nu a v b cng l: a. Nu a b:

. V 2 khng l c s chung.

b. Nu a < b: 5. Lp li bc 3 v 4 n khi a = b, hoc a = 0. Tr v

2.2.3.1. Ci t trn C++

int gcdStein(int a, int b) { int k = 0; int r;

Trang 6

/* a va b cung chan */ while ( ( (a & 1) == 0 ) && ( (b & 1) == 0 ) ) { a >>= 1; b >>= 1; k += 1; }

while (a != 0) { while ( ( (a ^ b) & 1 ) == 1 ) { /* a hoac b chan */ if (a % 2 == 0) { a >>= 1; } else { b >>= 1; } }

while ( ( (a & b) & 1 ) == 1) { /* a va b cung le */ if (a < b) { r = (b - a) >> 1; b = a; a = r; } else { r = (a - b) >> 1; a = r; } } }

return (b >= 1; if ( (n % 8 == 3) || (n % 8 == 5) ) { /* Jacobi(2, n) = -1 neu n = 3, 5 (mod 8) */ nJacobi = -nJacobi; } } if (a < n) { swap(a, n); if ( (a % 4 == 3) && (n % 4 == 3) ) { /* Jacobi(a, n) = -Jacobi(n, a) neu a, b = 3 (mod 4) */ nJacobi = -nJacobi; } } /* Jacobi(a, n) = Jacobi(a mod n, n) */ a = a % n; }

/* Jacobi(0, n) = 1 neu n = 1; = 0 neu n != 1 */ if (n == 1) { return nJacobi; } else { return 0; } }

3.4.1.3. V d Vn vi vic kim tra tnh nguyn t ca n = 221, (n - 1) / 2 = 110:

1. Chn a = 47. 2. Tnh mod 221 = 220.

Trang 17

3. x = (

) = -1

x mod 221 = 220.

Sau 1 ln th, ta tm kt lun n = 221 l s nguyn t. Tip tc ln th th 2:

1. Chn a = 2. 2. Tnh 3. x = ( mod 221 = 30.

) = -1. x mod 221 = 220.

Sau 2 ln th, ta kt lun n = 221 khng l s nguyn t, a = 2 l bng chng cho kt lun ny. 3.4.1.4. Ci t trn C++

/* Kiem tra tinh nguyen to bang thuat toan Solovay-Strassen * n > 3, n = 2k + 1 */ bool solovayStrassen(BigInt n, int nTests) { if (n % 2 == 0) { return false; }

BigInt a; int x = -1;

for (int i = 0; i < nTests; i++) { /* Chon ngau nhien a thuoc [2, n - 1] */ a = rand() % (n - 2) + 2; x = calcJacobi(a, n);

if (x == 0) { return false; } else { int nMod = calcMod(a, (n - 1) / 2, n); if ( (nMod != x) && (nMod != n + x) ) { /* a^( (n - 1) / 2 ) != x (mod n) */ return false;

Trang 18

} } }

return true; }

3.4.2. Thut ton Miller - Rabin (1980) 3.4.2.1. tng Xt n l mt s nguyn t l (n - 1) l chn, ta tin hnh biu din n di dng: (s v d l cc s nguyn dng, d l). Vi mt s a bt kz nm trong tp {1, 2, 3, n-1}, theo nh l Fermat nh, ta s c:

Nhng iu c trnh by trn chnh l c s xut hin thut ton Miller-Rabin cho vic kim tra tnh nguyn t ca mt s, rng nu nh ta tm c 1 s a no tha mn:

{

th a chnh l bng chng chng minh n l hp s. Ngc li nu khng tm c s a nh vy, ta kt lun n l s nguyn t! Ngi ta tnh c rng, vi n l s nguyn ln c khong 130 ch s thp phn, nu ch thc hin mt php th th xc sut a ra kt lun sai ln ti trn 90%, nhng nu thc hin 50 php th th gi tr ny gim xung ch cn c , mt gi tr nh c th chp nhn c!

Trang 19

3.4.2.2 . V d Gi s ta cn kim tra xem n = 221 c phi s nguyn t hay khng bng thut ton MillerRabin. Tin hnh biu din (n - 1) = 220 = , vy s = 2 v d = 55.

1. Chn ngu nhin a < n, a = 174. 2. 3.

Sau 1 ln th, ta thy rng c th n l s nguyn t. Tin hnh php th th 2:

1. Chn ngu nhin a < n, a = 137. 2. 3.

Sau 2 ln th, ta chc chn n l hp s, a = 137 chnh l bng chng cho kt lun ny! 3.4.2.3. Ci t trn C++

/* Kiem tra tinh nguyen to bang thuat toan Miller-Rabin * n > 3, n = 2k + 1 */ bool millerRabin(BigInt n, int nTests) { if (n % 2 == 0) { return false; }

/* n - 1 = 2^s * d. d = 2k + 1 */ int s; BigInt d = n - 1; BigInt a;

for (s = 0; d % 2 == 0; s++) { d >>= 1; }

Trang 20

for (int i = 0; i < nTests; i++) { /* Chon ngau nhien a trong khoang [2, n - 2] */ a = (BigInt) (rand() % (n - 3)) + 2; /* x = a^d % n */ BigInt x = calcMod(a, d, n);

if (x == 1 || x == n - 1) { /* True - Tiep tuc kiem tra them neu can */ continue; }

bool bNextBigLoop = false; for (int r = 0; r < s; r++) { x = (x * x) % n; if (x == n - 1) { /* True - Tiep tuc kiem tra them neu can */ bNextBigLoop = true; break; } }

if (bNextBigLoop == true) { bNextBigLoop = false; continue; }

/* False */ return false; }

return true; }

Ch thch: V rng vic tnh thay v tnh trc tip

l khng kh thi v c th dn n mt mt gi tr khi d ln, nn

ta s tnh gin tip nh sau:

Trang 21

/* Tinh a^d % n */ int calcMod(int a, int d, int n) { int nResult = 1;

for (int nTemp = a % n; d != 0; d >>= 1) { if (d % 2 == 1) { nResult = (nResult * nTemp) % n; } nTemp = (nTemp * nTemp) % n; }

return nResult; }

Qu trnh tnh ton trn da trn mt ng thc rt quen thuc sau y, c th chng minh d dng bng bin i a thc:

(a.b) mod n =( (a mod n).(b mod n) ) mod n.

tng tc tnh ton, ta c th thay d % 2 == 1 bng (d & 1) == 1.

Ch thch: M ngun c trnh by trong bo co ny c mt cht thay i so vi m ngun c km theo trong th mc Source Code, mc ch l m bo s sng sa v d hiu. Chng trnh km theo c nhng b sung nh gip tng tc cng nh a ra bng chng khi khng nh n l hp s. 3.4.3. Thc nghim kim tra tnh chnh xc ca cng nh tham kho tc thc thi thut ton, ta tin hnh nhn bit 1,000,000 s nguyn t bt bt u t 961748941 n 982451653 bng danh sch c cung cp ti a ch: http://primes.utm.edu/lists/small/millions/primes50.zip

Cu hnh my tnh c s dng: CPU: Core 2 Duo E7400 2.8Ghz. Trang 22

RAM: 4GB DDR2 800Mhz. HH: Windows 7 Home Premium 64bit. IDE: DevCPP 4.9.2 (b dch MinGW).

Qu trnh th nghim c chia lm 2 phn: 1. Kim tra tnh nguyn t ca tng s trong danh sch 1000000 s nguyn t cho sn. 2. m s cc s nguyn t trong khong [961748941, 982451653].

Kt qu c trnh by trong bng sau (cc gi tr c ly trung bnh t 5 ln thc hin):

Phn 1 Thut ton Solovay - Strassen S php th (nTests) Thi gian (giy) Nhn sai 10 13.900 0 20 27.126 0 Thut ton Miller - Rabin 10 10.983 0 20 20.797 0

Phn 2 Thut ton Solovay - Strassen S php th (nTests) Thi gian (giy) S cc s nguyn t 10 37.650 1,000,000 20 49.275 1,000,000 Thut ton Miller - Rabin 10 20.629 1,000,000 20 30.492 1,000,000

C th thy rng vi danh sch c s dng trong phn th nghim, ch cn 10 php th i vi mi thut ton l thu c kt lun c chnh xc l 100%. Tuy nhin, v rng chng ta ang th nghim cc thut ton xc sut, m 2 phn th nghim trn u cha xut hin bt kz kt lun sai no, nn ta s thc hin thm mt phn th nghim na, tng t nh phn th nghim th 2 nhng gim s php th xung cn 5 thy s khc bit:

Phn 3 Thut ton Solovay - Strassen Thut ton Miller - Rabin

Trang 23

Thi gian (giy) Ln thc hin 1 Ln thc hin 2 Ln thc hin 3 Ln thc hin 4 Ln thc hin 5 29.936 29.677 29.014 28.593 28.441

S cc s nguyn t 1,000,875 1,000,471 1,000,000 1,000,001 1,000,000

Thi gian (giy) 15.772 15.542 15.865 15.582 15.547

S cc s nguyn t 1,000,000 1,000,000 1,000,000 1,000,000 1,000,000

Nh vy, ta c th kt lun thut ton Miller - Rabin hiu qu hn thut ton Solovay - Strassen c v thi gian thc hin ln chnh xc (trong iu kin th nghim thc t ca bo co ny).

3.5. Thut ton AKS (2002)c xut vo 06/08/2002 bi ba nh ton hc ngi n l Manindra Agrawal, Neeraj Kayal v Nitin Saxena, cho n nay AKS vn l thut ton kim tra s nguyn t duy nht c phc tp a thc . V c bn, ngi ta xem xt mt thut ton kim tra tnh nguyn t trn

cc yu cu: Tnh tng qut, tnh a thc, tnh tuyt i v cui cng l tnh v iu kin. Trong khi cc thut ton m chng ta xt bn trn ch tha mn c nhiu nht l 3 yu cu, th AKS l thut ton duy nht: C tnh tng qut: Thut ton AKS c th kim tra tnh nguyn t ca mt s nguyn n bt kz. Mt vi thut ton kim tra tnh nguyn t khc ch c th lm vic vi nhng s c tnh cht c bit, nh thut ton Lucas-Lehmer ch lm vic vi cc s Mersenne, hay nh thut ton Ppin ch lm vic vi cc s Fermat. C phc tp a thc: C th l nh ni trn.

C tnh tuyt i: Khi thut ton AKS kt lun mt s n no l s nguyn t hoc l hp s, th kt lun c chnh xc tuyt i. Nhng thut ton nh Miller-Rabin hay SolovayStrassen ch c th a ra kt lun mang tnh cht xc sut, hay c th hn, 2 thut ton c th nhn nhm mt hp s l s nguyn t.

C tnh v iu kin: S ng n ca thut ton AKS hon ton khng ph thuc vo bt c gi thit cha c chng minh no. Mc d thut ton Miller-Rabin cng c th khng nh tuyt i mt s n bt kz l s nguyn t hay khng vi thi gian tnh a thc, tuy nhin tnh ng n ca thut ton li ph thuc vo s ng sai ca mt gi thit cha c chng minh gi thit Riemann tng qut! Trang 24

3.5.1. tng Thut ton AKS da trn nh l: Mt s nguyn n (n > 2) l s nguyn t khi v ch khi: (1) ng vi mi s nguyn a l s nguyn t cng nhau vi n (hoc ch cn ng vi mt s gi tr ca a, c bit khi a = 1). Vi nh l trn, ta thy rng thi gian tnh ca thut ton s l mt hm m. gim phc tp, thut ton AKS tin hnh bin i (1) thnh: (2) hay theo mt cch khc: (3) vi f v g l cc a thc. Lu { rng khi g = 0, (3) tr thnh (1). V d: n = 3, a = 2:

Tuy nhin, (3) khng ch ng vi cc s nguyn t m cn ng vi mt s trng hp n l hp s. Thut ton AKS ch ra rng, vi mt s r v b s A thch hp, nu (3) tha mn vi mi ta kt lun n l s nguyn t. 3.5.2. Thut ton 3.5.2.1. Thut ton chnh thc Thut ton c trnh by trong cun PRIMES is in P: th

bool aks(int n) { if ( ) { return false; }

r = 2;

Trang 25

while (r < n) { if (cln(r, n) != 1) { return false; }

if (r l s nguyn t) { q = tha s nguyn t ln nht ca (r - 1); if ( (

break;

) && (

) ) {

} }

r += 1; }

for (int a = 1; a