Продолжение листинга 18.1

begin
t[i]:= Ord(s[i]);
Inc(i);
end;
pos:= 0;
WriteLn('OK');
WriteLn;
end;

function MyRandom: Cardinal;
var i: Integer;
var l: Cardinal;
begin
if (pos = 0) then
begin
for i:= 1 to 255 do t[i]:= cbox[(t[i-1]+t[i]) and 255];
for i:= 254 downto 0 do t[i]:= cbox[(t[i]+t[i+1]) and 255];
end;
l:= 0;
for i:= 0 to 3 do l:= l shl 8 + Cardinal(t[pos+i]);
Result:= l;
pos:= (pos+4) and 255;
end;

//-------------------------------------------------------------
//Главная программа
var i,j: Integer;
var maxbit: Integer;
var none,ntwo: TBigNum;
var n1,n2: TBigNum;
var p,q,z: TBigNum;
var n,e,d: TBigNum;
var s1,s2: string;

begin
WriteLn;
InicMyRandom();
repeat
Write('Введите максимальный размер простых чисел (p и q) в
битах (8-257): ');
ReadLn(maxbit);

Продолжение листинга 18.1

until (maxbit>=8) and (maxbit<=257);
//p
WriteLn('Введите большое десятичное значение, которое будет
использовано в качестве первого простого числа (Enter
-> генерируется программой): ');
ReadLn(s1);
BN_dec_to_bignum(s1,p);
BN_bignum_to_dec(p,s2);
if (s1<>s2) then
begin
if (s1<>'') then WriteLn('Число задано неверно!');
s1:= '0'; BN_dec_to_bignum(s1,p);
for i:= 0 to BIGNUM_DWORD do n1[i]:= MyRandom();
BN_a_shr_k(n1,(BIGNUM_DWORD+1)*32-maxbit,p);
BN_bignum_to_dec(p,s2);
WriteLn('Сгенерированное число: ',s2);
end;
WriteLn('Поиск первого простого числа... Ждите...');
p[0]:= p[0] or 1;
s1:= '2'; BN_dec_to_bignum(s1,ntwo);
j:= 0;
while (BN_PrimeTest(p)=0) and (j<8192) do
begin
BN_a_add_b(p,ntwo,n1);
Move(n1,p,sizeof(n1));
Inc(j);
Write('.');
end;
WriteLn;
if (j>=8192) then
begin
WriteLn('К сожалению, простое число не найдено!');
WriteLn('Нажмите Enter для выхода.'); ReadLn;
Halt(1);
end;
BN_bignum_to_dec(p,s1);
WriteLn('Первое простое число p = ',s1);
//q
WriteLn('Введите большое десятичное значение, которое будет
использовано в качестве второго простого числа (Enter
-> генерируется программой): ');

Продолжение листинга 18.1

ReadLn(s1);
BN_dec_to_bignum(s1,q);
BN_bignum_to_dec(q,s2);
if (s1<>s2) then
begin
if (s1<>'') then WriteLn('Число задано неверно!');
s1:= '0'; BN_dec_to_bignum(s1,q);
for i:= 0 to BIGNUM_DWORD do n1[i]:= MyRandom();
BN_a_shr_k(n1,(BIGNUM_DWORD+1)*32-maxbit,q);
BN_bignum_to_dec(q,s2);
WriteLn('Сгенерированное число: ',s2);
end;
WriteLn('Поиск первого простого числа... Ждите...');
q[0]:= q[0] or 1;
s1:= '2'; BN_dec_to_bignum(s1,ntwo);
j:= 0;
while (BN_PrimeTest(q)=0) and (j<8192) do
begin
BN_a_add_b(q,ntwo,n1);
Move(n1,q,sizeof(n1));
Write('.');
end;
WriteLn;
if (j>=8192) then
begin
WriteLn('К сожалению, простое число не найдено!');
WriteLn('Нажмите Enter для выхода.'); ReadLn;
end;
BN_bignum_to_dec(q,s1);
WriteLn('Второе простое число q = ',s1);
WriteLn;
//n = p*q
BN_a_mul_b(p,q,n);
BN_a_div_b(n,q,n1);
if (BN_a_cmp_b(p,n1)<>0) then
begin
WriteLn('К сожалению, результат умножения p*q слишком велик!');
WriteLn('Нажмите Enter для выхода.'); ReadLn;
Halt(1);
end;
BN_bignum_to_dec(n,s1);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: