Файл: Основные структуры алгоритмов: сравнительный анализ и примеры их использования (Ρ-алгоритм Полларда).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 01.04.2023

Просмотров: 625

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Среди алгоритмов факторинга с экспоненциальной сложностью метод квадратичных форм Шенкса считается одним из наиболее эффективных. Этот алгоритм работает с целыми числами, не превышающими 2√n. Мы знаем, что для 32-битных компьютеров алгоритмы, основанные на этом методе, являются бесспорными лидерами алгоритмов факторизации для чисел между ранее и, вероятно, так и останутся. Этот алгоритм может разделить почти любое составное 18-значное число менее чем за миллисекунду. Алгоритм чрезвычайно прост, красив и эффективен. Кроме того, методы, основанные на этом алгоритме, используются в качестве вспомогательных при разложении делителей больших чисел.

Заключение

Факторизация натурального числа называется его разложением в произведение простых факторов. Эта задача имеет большую вычислительную сложность. Один из самых популярных методов криптографии с открытым ключом, метод RSA, основан на сложности задачи факторизации длинных целых чисел.

Вопрос о факторинге количеств возник не накануне, а тысячи лет назад. Можно только предположить, по какой причине в 1900 г. на Точном конгрессе Д. Гильберт вообще не внес его в свой список из 23 вопросов, а позже возлюбленная не оказалась в списке незавершенных точных вопросов С. Улама. Особый интерес и интерес математиков к этому вопросу стали проявляться только в последние десятилетия. Вероятно, катализатор для изобретения новейшего тренда - криптология с 2 ключами, появление шифров с не закрытым исходным кодом.

Можно предположить, что реальный интерес к проблеме факторизации величин продиктован определенной неопределенностью относительно абстрактного объяснения идентификации очень известного сегодня двухключевого кода (секретного источника) RSA, который, в убеждении, может быть взломан без понимания секретного ключа.

Самый простой и более сложный экспоненциальный метод, реализованный ручным методом. муравей. автоматический, считается выбор делителей. Кто-то ищет возможные делители количества от наибольшего количества до его квадрата. Кто-то абсолютно подходит для дезинтеграции в небольших количествах, поскольку его очень просто реализовать, но кто-то почти не работает с целью дезинтеграции в больших количествах.

Практическое использование различных методов для распада величин показало, что срок выполнения метода напрямую зависит от его типа и сложности расчетов.

В этой работе я проанализировал некоторые методы факторинга натуральных величин, а также провел их относительное представление в соответствии со строительными группами. Используя реальные образцы, я убедился в производительности и необходимости использовать 1 метод, который отличается, опять же, принимая во внимание текстуру заданного количества.


Аналогичным образом можно сделать следующие выводы: для факторизации натуральных величин существует достаточно большое количество методов, но эта цель далека от очевидного и довольно трудоемкого периода, демонстрирует анализ сложность факторинга алгоритмов. Некоторые методы имеют все шансы найти решение этой проблемы на протяжении веков. Чтобы сократить период надежды, следует выбрать метод факторинга, подходящий для текстуры величин.

Но решение этой задачи вообще не требуется в этой области, поскольку многочисленные крупные раскрытия и последние достижения в этой области появляются снова и снова. Эти достижения сочетаются не только с формированием расчетной силы.

Список литературы

  1. A. Heck. Introduction to Maple. Springer-Verlag, third edition, 2003.
  2. Бухштаб А.А. Теория чисел. — М.: Учпедгиз, 1960.
  3. Василенко О. Н. В19 Теоретико-числовые алгоритмы в криптографии. - М.:МЦНМО, 2003.—328 с. ISBN 5-94057-103-4.
  4. Ишмухаметов Ш.Т. Методы факторизации натуральных чисел: учебное пособие. Казань: Казан. Ун-т, 2011. 190 с.
  5. Д. Кнут Раздел 4.5.4. Разложение на простые множители // Искусство программирования = The Art of Computer Programming. — 3-е изд. — М.: Вильямс, 2007. — Т. 2. Получисленные алгоритмы. — С. 425—468. — 832 с.
  6. Макаренко А.В., Пыхтеев А.В., Ефимов С.С. Параллельная реализация и сравнительный анализ алгоритмов факторизации в системах с распределённой памятью.
  7. Манин Ю.И., Панчишкин А.А. Введение в современную теорию чисел. − М.: МЦНМО, 2009.
  8. Ю. И. Манин, А. А. Панчишкин. I.2.3. Разложение больших чисел на множители // Введение в теорию чисел.— М.: ВИНИТИ, 1990. — Т. 49. — С. 72—106. — 341 с.
  9. Молчанова Л.А. Введение в Maple. Учебно-методическое пособие. – Владивосток: Изд-во Дальневост. Ун-та, 2006. - 36 С.
  10. Ю. В. Нестеренко. Глава 4.7. Как раскладывают составные числа на множители // Введение в криптографию / Под ред. В. В. Ященко. — Питер, 2001. — 288 с.
  11. http://www.maplesoft.com – официальный сайт компании Maplesoft, производителя Maple.
  12. http://www.exponenta.ru – образовательный математический сайт.
  13. http://www.wikipedia.org/ - свободная энциклопедия.

