Sunteți pe pagina 1din 37

LUCRAREA 1

ANALIZA EXPERIMENTALĂ ENTROPICĂ A

SURSELOR DE INFORMAŢIE

Cod Sursa:

#include <iostream>

#include <stdlib.h>

#include <math.h>

using namespace std;

int main()

int n=64,i;

float p[n],s=0,s_info;

cout<<"Valori random:"<<endl;

for(i=0;i<n;i++)

p[i]=rand()+i; // P[I] i-a valori random

cout<<p[i]<<endl;//afisarea fiecarei valori

s+=p[i];// se aduna suma tuturor valorilor

cout<<endl<<"Probabilitati"<<endl;

for(i=0;i<n;i++)

p[i]=p[i]/s;// se imparte fiecare valoare la suma totala ale acestora

cout<<p[i]<<endl;// afisarea fiecarei probabilitati


}

cout<<endl<<"Informatia asociata probabilitatilor:"<<endl;

float info[n];

for(i=0;i<n;i++)

info[i]=-log2(p[i]);//Informaþia asociatã fiecãrui simbol/stare este datã de relaþia

cout<<info[i]<<endl;// afisarea informatiei asociata probabilitatilor

cout<<endl<<"Entropia:"<<endl;

float h=0;

for(i=0;i<n;i++)

h+=p[i]*info[i]; //relatia informaţie medie generată numita si entropie

cout<<h<<endl; //afisarea entropiei

return 0;

}
LUCRAREA 2

ANALIZA EXPERIMENTALĂ ENTROPICĂ A

SISTEMELOR DE TRANSMISIE DE DATE

Codul Sursa :

#include <iostream>

#include <math.h>

#include <stdlib.h>

using namespace std;

int main()

int n=5,i,j,k;

float m[n][n],s[n],h1=0,h2=0;

cout<<"k=";

cin>>k;

cout<<"Valori random:"<<endl;

for(i=0;i<n;i++)

s[i]=0; //suma ia valoarea 0

for(j=0;j<n;j++)

m[i][j]=rand()+1;//m[i][j] i-a valori random

cout<<m[i][j]<<"\t";//afisarea fiecarei valori

s[i]+=m[i][j]; //se aduna suma tuturor valorilor

}
cout<<endl;

cout<<endl<<"Probabilitati:"<<endl;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

m[i][j]=m[i][j]/s[i];// se imparte fiecare valoare la suma totala ale acestora

cout<<m[i][j]<<"\t";// afisarea fiecarei probabilitati

cout<<endl<<"Entropia H1:"<<endl;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

h1+=-m[i][j]*log2(m[i][j]); // relatia ce calculeaza entropia H1

cout<<h1<<endl; //afisarea entropiei

cout<<endl<<"Valorile dupa adaugarea lui k:"<<endl;

for(i=0;i<n;i++)

m[i][i]=m[i][i]+k; // ss adauga constanta k pentru fiecare element al diagonalei matricei

s[i]=0;//suma ia valoarea 0

for(j=0;j<n;j++)
{

s[i]+=m[i][j]; //se aduna suma tuturor noilor valorilor

cout<<m[i][j]<<"\t"; //afisarea fiecarei probabilitati dupa adugarea lui k

cout<<endl<<"Probabilitati dupa adaugarea lui k:"<<endl;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

m[i][j]=m[i][j]/s[i];//se imparte fiecare valoare la suma totala ale acestora

cout<<m[i][j]<<"\t"; //afisarea fiecarei probabilitati

cout<<endl<<"Entropia H2:"<<endl;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

h2+=-m[i][j]*log2(m[i][j]);// relatia ce calculeaza entropia H2

cout<<h2<<endl;//afisarea entropiei

return 0;}
Metoda Shannon – Fano

Codul Sursa:

#include<iostream>

#include<cmath>

#include<cstdlib>

#include<string.h>

using namespace std;

int main()

int n,i,j,k,ok;

float p[10],s=0,aux=0,s1,s2,s3,s4,d1,d2;

char cod1[10]="0",cod2[10]="0";

cout<<"n=";cin>>n;

cout<<"Apasati tasta 1 pentru valori de la tastatura,iar pentru valori random apasati orice alta
tasta"<<endl;

cin>>ok;

if(ok==1)

{cout<<"Suma elementelor vectorului probabilitatilor trebuie sa fie egala cu 1"<<endl;

for(i=1;i<=n;i++)//vector probabilitati inserat de le tastatură

{cout<<"p["<<i<<"]=";cin>>p[i];

s=s+p[i];}

cout<<endl<<"Suma elementelor vectorului probabilitatilor este: "<<s;

if(s==1)

{cout<<endl<<"Corect";}

else {cout<<endl<<"Alege alte valori pentru vectorul probabiltatilor"<<endl;

return 0;
}}

else

{cout<<"Valori random:"<<endl;

for(i=1;i<=n;i++)

p[i]=rand()+1; // P[I] i-a valori random

cout<<p[i]<<endl; //afisarea fiecarei valori

s+=p[i]; // se aduna suma tuturor valorilor

cout<<endl<<"Probabilitati:"<<endl;

for(i=1;i<=n;i++)

p[i]=p[i]/s; // se imparte fiecare valoare la suma totala ale acestora

cout<<"P["<<i<<"]="<<p[i]<<endl; // afisarea fiecarei probabilitati

}}

cout<<" "<<endl;

for(i=1;i<=n-1;i++) //ordonarea descrescatoare a probabilitatilor

for(j=i+1;j<=n;j++)

if(p[j]>p[i])

aux=p[i];

p[i]=p[j];

p[j]=aux;

cout<<endl<<"Ordonare descrescatoare:"<<endl;

for(i=1;i<=n;i++) cout<<"p["<<i<<"]="<<p[i]<<endl;
cout<<endl;

k=0;

cout<<"Codificare:"<<endl;

for(i=1;i<n;i++) //împărțirea vectorului în subgrupe și prelucrarea lor

{ s1=0;

s2=0;

s3=0;

s4=0;

s3+=p[i];

s4=1-s3;

d1=abs(s4-s3);

s1=s3+p[i+1];

s2=1-s1;

d2=abs(s1-s2);

if(d1<=d2) //codificarea cu 0 sau 1 pe baza algoritmului studiat până se parcurge întreg vectorul

cout<<p[i]<<"->cod "<<cod1<<endl;

cod1[10]=0;

cod2[10]=0;

strcpy(cod1,"1");

strcpy(cod2,"1");

for(j=0;j<k;j++)

strcat(cod1,"1");

strcat(cod2,"1");

}
if(i!=(n-2))

strcat(cod1,"0");

strcat(cod2,"0");

else

strcat(cod1,"0");

strcat(cod2,"1");

cout<<p[i]<<"->cod "<<cod1<<endl<<p[i+1]<<"->cod "<<cod2<<endl;

i=i+1;

cod1[10]=0;

cod2[10]=0;

strcpy(cod1,"1");

strcpy(cod2,"1");

for(j=0;j<k;j++)

strcat(cod1,"1");

strcat(cod2,"1");

if(i!=(n-2))

strcat(cod1,"0");

strcat(cod2,"0"); //concatenarea șirurilor,adică adaug pe 0 la cod 2

}
}

k++;

return 0;

Valori de la tastatura :
Valori random:
Metoda Huffman-Schwartz

Codul sursa :

#include <iostream>

#include <stdlib.h>

#include <math.h>

using namespace std;

void citire(float a[20][20])//functie de citire care preia direct probabilitatile scrise

a[1][1]=0.35;

a[1][2]=0.23;

a[1][3]=0.14;

a[1][4]=0.1;

a[1][5]=0.06;

a[1][6]=0.05;

a[1][7]=0.04;

a[1][8]=0.03;

void sortare(float a[20][20],int n)//functia de ordonare descrescatoare

{int i,j,ok;

float aux;

for(i=1;i<=8;i++)

do{

ok=0;
for(j=1;j<=n-1;j++)

if(a[i][j]<a[i][j+1])

aux=a[i][j];

a[i][j]=a[i][j+1];

a[i][j+1]=aux;

ok=1;

}while(ok == 1);

void afisare(float a[20][20],int n)//functia de afisare a probabilitatilor

int i,j;

for(i=1;i<8;i++)

for(j=1;j<=n;j++)

cout<<a[i][j]<<" ";

}cout<<endl;

int main()
{

int i,j,k,l,vi,c,n=8;

float a[20][20],cod[20],e;

for(i=1;i<=n;i++)

for(j=0;j<=n;j++)

a[i][j]=0; //toate elementele matricei ia valoarea 0

citire(a); //se apeleaza functia citire

sortare(a,n);//se apeleaza functia sortare

vi=n;

for(i=2;i<=n;i++)

a[i][vi-1]=a[i-1][vi-1]+a[i-1][vi]; //se calculeaza suma ultimelor doua probabilitati

for(j=1;j<vi-1;j++)

a[i][j]=a[i-1][j];//Se vor copia restul elementelor de pe linia anterioara pana la coloana


vi-1

sortare(a,n);//se sorteaza descrescator

vi=vi-1;//se scade 1 la valoarea lui vi pentru a se calcula urmatoarea etapa

cout<<"Etapele aplicari metodei Huffman-Schwartz"<<endl;

afisare(a,n);

cout<<""<<endl<<"Codurile obtinute pentru mesaje sunt urmatoarele:"<<endl;

k=n;i=1;
for(j=1;j<=n;j++)

cout<<a[1][j]<<"->";

k=n;//se ia valoarea maxima a coloanei, acesta scade pentru a se face verificarea


ultimelor 2 valori de pe fiecare linie

e=a[1][j];//variabila in care se ia fiecare probabilitate

i=1;

l=1;//dimensiunea vectorului cod, acesta ia valoarea implicita 1 cand trece la urmatorul


element

while(k>=0)

if(e==a[i][k]) //daca probabilitatea se afla pe ultima coloana din linie

cod[l]=1; //se va introduce in vectorul cod[] valoarea 1, daca se afla in ultima coloana

e=a[i][k]+a[i][k-1]; //e devine suma dintre ultimele 2 probabilitati de pe linie si va fi


cautat pe linia urmatoare

k--;i++;l++;

else if(e==a[i][k-1]) //daca probabilitatea se afla pe penultima coloana din linie

cod[l]=0;//se va introduce in vectorul cod[] valoarea 0, daca se afla in penultima


coloana

e=a[i][k-1]+a[i][k]; //e devine suma dintre ultimele 2 probabilitati de pe linie si va fi


cautat pe linia urmatoare

k--;i++;l++;

else //daca probabilitatea nu se afla pe ultimele 2 coloane din linie,

{k--;i=i+1;}
}

for(c=l-2;c>=1;c--)

cout<<cod[c]<<" ";}//afisarea codului corespunzator mesajului

cout<<endl;

return 0;

}
Codurile Hamming

Codul sursa :

#include <iostream>

using namespace std;

int main()

int a[10],i;

cout<<"Codificare sistematica"<<endl;

cout<<"Biti informationali"<<endl;

cout<<"a[1]=";cin>>a[1];//citirea bitului infomational a[1] de la tastatura

cout<<"a[2]=";cin>>a[2];//citirea bitului infomational a[2] de la tastatura

cout<<"a[3]=";cin>>a[3];//citirea bitului infomational a[3] de la tastatura

cout<<"a[4]=";cin>>a[4];//citirea bitului infomational a[4] de la tastatura

a[5]=(a[2]+a[3]+a[4])%2;//suma modulo 2 pentru calcularea bitului de test a[5]

a[6]=(a[1]+a[3]+a[4])%2;//suma modulo 2 pentru calcularea bitului de test a[6]

a[7]=(a[1]+a[2]+a[4])%2;//suma modulo 2 pentru calcularea bitului de test a[7]

cout<<" "<<endl;

cout<<"Cuvant de cod"<<endl;

for(i=1;i<=7;i++)

{cout<<a[i];} //afisarea cuvant de cod

for(i=1;i<=7;i++)
{a[i]=0;} //toate elementele vectorului iau valoarea 0

cout<<" "<<endl<<endl;

cout<<"Codificare ponderata"<<endl;

cout<<"Biti informationali"<<endl;

cout<<"a[3]=";cin>>a[3];//citirea bitului infomational a[3] de la tastatura

cout<<"a[5]=";cin>>a[5];//citirea bitului infomational a[5] de la tastatura

cout<<"a[6]=";cin>>a[6];//citirea bitului infomational a[6] de la tastatura

cout<<"a[7]=";cin>>a[7];//citirea bitului infomational a[7] de la tastatura

a[1]=(a[3]+a[5]+a[7])%2;//suma modulo 2 pentru calcularea bitului de test a[1]

a[2]=(a[3]+a[6]+a[7])%2;//suma modulo 2 pentru calcularea bitului de test a[2]

a[4]=(a[5]+a[6]+a[7])%2;//suma modulo 2 pentru calcularea bitului de test a[4]

cout<<" "<<endl;

cout<<"Cuvant de cod"<<endl;

for(i=1;i<=7;i++)

cout<<a[i];//afisarea cuvant de cod

}
Codul ciclic
Codul sursa :

#include <iostream>

using namespace std;

int main()

int a[10],i;

