Upload
hoai-ba-dinh
View
779
Download
0
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