Приложение1

> restart;

> p:=nextprime(476523189475631579423453); (23 знака)

q:=prevprime(957532186478621546879541); (23 знака)

p:= 476523189475631579423459

q:= 9575321864786215468879519

> n:=p*q;(48 знаков)

n:= 45628629152636796604667662309058697463550555236221

> time(ifactor(n));

632.795

> time(ifactor(n,squifof));

0.

> time(ifactor(n,pollard)); (остановлено на 308 тысяче секунд ожидания)

Warning, computation interrupted

> time(ifactor(n,lenstra));


20311.652

> restart;

> p: =nextprime(476523189475631579); (17 знаков)

q: =prevprime(957532186478621546879548756); (26 знака)

p: = 476523189475631647

q: =957532186478621546879548619

> n:=p*q;(45 знаков)

> time(ifactor(n));

294.891

> time(ifactor(n,squifof));

.016

> time(ifactor(n,lenstra));

3271.926

>

>

> restart;

> p: =nextprime(4765231894756315791);(19 знаков)

q: =prevprime(9575321869491284011);(19 знаков)

t:=nextprime(1112154682);(10 знаков)

> n:=p*q*t;(52 знака)

> time(ifactor(n));

> time(ifactor(n,squifof));

> time(ifactor(n,lenstra));

> restart;

k:=nextprime(320);t:=190;

> n:=k*(2^t)+1;(60 знаков)

> time(ifactor(n));

> k:=nextprime(320);t:=160;

n:=k*(2^t)+1; (52 знака)

> time(ifactor(n));

> k:=nextprime(320);t:=150;

n:=k*(2^t)+1;(48 знаков)

> time(ifactor(n));

> k:=nextprime(320);t:=9290;

n:=k*(2^t)+1;

Приложение2

Листинг программы

program kurs;

uses crt;

function pow (a,x: longint): longint;

var

t, i: longint;

begin

t: =a;

for i: =1 to x-1 do

t: =t*a;

pow: =t;

end; {pow}

{----------------------------------------}

procedure DelOstatok;

var

dd: array [1.200] of integer;

R: integer; {размерность чисел}

i: longint; {делитель}

k: longint; {остаток}

D,a,b: longint; {элементы заданного множества}

SUM: longint; {кол-во эл-ов, удовл условию}

S,T: byte;

q: char;

e,j,l,n: integer;

maxa,minj,maxj: longint;

begin

repeat

begin

writeln ('введите ко-во чисел для нахождения НОК делителей');

readln (n);

writeln ('введите ',n,' чисел: ');

readln (dd [1]);

maxa: =dd [1] ;

for i: =2 to n do

begin

readln (dd [i]);

if dd [i] >maxa then maxa: =dd [i] ;

end;

i: =1; while (dd [i] <>0) and (i<=n) do inc (i);

if i<>n+1 then writeln ('НОК не сущ-ет')

else begin

e: =1;

for i: =2 to maxa do

begin

maxj: =0;

for l: =1 to n do

begin

j: =0;

while (dd [l] mod i=0) do

begin

dd [l]: =dd [l] div i;

inc (j);

end;

if (j>maxj) then maxj: =j;

end;

if (maxj<>0) then for l: =1 to maxj do e: =e*i;

end;

writeln ('НОК делителей=',e);

end;

end;

i: =e;

write ('введите остаток=');

readln (k);

