Sunteți pe pagina 1din 4

Criptografie laborator 2

Laborator 2
1) S se scrie un program cu ajutorul cruia s se determine inversa unei matrice cu dou linii i dou coloane cu elemente din Zn. 2) S se scrie un program cu ajutorul cruia s se calculeze valoarea unui determinant de un ordin dat. 3) S se scrie un program care determin inversa unei matrice cu elemente numere reale.
//calcul matrice inversa #include <iostream> #include<conio.h> using namespace std;

void main(){ int i,j,l,n; float a[100][200],d=1; cout<<"Dati ordinul matricei-->"; cin>>n; cout<<"\nDati elementele matricei\n"; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>a[i][j]; for(i=1;i<=n;i++) for(j=n+1;j<=2*n;j++) if(i==(j-n)) a[i][j]=1; else a[i][j]=0; for(i=1;(i<=n)&&(d!=0);i++) { for(j=i;(j<=n)&&(a[j][i]==0);j++); if(j>n) d=0; else if(j>i) for(l=1;l<=2*n;l++) a[i][l]+=a[j][l]; if(a[i][i]!=1) for(l=2*n;l>=1;l--) a[i][l]/=a[i][i]; for(j=1;j<=n;j++) if(j!=i) for(l=2*n;l>=i;l--) a[j][l]-=a[j][i]*a[i][l]; } if(d==0) cout<<"\nMatricea nu este inversabila!!!"; else

Criptografie laborator 2
{ cout<<"\nMatricea inversa este:\n"; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<a[i][n+j]<<" "; cout<<endl; } } getch(); }

4) Folosind eventual funciile calcul_minor i calcul_det descrise mai jos s se scrie un program cu ajutorul cruia s se determine inversa unei matrice ptratice cu elemente din Zn. Algoritmul de la problema anterioar poate fi folosit in acest caz?
int** calcul_minor(int **matrice,int lin,int col,int n){ /*calculeaza minorul corespunzator pentru lin, col din matricea matrice*/ int i,j,**a=new int *[n-1]; for(i=0;i<n-1;i++){ a[i]=new int[n-1]; } for(i=0;i<n-1;i++) for(j=0;j<n-1;j++) if(i<lin){ if(j<col) a[i][j]=matrice[i][j]; else a[i][j]=matrice[i][j+1]; } else{ if(j<col) a[i][j]=matrice[i+1][j]; else a[i][j]=matrice[i+1][j+1]; } return a; }

int calcul_det(int** matrice,int n){ /*calculeaza valoarea determinantului matricei matrice*/ if(n<=1) return matrice[0][0]; int S=0; for(int i=0;i<n;i++) S+=matrice[0][i]*(i%2?-1:1)*calcul_det(calcul_minor(matrice,0,i,n),n-1); return S; }

Criptografie laborator 2

5) S se scrie un program pentru ridicarea la putere prin ptrate succesive in Zn. Indicaie: se poate folosi algoritmul folosit in funcia a_la_b_mod_c.
int a_la_b_mod_c(int a, int b, int c) { int p=1; a%=c; while (b>0) { if (b%2) p=(p*a)%c; a=(a*a)%c; b/=2; } return p; }

6) S se scrie un program cu ajutorul cruia s se realizeze scrierea unui numr dintr-o baz n alta.
//scrierea unui numar dintr-o baza de numeratie in alta #include<iostream> #include<conio.h> using namespace std;

int nr_din_string(char c){//a->10,B->11... if(c<='9' && c>='0') return (int)(c-'0'); if(c<='z' && c>='a') return (int)(c-'a'+10); if(c<='Z' && c>='A') return (int)(c-'A'+10); return 0; } char string_din_numar(int nr){//10->A,11->B if(nr<=9 && nr>=0) return (char)(nr+'0');//a=10,B=11... if(nr<=35 && nr>=10) return (char)(nr-10+'A');//35 provine din 10 (0...9) + 25 (A..Z) return '0'; } int transformare_in_baza_10 (char nr[], int baza) { int i=0,rez=0; while(nr[i]!='\0') rez=rez*baza+nr_din_string(nr[i++]); return rez; } void transformare_din_baza_10 (int nr, int baza,char rezultat[]) { char temp[20],i=0; while(nr>0){ temp[i++]=string_din_numar(nr%baza); nr/=baza; }

Criptografie laborator 2
rezultat[i]='\0'; for(int j=0;j<i;j++) rezultat[j]=temp[i-j-1]; } void main () { int b1,b2; char nr[20]; cout<<"Dati baza initiala->"; cin>>b1; cout<<"\n Dati un numar scris in baza "<<b1<<"->"; cin>>nr; cout<<"\nDati baza finala->"; cin>>b2; transformare_din_baza_10(transformare_in_baza_10(nr,b1),b2,nr); cout<<"\nNumarul scris in baza "<<b2<<" este->"<<nr<<endl; getch(); }

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