Jump to content
vladiii

Algoritmul Miller-Rabin

Recommended Posts

In primul rand, daca gasiti vreo eroare in codul scris de mine sau vreo greseala de algoritm, va rog sa o mentionati, pentru ca nici eu nu sunt 100% sigur de codul pe care l-am facut.

Ok, ce este Algoritmul Miller-Rabin ? Numele sau intreg este: "Testul de primalitate al numerelor Miller-Rabin". Practic verifica daca un numar este prim sau nu. Insa, nu degeaba se numeste test, pentru ca probabilitatea ca raspunsul returnat de program nu este maxima (pow(4,-k)).

Si poate va intrebati, de ce sa folosesc acest algoritm, cand pot sa impart numarul la toate numerele mai mici decat sqrt(numar) ? Pai da, dar acesta este mult mai rapid si are o complexitate mai mica :-)

Va prezint in continuare codul scris de mine in C (astept imbunatatiri sau corectari):


#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <math.h>
int main()
{
long numar, s=0, a=0, r, d=0, k, aux1=0, aux2=0, i=0, aux3=0, aux4=0;
div_t aux5;
printf("Introdu numarul: ");
scanf("%d", &numar);
printf("\nIntrodu un numar k(probabilitatea este 4 la puterea -k): ");
scanf("%d", &k);
aux1=numar-1;
while(aux1%2 !=1) {
if(aux1%2==0) {
s++; }
aux1=aux1/2; }
printf("%ld", (int)pow(2,s));
aux4=(long)pow(2,s);
aux5=div(numar-1,aux4);
d=aux5.quot;
printf("\nPuterea lui 2 este: %ld iar restul este: %ld", s, (long)d);
if(numar==2 || numar==3 || numar==5 || numar==7 || numar==11) {
printf("\nNumarul este prim"); }
else if(numar=4 || numar==6 || numar==8 || numar==9 || numar==10) {
printf("\nNumarul nu este prim/ este compus"); }
else {
srand(time(NULL));
for(i=0;i<k;i++) {
a=rand() %(numar-1)+1;
aux2=(long)pow(a,d)%numar;
for(r=0;r<=s-1;r++) {
if(aux2 !=1 & (long)pow(a,pow(2,r)*d)%numar !=numar-1) {
aux3=1; } } }
if(aux3==1) { printf("\nNumarul este prim"); }
else { printf("\nNumarul nu este prim/ este compus"); } }
getch();
return 0;
}

Sper sa va fie de folos la ceva (si ma repet, postati eventualele greseli de algoritm ;)).

P.S. Pentru un "accuracy" mai bun puteti sa generati toate numerele A din intervalul [1, numar-1], insa asta va ingreuna timpul de executie (eu am ales numere random).

Bibliografie:


[url]http://en.wikipedia.org/wiki/Miller-Rabin_primality_test[/url]
+
[url]http://vladii.wordpress.com[/url]

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...