if ( (i<=0) or (k<0)) then {проверка

{вывод эл-ов на экран}

end; writeln;

end;

writeln ('Повторить? (Y/N) ');

q: =ReadKey;

until q in ['N','n'] ;

clrscr;

end; {DelOstatok}

{----------------------------------------}

procedure Factor;

var

numb, powers: array [1. .100] of longint;

c: longint;

n: longint;

n1,H: longint;

i: longint;

k,t: longint;

q: char;

begin

repeat

write ('Введите число=');

readln (c);

if c<=0 then {проверка на корр числа}

begin

writeln ('число должно быть>0');

readln;

exit;

end

else

{вывод мн-ва делителей}

begin

write ('мн-во делителей: D (num) =');

for H: = 1 to c do

if c mod H=0 then

write (H,' ');

end;

{конец вывода делителей}

n: = 1;

n1: = 0;

while c <> 1 do

begin

i: = 2;

while c mod i <> 0 do {проверка на делимостьс/без остатка}

Inc (i);

Inc (n1);

if n1 = 1 then

begin

numb [n]: = i;

powers [n]: = 1;

end

else

if numb [n] = i then Inc (powers [n])

else

begin

Inc (n); {увеличение кол-ва простых множителей}

numb [n]: = i;

powers [n]: = 1;

end; {while}

c: = c div i; {деление числа на простой множитель}

end; {while}

{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}

writeln;

writeln ('кол-во простых множителей: ',n);

write ('num = ');

k: =1;

t: =1;

writeln ('НОД=',k);

if k=1 then writeln ('числа взаимно простые');

end;

begin

i: =1; while (b [i] <>0) and (i<=n) do inc (i);

if i<>n+1 then writeln ('НОК не сущ-ет')

else begin

d: =1;

for i: =2 to maxa do

begin

maxj: =0;

for l: =1 to n do

begin

j: =0;

while (b [l] mod i=0) do

begin

b [l]: =b [l] div i;

inc (j);

end;

if (j>maxj) then maxj: =j;

end;

if (maxj<>0) then for l: =1 to maxj do d: =d*i;

end;

writeln ('НОК=',d);

end;

end;

end;

writeln ('Повторить? (Y/N) ');

q: =ReadKey;

until q in ['N','n'] ;

clrscr;

end; {NodNok}

{----------------------------------------}

procedure SuperGorner;

type

vector= array [1. .11] of integer;

rvector=array [1. .100] of real;

var

sum,suma: real;

i,k,j,b,c,a,n: integer;

vec: vector;

vecb: rvector;

veca: rvector;

q: char;

BEGIN

Writeln ('Введите степень уравнения (max = 10) ');

Readln (n);

if n<=0 then writeln (‘степень не может быть<=0’)

else begin

Inc (n);

writeln ('введите его коэффициенты: ');

for i: = 1 to n do

read (vec [i]);

while vec [i] =0 do

Begin

i: =i-1;

writeln ('ответ: 0');

End;

k: =1;

b: =vec [i] ;

for j: =1 to abs (b) do

begin

if (b mod j) =0 then

begin

vecb [k]: =j;

k: =k+1;

procedure AntiExp;

var s: array [1. .100] of integer;

a,b, i,n,t: integer;

q: char;

begin

repeat

writeln ('введите кол-во эл-ов цепной дроби=');

read (n);

if n<=0 then writeln (‘кол-во эл-ов не может быть<=0’)

else begin

writeln ('введите значения этих эл-ов=');

for i: =1 to n do

read (s [i]);

a: =1; b: =s [n] ;

for i: = n downto 2 do

begin

t: =s [i-1] *b+a;

a: =b;

b: =t;

end;

writeln;

writeln (b,'/',a);

end;

writeln ('Повторить? (Y/N) ');

q: =ReadKey;

until q in ['N','n'] ;

clrscr;

end; {AntiExp}

{----------------------------------------}

var

k: integer;

q: char;

begin

writeln ('Дискретная математика');

writeln ('Курсовая работа, группа 03-119, каф308');

writeln ('выполнил: Тузов И.И. ');

writeln ('руководитель: Гридин А.Н. ');

writeln;

writeln ('Калькулятор с функциями, описанными ниже');

writeln;

Writeln ('Нажмите Enter');

readln;

clrscr;

repeat

writeln ('Какую выполнить операцию? ');

writeln;

writeln ('1-вычисление мн-ва N-значных чисел с заданным делителем и остатком ');

writeln ('2-факторизация числа');

writeln ('3-нахождение НОД и НОК чисел');

writeln ('4-нахождение рационльных корней уравнения с целочисл коэфф');

writeln ('5-перевод рациональной дроби в цепную');

writeln ('6-перевод цепной дроби в рациональную');

read (k);

делителя и остатка на отриц-сть}

begin

write ('делитель или остаток не могут быть<0 ');

end

else

begin

if i>k then {проверка на делитель>остатка}

begin

write ('введите размерность=');

readln (R);

if R<=0 then

begin

writeln ('некорректная размерность ');

readln;

end

else begin

if R=1 then

begin a: =1; b: =9; end

else begin

a: =pow (10, (R-1)); {инициализация верх и нижн границ}

b: =pow (10,R);

b: =b-1;

end;

end;

if b<i then {проверка на делимое>делителя}

writeln ('делиоме не может быть < делителя ')

else

begin

SUM: =0; {обнуление сумы кол-ва эл-ов}

for D: = a to b do

begin

if (D mod i) =k then {проверка эл-ов на условие}

begin

SUM: =SUM+1;

end;

end;

writeln;

writeln ('кол-во эл-ов с делителем=', i: 3, ' и остатком=', k: 3, ' равно', SUM: 6);

end; {b<i}

end {if i>k}

else

write ('остаток не может быть > делителя ');

end; {if otriz}

{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}

write ('вывести значения на экран? (1-да\0-нет) ');

readln (S);

if S=1 then

if SUM=0 then

writeln ('нет эл-ов, удовл. условию')

else

begin

for D: = a to b do

if (D mod i) =k then

begin

write (' ',D: 4);

{вычисление кол-ва делителей и их мн-ва}

for i: = 1 to n do

begin

write (numb [i], ' ^ ', powers [i]);

k: =k* ( (pow (numb [i],powers [i] +1) - 1) div (numb [i] - 1));

t: =t* (powers [i] +1); {кол-во делителей}

if i <> n then write (' * ');

end;

writeln;

writeln ('кол-во множителей: tau (num) =',t);

writeln ('сумма множителей: sigma (num) =',k);

writeln ('Повторить? (Y/N) ');

q: =ReadKey;

until q in ['N','n'] ;

clrscr;

end; {Factor}

{----------------------------------------}

procedure NodNok;

type TArray=array [1.200] of integer;

var a,b: TArray;

i,l,j,maxa,minj,maxj: longint;

k,d: longint;

n: integer;

q: char;

begin

repeat

clrscr;

writeln ('введите ко-во чисел для нахождения НОД и НОК');

readln (n);

writeln ('введите ',n,' чисел: ');

if n<=0 then writeln (‘кол-во чисел не может быть<=0’)

else begin

readln (a [1]);

b [1]: =a [1] ;

maxa: =a [1] ;

for i: =2 to n do

begin

readln (a [i]);

b [i]: =a [i] ;

if a [i] >maxa then maxa: =a [i] ;

end;

i: =1;

while (a [i] =0) and (i<=n) do inc (i);

if i=n+1 then writeln ('НОД - любое число')

else begin

for j: =1 to n do if a [j] =0 then a [j]: =a [i] ;

k: =1;

for i: =2 to maxa do

begin

minj: =1000;

for l: =1 to n do

begin

j: =0;

while (a [l] mod i=0) do

begin

a [l]: =a [l] div i;

inc (j);

end;

if (j<minj) then minj: =j;

end;

if (minj<>0) then for l: =1 to minj do k: =k*i;

end;

vecb [k]: =-j;

k: =k+1;

end;

end;

a: =1;

for j: =1 to abs (vec [1]) do

begin

if (vec [1] mod j) =0 then

begin

veca [a]: =j;

a: =a+1;

{ veca [a]: =-j;

a: =a+1; }

End;

end;

b: =a;

for j: =1 to k-1 do

Begin

for a: =1 to b-1 do

Begin

Begin

c: =i;

sum: =0;

for i: =1 to c do

Begin

sum: =sum+vec [i] *pow1 (vecb [j] /veca [a],c-i);

if (sum<0.00001) and (sum>-0.00001) then

if vec [a] =1 then writeln ('ответ: ',round (vecb [j]))

else writeln ('ответ: ',round (vecb [j]), '/',round (veca [a]));

end;

End;

End;

End; end;

readln;

end; {SuperGorner}

{----------------------------------------}

procedure Express;

var

a,b,t: integer;

q: char;

begin

repeat

writeln ('введите числитель=');

readln (a);

writeln ('введите знаменатель=');

readln (b);

if b=0 then writeln (‘знаменатель не может быть=0’)

else begin

write (' [');

while (a mod b>0) do

begin

write (a div b,',');

a: =a mod b;

t: =b;

b: =a;

a: =t;

end;

write (a div b, '] ');

end;

writeln (‘Повторить? (Y/N) ');

q: =ReadKey;

until q in ['N','n'] ;

clrscr;

end; {Express}

{----------------------------------------}

case k of

1: DelOstatok;

2: Factor;

3: NodNok;

4: SuperGorner;

5: Express;

6: AntiExp;

else

writeln ('нет операции');

end; {case}

writeln ('Повторить выполнение калькулятора? (Y/N) ');

q: =ReadKey;

until q in ['N','n'] ;

clrscr;

readln;

end. {prog}