unit Unit2;
interface
uses Unit1, Nints;
Procedure ComModAtt2(N,E1,E2,C1,C2: IInteger);
implementation
Procedure ComModAtt2(N,E1,E2,C1,C2: IInteger);
var
M,D,U,V,A,B,C: IInteger;
Sgn: Integer;
begin
Form1.Memo5.Clear;
Form1.Memo5.Lines.Add('N= '+NStr(N,NStrFormatDez));
Form1.Memo5.Lines.Add('E1= '+NStr(E1,NStrFormatDez));
Form1.Memo5.Lines.Add('E2= '+NStr(E2,NStrFormatDez));
Form1.Memo5.Lines.Add('C1= '+NStr(C1,NStrFormatDez));
Form1.Memo5.Lines.Add('C2= '+NStr(C2,NStrFormatDez));
// ggT(E1,E2), E1*U+E2*V=1
NGCD(D,U,V,E1,E2);
Form1.Memo5.Lines.Add('');
Form1.Memo5.Lines.Add('NGCD(D,U,V,E1,E2);');
Form1.Memo5.Lines.Add('D= '+NStr(D,NStrFormatDez));
Form1.Memo5.Lines.Add('U= '+NStr(U,NStrFormatDez));
Form1.Memo5.Lines.Add('V= '+NStr(V,NStrFormatDez));
NMul(A,E1,U);
NMul(B,E2,V);
NAdd(C,A,B);
Form1.Memo5.Lines.Add('E1*U= '+NStr(A,NStrFormatDez));
Form1.Memo5.Lines.Add('E2*V= '+NStr(B,NStrFormatDez));
Form1.Memo5.Lines.Add('Sum= '+NStr(C,NStrFormatDez)); //muß 1 sein
Sgn:=NSgn(U);
if Sgn=-1 then NInvMod(C1,N) else NInvMod(C2,N);
Form1.Memo5.Lines.Add('');
Form1.Memo5.Lines.Add('NInvMod');
Form1.Memo5.Lines.Add('C1= '+NStr(C1,NStrFormatDez));
Form1.Memo5.Lines.Add('C2= '+NStr(C2,NStrFormatDez));
NAbs(U);
NAbs(V);
//NPow(A,C1,NInt32(U));
//NPow(B,C2,NInt32(V));
NPowMod(A,C1,U,N);
NPowMod(B,C2,V,N);
NMul(M,A,B);
NMod(M,N);
Form1.Memo5.Lines.Add('');
Form1.Memo5.Lines.Add('M(Dez)= '+NStr(M,NStrFormatDez));
Form1.Memo5.Lines.Add('M(Hex)= '+NStr(M,NStrFormatHex));
//Form1.Memo5.Lines.Add('M(Str)= '+NStr(M,256));
// Gegenprobe
//NMod(M, N);
NPowMod(C1, M, E1, N);
Form1.Memo5.Lines.Add('C1-Prüfung(Dez)= '+NStr(C1,NStrFormatDez));
end;
end.