function [V,D]=jacobi(A,epsilon)
% Вход  : A - матрица размера nxn
%         epsilon - допустимое значение
% Выход : V - матрица собственных векторов размера n x n
%         D - диагональная матрица собственных значений размера n x n

% Инициализация V, D и параметров
D=A;
[n,n]=size(A);
V=eye(n);
state=1;
count=0;
% Вычисление строки p и столбца q наибольшего по абсолютной
%   величине элемента матрицы A, не лежащего на диагонали
[m1 p]=max(abs(D-diag(diag(D))));
[m2 q]=max(m1);
p=p(q);
while (state==1)
    % Обнуление Dpq и Dqp
    t=D(p,q)/(D(q,q)-D(p,p));
    c=1/sqrt(t^2+1);
    s=c*t;
    R=[c s; -s c];
    D([p,q],:)=R'*D([p q],:);
    D(:,[p q])=D(:,[p q])*R;
    V(:,[p q])=V(:,[p q])*R;
    [m1 p]=max(abs(D-diag(diag(D))));
    [m2 q]=max(m1);
    p=p(q);
    if (abs(D(p,q))<epsilon*sqrt(sum(diag(D).^2)/n))
        state=0;
    end
    count=count+1;
end
V=V';
%D=diag(diag(D));
D=diag(D);
%disp(count);