📄 unit2.pas
字号:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm2 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
E_p: TEdit;
Label2: TLabel;
E_q: TEdit;
Label3: TLabel;
E_n: TEdit;
L_n0: TLabel;
E_n0: TEdit;
Button1: TButton;
Label5: TLabel;
E_e: TEdit;
Button2: TButton;
Label6: TLabel;
E_d: TEdit;
B_zuf_PZ: TButton;
Button3: TButton;
L_nr1: TLabel;
L_nr2: TLabel;
CheckBox1: TCheckBox;
L_probe: TLabel;
procedure B_zuf_PZClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure E_pChange(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form2: TForm2;
implementation
uses jmhilf, jmmath, Unit1;
{$R *.DFM}
procedure TForm2.B_zuf_PZClick(Sender: TObject);
var
nr1, nr2: integer;
p1, p2: extended;
begin
e_p.text := 'Bitte';
e_q.text := 'warten';
application.ProcessMessages;
if checkbox1.Checked then
begin
nr1 := random(100);
nr2 := random(100);
end
else
begin
nr1 := random(6000); //Die verschl黶seltem Zahlen d黵fen h鯿hstens 9-stellig werden.
nr2 := random(6000); //Da beim quadrieren die Genauigkeit von 18 Stellen nicht 黚erschritten werden darf
end;
repeat
p1 := primzahl_(nr1);
p2 := primzahl_(nr2);
nr1 := nr1 + 10;
nr2 := nr2 + 10;
until p1 * p2 > BB; //sonst keine eindeutige Abbildung m鰃lich
e_p.text := ssd(primzahl_(nr1), 0); //Dauert bei 1 MHz_prozessor h鯿hstens ca. 12sec
e_q.text := ssd(primzahl_(nr2), 0);
L_nr1.caption := 'PZ Nr.:' + intToStr(nr1);
L_nr2.caption := 'PZ Nr.:' + intToStr(nr2);
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
close
end;
procedure TForm2.Button1Click(Sender: TObject);
var
p, q: extended;
begin
p := rr(e_p.text);
q := rr(e_q.text);
e_n.text := ssd(p * q, 20);
Form1.e_n.text := e_n.text;
e_n0.text := ssd((p - 1) * (q - 1), 20);
e_n0.Hide;
l_n0.hide;
e_e.text := ssd(int(sqrt(p * q)), 20);
form1.E_e.text := e_e.text;
end;
function invers_mod(e, m: extended): Extended; //ggT(e,m)=1 =>Es gibt x,y; xe+ym=1
// => xe = 1 mod m
var
m0, x0, x1, y0, y1, xx, yy, q, r: extended;
sign: integer;
begin //Der erweiterte Euklidische Algorithmus
m0 := m;
x0 := 1;
x1 := 0;
y0 := 0;
y1 := 1;
sign := 1;
while e <> 0 do
begin
q := int(m / e); //q:=m div e
r := m - e * q; //r:=m mod e
m := e;
e := r;
xx := x1;
yy := y1;
x1 := q * x1 + x0;
y1 := q * y1 + y0;
x0 := xx;
y0 := yy;
sign := -sign;
end;
y0 := -sign * y0;
if y0 < m then y0 := m0 + y0;
result := y0;
end;
procedure TForm2.Button2Click(Sender: TObject);
var
ed, e, d, n0, q, r: extended;
begin
e := rr(e_e.text);
n0 := rr(e_n0.text);
while (e > 1) and (ggTReal(n0, e) > 1) do
e := int(e - 0.9); //dto dec(e) f黵 reelles e
e_e.text := ssd(e, 0);
form1.E_e.text := e_e.text;
d := invers_mod(e, n0);
e_d.text := ssd(d, 0);
e_n0.Show;
l_n0.Show;
form1.E_d.text := e_d.text;
//Probe
ed := e * d;
q := int(ed / n0);
r := round(ed - q * n0); //=1
L_probe.Caption := 'e*d=' + ssd(ed, 0) + '=' + ssd(q, 0) + '*' + ssd(n0, 0) + '+' + ssd(r, 0) + '=1 mod ' + ssd(n0, 0);
end;
procedure TForm2.E_pChange(Sender: TObject);
begin
e_n.text := '';
e_n0.text := '';
e_e.text := '';
e_d.text := '';
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -