Sunteți pe pagina 1din 4

Criptografie laborator 3

Laborator 3

1) S se scrie un program cu ajutorul cruia s se determine daca un numr este prim.


//test primalitate determinist
#include<iostream>
#include<math.h>
#include<conio.h>
using namespace std;

int prim( int x){


int i;
if ((x==1)||(x==2)) return 1;
if (x%2==0) return 0;
for(i=3;i<=sqrt((double)x);i+=2)
if(x%i==0) return 0;
return 1;
}
void main(){
int n;
cout<<"Dati un numar natural nenul-->";
cin>>n;
if(prim(n))
cout<<"\nNumarul "<<n<<" este prim"<<endl;
else
cout<<"\nNumarul "<<n<<" nu este prim"<<endl;
getch();
}

2) S se scrie un program care s realizeze descompunerea n numere prime a unui numr dat.
// descompunerea in numere prime pentru un numar dat
#include<iostream>
#include<conio.h>
#include<math.h>
using namespace std;
int prim(int x){
int i;
if ((x==1)||(x==2)) return 1;
if (x%2==0) return 0;
for(i=3;i<=sqrt((double)x);i+=2)
if(x%i==0) return 0;
return 1;
}

Criptografie laborator 3
void afisare(int x,int y){//afisam corespunzator x la puterea y
if(y==1)
cout<<x;
else
cout<<x<<"^"<<y;
}

void main(){
int n,i,j=0,k=2;
cout<<"Dati un numar natural nenul-->";
cin>>n;
if(prim(n))
cout<<"\nNumarul scris este prim."<<endl;
else{
cout<<"\nDescompunerea numarului "<<n<<" in numere prime
este:\n"<<n<<"=";
while (k<=n){//se poate pune sqrt((double)n) in loc de n ?
if(prim(k)){//este necesar acest test?
i=0;
if(n%k==0)j++;
while (n%k==0){
i++;
n/=k;
}
if(i!=0)
if(j==1)
afisare(k,i);
else{
cout<<"*";
afisare(k,i);
}
}
k++;//se poate lua k+=2?
}
cout<<endl;
}
getch();
}

3) Pornind de la funciile de mai jos (eventual modificndu-le corespunztor) s se scrie programe pentru
implementarea testelor de primalitate: Fermat, Miller_Rabin i Solovay_Strassen.
int test_Fermat(long n,long nr_incercari){
if(n==2)return 1;
if(n%2==0)return 0;
for(;nr_incercari>0;nr_incercari--){
int random1 = rand(),random2 = rand();
long b= (random1 << 16) | random2;//pentru a avea numar obtinut random
mare (rand intoarce un int)(se poate renunta?)
b=2+b%(n-2);
if(cmmdc(b,n)!=1)return 0; //este necesar acest test?
if(a_la_b_mod_c(b,n-1,n)!=1)return 0;
}
return 1;
}

Criptografie laborator 3
int test_Miller_Rabin(long n,long nr_incercari){
if(n==2) return 1;
if(n%2==0)return 0;
for(;nr_incercari>0;nr_incercari--){
long s=0,t=n-1,b= rand();
b=2+b%(n-2);
while(t%2==0){
s++;
t/=2;
}
t=a_la_b_mod_c(b,t,n);//in t pastram acum puterile b^t,b^(2t),...
if(t!=1){
while((t!=n-1)&&(--s>0)){//testam pentru nr de forma b^((2^r)*t) cu
r din multimea {1,2,...,s-1}
t=(t*t)%n;
if(t==1)return 0;
}
if(t!=n-1)return 0;
}
}
return 1;
}

int Jacoby_symbol(long b,long p){//calculam (b/p)


b%=p;
if(b==0)return 0;
long temp=(long)sqrt(b);
for(int i=1;i<=p-1;i++)
if((i*i)%p==b)return 1;//se poate inlocui cu ceva mai convenabil?
return p-1;//este -1 mod p
}
int test_Solovay_Strassen(long n,long nr_incercari){
if(n<=2) return 1;
if(n%2==0)return 0;
for(;nr_incercari>0;nr_incercari--){
long b= rand();
b=1+b%(n-1);
if(a_la_b_mod_c(b,(n-1)/2,n)!=Jacoby_symbol(b,n)) return 0;
}
return 1;
}

4) S se scrie un program care s scrie coninutul fiierului sursa.txt n fiierul destinatie.txt.


Indicaie: se pot folosi ca modele funciile scrie_in_fisier i citeste_din_fisier.
#include <fstream>//lucreaza cu fluxuri (stream-uri)
...
void citeste_din_fisier(){
char c;
ifstream in("sursa.txt"); //deschidem fisierul pentru citire
//echivalent cu:
//fstream in("sursa.txt",ios::in);)
if(in.good()){

Criptografie laborator 3
cout<<"Fisierul a fost deschis cu succes.\nContinutul acestuia
este:\n\n";
while(!in.eof()) // cat timp nu s-a ajuns la sfarsitul fisierului sursa
{
in>>c;
cout<<c;
}
}
else
cout<<"Eroare la deschiderea fisierului.";
in.close();//inchidem fisierul
}
void scrie_in_fisier(char* mesaj){//vom scrie caracter cu caracter
ofstream out("destinatie.txt"); //deschidem fisierul pentru scriere
//echivalent cu:
//fstream out("destinatie.txt",ios::out);)
//pentru a adauga text intr-un fisier:
//fstream out("destinatie.txt",ios::app);
int i=0;
while(mesaj[i]!='\0') // cat timp nu s-a ajuns la sfarsitul mesajului
{
out<<mesaj[i];
i++;
}
out.close();//inchidem fisierul
}

S-ar putea să vă placă și