#define real float
#include <math.h>

void mult_mv(real **a,int n,real *x, real *ax){
int i,j;
for(i=0;i<=n;i++){
	ax[i]=0; for(j=0;j<=n;j++) ax[i]+=a[j][i]*x[j];}
}
real dot(real *x,real *y,int n){
real s=0; int i;
for(i=0;i<=n;i++) s+=x[i]*y[i];
return s;
}
real expect(real **a,int n,real *x){
real *ax; ax=(real*)malloc(n*sizeof(real));
mult_mv(a,n,x,ax); return dot(x,ax,n)/dot(x,x,n); free(ax);
}
real ground(real **a,int n,real *x){
real e,s,*dx,*ax,eps=0.001,alpha; int i;
dx=(real*)malloc(n*sizeof(real));
ax=(real*)malloc(n*sizeof(real));
do{
mult_mv(a,n,x,ax); e=dot(x,ax,n)/dot(x,x,n);
for(i=0;i<=n;i++) dx[i]=ax[i]-e*x[i];
alpha=-1/expect(a,n,dx);
for(i=0;i<=n;i++) x[i]+=alpha*dx[i];
s=sqrt(dot(x,x,n)); for(i=0;i<=n;i++) x[i]/=s;
	} while(dot(dx,dx,n)>=eps);
return e;
}