cout<<"Biti informationali"<<endl;

//partea semnificativa

cout<<"s[1]=";cin>>a[1];//citirea bitului infomational a[1] de la tastatura

cout<<"s[2]=";cin>>a[2];//citirea bitului infomational a[2] de la tastatura

cout<<"s[3]=";cin>>a[3];//citirea bitului infomational a[3] de la tastatura

cout<<"s[4]=";cin>>a[4];//citirea bitului infomational a[4] de la tastatura

a[5]=(a[1]+a[2]+a[3])%2;//relatia de calcul a bitului de test a[5]

a[6]=(a[2]+a[3]+a[4])%2;//relatia de calcul a bitului de test a[6]

a[7]=(a[1]+a[2]+a[4])%2;//relatia de calcul a bitului de test a[7]

cout<<"Biti de test"<<endl;

//partea de test

for(i=5;i<=7;i++)

cout<<"t["<<i<<"]="<<a[i]<<endl;//afisarea bitilor de test

cout<<" "<<endl;

cout<<"Cuvant de cod"<<endl;
for(i=1;i<=7;i++)

{cout<<a[i];} //afisarea cuvantului de cod

return 0;

}
Cifrul lui Caesar
Codul sursa:

#include <iostream>

#include <bits/stdc++.h>

using namespace std;

int main()

int o;

char s[200];

cin.getline(s,200);

int i=0,k;

cout<<"k=";

cin>>k;

while(s[i]!='\0')//cat timp s[i] este diferit de caracterul cu codul 0, numit și caracter nul,
notat în C++ cu '\0'

//criptare litere mari

if(s[i]>='A' && s[i]<= 'Z') // daca s[i] are valori intre A si Z, in cod ASCII: A=65,Z=90

if((int)s[i]+k>90) //daca valoarea lui s[i]+k este mai mare de 90

cout<<(char)((int)s[i]+k-26);//la valoarea s[i] se adauga k si se scade 26 pentru a


ramane in intervalul 65-90

else

cout<<(char)((int)s[i]+k); //la valoarea lui s[i] se adauga k

}
else

//criptare litere mici

if(s[i]>='a' && s[i]<= 'z')// daca s[i] are valori intre a si z, in cod ASCII: a=97,z=122

if((int)s[i]+k>122)//daca valoarea lui s[i]+k este mai mare de 122

cout<<(char)((int)s[i]+k-26);//la valoarea s[i] se adauga k si se scade 26 pentru a


ramane in intervalul 97-122

else

cout<<(char)((int)s[i]+k);//la valoarea lui s[i] se adauga k

else

cout<<s[i]; //afisarea spatiului

i++;

return 0;

}
Criptarea prin substituţie monoalfabetică

Cod Sursa:

#include<iostream>

#include<stdio.h>

#include<conio.h>

#include<string.h>

using namespace std;

int main()

int i,j,lungimep,lungimec;

char pt[53] = {

'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',' ',

'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};//valorile pe
care le poate lua p

char ct[53] = {

'Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M',' ',

'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};//valorile
criptate ale lui p

char p[200] = { '\0' }, c[200] = { '\0' }, r[200] = { '\0' };//toti vectori iau valoarea nula

cout << "Introduceti Mesajul:";

cin.getline(p,200);//se introduce mesajul

lungimep=strlen(p);//se calculeaza lungimea vectorului p

cout<<endl;

//Criptare
for (i = 0; i < lungimep; i++)//se parcurge sirul caracterelor

for (j = 0; j < 53; j++)

if (pt[j] == p[i])//daca caracterul din mesajul introdus este egal cu un


caracter din alfabet

c[i] = ct[j];//caracterul din mesajul introdus ia valoarea


caracterului din vectorul de valori criptate

cout << "Mesajul criptat este:" << c<<endl;//afisare mesaj criptat

lungimec=strlen(c); //se calculeaza marimea vectorului c

//Decriptare

for (i = 0; i < lungimec; i++) //se parcurge sirul caracterelor

for (j = 0; j < 53; j++)

if (ct[j] == c[i])//daca caracterul din mesajul criptat este egal cu un


caracter din vectorul de valori criptate

r[i] = pt[j];//caracterul din mesajul criptat ia valoarea


caracterului din vectorul ce contine alfabetul

cout << "Mesajul decriptat este: " << r << endl;//afisare mesaj decriptat
return 0;

}
Algoritmul R.S.A.

Codul sursa:

#include <iostream>

#include <math.h>

using namespace std;

bool numarprim(int p)//functie de verificare numar prim

{ int ok=1,i;

if (p<2)

ok=0;

for(i=2; i*i<=p; i++)//intervalul in care se pot gasi divizori proprii

if(p%i==0)//daca restu impartiri este 0

ok=0;//ok ia valoarea 0

if(ok==1) // daca ok ramane cu valoarea 1

return true; // numarul este prim

else // daca ok are valoarea 0

return false; // numarul nu este prim


}}

int dcalcul(int e,int z)//relatia de calcul pentru d

int k=1;//1 este rezultatul (e*d)mod(z)

while(1)//se cauta valori ale lui k pana cand restu impartiri lui k la e este 0,adica pana se
satisface conditia la if

k=k+z;//i se adauga lui k valoarea lui z

if(k%e==0)//daca restu impartiri este 0

return(k/e);//dcalcul ia valoarea k/e = d

int main()

{ int q,e,z,n,p,c,d,m,a,l,flag,i,j,adevarat;

bool prim=true;

char msgclar[100],msgcodat[100],msgdecodat[100];

cout<<"p=";

cin>>p;

prim=numarprim(p);//prim ia valoarea true sau fals

if(!prim)//daca prim este false

cout<<"Numarul nu este prim"<<endl;


return 0;

else//daca prim este true

cout<<"Numarul este prim"<<endl;

cout<<"q=";

cin>>q;

prim=numarprim(q);//prim ia valoarea true sau fals

if(!prim)//daca prim este false

cout<<"Numarul nu este prim"<<endl;

return 0;

else//daca prim este true

cout<<"Numarul este prim"<<endl;

n=p*q;//relatia de calcul a lui n

cout<<"n="<<n<<endl;//afisare n

z=(p-1)*(q-1);//relatia de calcul a lui z

cout<<"z="<<z<<endl;//afisare z

for(j=2;j<z;j++) //se alege un numar prim e

if(z%j==0)//daca restu impartiri este 0

continue;
prim=numarprim(j);//verifica daca j este prim

if(prim && j!=p && j!=q)//daca j este prim si este diferit de q si p

e=j;//e ia valoarea j

flag=dcalcul(e,z);//flag ia valoarea lui dcalcul

if(flag>0)//daca flag mai mare ca 0

d=flag;//d ia valoarea lui flag

break; //atunci cand e si d au luat valori bucla se opreste

cout<<"e="<<e<<endl;

cout<<"d="<<d<<endl;

cout<<"cheie publica("<<n<<","<<e<<")"<<endl;

cout<<"cheie privata("<<n<<","<<d<<")"<<endl;

cout<<"Tip mesaj:"<<endl;

cout<<"1.INT"<<endl;

cout<<"2.CHAR"<<endl;

cin>>adevarat;

if(adevarat==2)

{cout<<"Introduceti mesajul:";

cin>>msgclar;

for(a=0;msgclar[a]!='\0';a++)

{//algoritm de criptare

m=msgclar[a];//conversie char in cod ASCII


l=1;

for(i=0;i<e;i++)//relatia: c[i] = m[i]^e mod(n)

l=l*m;

l=l%n;

c=l;

msgcodat[a]=c;//conversie int in char

//algoritm de decriptare

l=1;

for(i=0;i<d;i++)//relatia: m[i] = c[i]^d mod(n)

l=l*c;

l=l%n;

m=l;

msgdecodat[a]=m;//conversie int in char

msgcodat[a]=-1;

msgdecodat[a]=-1;

cout<<"Mesajul criptat este :";

for(i=0;msgcodat[i]!=-1;i++)

cout<<msgcodat[i];//afisare mesaj codat

cout<<endl;
cout<<"Mesajul decriptat este :";

for(i=0;msgdecodat[i]!=-1;i++)

cout<<msgdecodat[i];//afisare mesaj decriptat

return 0;

else if(adevarat==1)

cout<<"Introduceti mesajul:";

cin>>m;

l=1;

for(i=0;i<e;i++)//relatia: c[i] = m[i]^e mod(n)

l=l*m;

l=l%n;

c=l;

cout<<"Mesajul criptat este :"<<c<<endl;//afsiare mesaj criptat

l=1;

for(i=0;i<d;i++)//relatia: m[i] = c[i]^d mod(n)

l=l*c;

l=l%n;

m=l;
cout<<"Mesajul decriptat este :"<<m<<endl;//afisare mesaj decriptat

return 0;

else

cout<<"Tasta invalida"<<endl;

return 0;

}
INT:

CHAR:

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