%
%
%
function[R]=ekadd(P,Q)

global p;

% Eingabetest

if (size(P,2)~=2)
    if (P~=0)
        disp(' ');
        disp('Fehlerhafte Eingabe.');
        disp(' ');
        return;
    end
else
    t=ekpoint(P,p);
    if (t==0)
        disp(' ');
        disp('Eingabe ist kein Kurvenpunkt.');
        disp(' ');
        return;
    end
end

if (size(Q,2)~=2)
    if (Q~=0)
        disp(' ');
        disp('Fehlerhafte Eingabe.');
        disp(' ');
        return;
    end
else
    t=ekpoint(Q,p);
    if (t==0)
        disp(' ');
        disp('Eingabe ist kein Kurvenpunkt.');
        disp(' ');
        return;
    end
end

% Neutrales Element als Eingabe

if (size(P,2)==1)
    if (size(Q,2)==1)
        R=0;
        disp(' ');
        disp(['0+0=0']);
        disp(' ');
    else
        R=Q;
        disp(' ');
        disp(['0+(' num2str(Q(1)) ',' num2str(Q(2)) ')=(' num2str(Q(1)) ',' num2str(Q(2)) ')']);
        disp(' ');
    end
    return;
else
    if (size(Q,2)==1)
        'hallo?'
        R=P;
        disp(' ');
        disp(['(' num2str(P(1)) ',' num2str(P(2)) ')+0=(' num2str(P(1)) ',' num2str(P(2)) ')']);
        disp(' ');
        return;
    end
end

P=mod(P,p);
Q=mod(Q,p);

% Neutrales Element als Ergebnis

x1=P(1);
x2=Q(1);
y1=P(2);
y2=Q(2);

if (and(x1==x2,mod(y1+y2,p)==0)==1)
    R=0;
    disp(' ');
    disp(['(' num2str(P(1)) ',' num2str(P(2)) ')+(' num2str(Q(1)) ',' num2str(Q(2)) ')=0' ]);
    disp(' ');
    return;
end

% Sonstige Fälle

if (x1~=x2)
    D=modinv(x2-x1,p);
    L=(y2-y1)*D;
    M=(y1*x2-y2*x1)*D;
else
    D=modinv(2*y1,p);
    L=(3*x1*x1-1)*D;
    M=(-x1*x1*x1-1*x1)*D;
end

L=mod(L,p);
M=mod(M,p);

x3=L*L-x1-x2;
y3=-L*x3-M;

x3=mod(x3,p);
y3=mod(y3,p);
R=[x3 y3];

disp(' ');
disp(['(' num2str(P(1)) ',' num2str(P(2)) ')+(' num2str(Q(1)) ',' num2str(Q(2)) ')=(' num2str(R(1)) ',' num2str(R(2)) ')' ]);
disp(' ');

return;