2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Факторизация рекуррентным методом
Сообщение17.06.2019, 00:34 


29/07/08
536
Проблема факторизации составного числа на простые множители до сих пор остается сложной и до конца не решенной.
Предлагаемый способ факторизации на связан с перебором простых чисел.

Обозначения.
$n=[\sqrt{N}]$, где []- целая часть числа N.
$R=(n+1)^2-N$
$R'=N-n^2$, причем $R+R'=2n+1$.

Пусть задано составное число $ N=pq$, где $1<p<q$. Число $N$ равно произведению ТОЛЬКО двух простых чисел $p$ и $q$.
Но число $N$ можно представить и так:
$N=(n-a)(n+a+2b)$

Если известно число $a$, то число $b$ однозначно определяется по формуле $b=\frac{R'+a^2}{2(n-a)}$
Если известно число $b$, то однозначно определяется число $a$ по формуле
$a=\sqrt{(n+b)^2-N}-b$

В качестве $ a_1=[\sqrt{(n+1)^2-N}]=[\sqrt{R}],  
b_1=[\frac{R'+a_1^2}{2(n-a_1)}]+1$.

Если $p-a_1$ не является делителем числа $N$, то запускаем цикл:
$a_i=[\sqrt{(n+b_{i-1})^2-N}-b_{i-1}]+1,   b_i=[\frac{R'+a_i^2}{2(n-a_i)}]+1$.

Пример.
$407=11\cdot37=(20-9)(20+9+2\cdot4)$

$n=20$, $R'=407-20^2=7$, $R=(20+1)^2-407=34$

$a_1=[\sqrt{(20+1)^2-407}]=5$, $407$ не делится на $(20-5)$
$b_1=\frac{7+a_1^2}{2(n-a_1)}=\frac{7+5^2}{2(20-5)}\approx1.9$. Это не натуральное, значит $b_1=2$

$a_2=\sqrt{(20+b_1)^2-407}-b_1=\sqrt{(20+2)^2-407}-2\approx6,8$. Это не натуральное, значит $a_2=7$

Цикл повторяется, пока не получатся натуральные $a$ и $b$.
$b_2=\frac{7+7^2}{2(20-7)}\approx3.2$, следовательно $b_2=4$

$a_3=\sqrt{(20+4)^2-407}-4=9$ натуральное.
$b_3=\frac{7+9^2}{2(20-9)}=4$ натуральное.

$N=407=(20-9)(20+9+2\cdot4)=11\cdot37$

Этот метод удобный тем, что не надо проверять на простоту числа.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение17.06.2019, 02:37 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
А чем этот метод лучше хорошо известного метода Ферма? И не есть ли это просто метод Ферма, только немного замаскированный?

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение19.06.2019, 18:38 


29/07/08
536
Это и есть метод Ферма, но оптимизированный. Не нужно перебирать подряд все значения. Проскакивая заведомо неприемлемые значения, останавливаемся и проверяем выполнение условий на определяющих числах.
Кстати, поскольку числа $a$ и $b$ должны одновременно оказаться натуральными, процесс факторизации можно свести к рекуррентной формуле вида $a_{i+1}=f(a_i)$, где функция $f(x)$ достаточно объемная в записи.

На счет эффективности у меня нет предположений, но мне кажется все же лучше простого метода Ферма.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение20.06.2019, 01:34 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
Побережный Александр в сообщении #1400171 писал(а):
На счет эффективности у меня нет предположений, но мне кажется все же лучше простого метода Ферма.
Похоже, что лучше. Вы бы поэкспериментировали с числами. Не с трёхзначными, конечно, а так примерно десятизначными и больше. И посмотрите вот это: https://eprint.iacr.org/2009/318.pdf.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение24.06.2019, 01:58 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
Побережный Александр
Прокрутите, пожалуйста, ваш алгоритм для числа $4\,299\,802\,453=65\,447\times 65\,699$. У меня не получилось. То ли в алгоритме ошибка, то ли я что-то не понял. Может быть, начальное значение не совсем правильно выбирается. Может быть, что-нибудь другое.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение24.06.2019, 02:34 


29/07/08
536
Побережный Александр в сообщении #1399635 писал(а):
Обозначения.
$n=[\sqrt{N}]$, где []- целая часть числа N.
$R=(n+1)^2-N$
$R'=N-n^2$, причем $R+R'=2n+1$.

Величина $R$ не должна быть полным квадратом. Иначе число $N$ можно сразу расписать как разность квадратов.
Я посчитал этот случай тривиальным. Но это надо было указать в условиях. Приношу свои извинения.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение25.06.2019, 01:21 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
Побережный Александр
Чуть-чуть поэкспериментировал с вашим алгоритмом.
Пусть $N=9\,999\,128\,429\times 10\,000\,425\,181=99\,995\,535\,729\,424\,570\,649$.
Тогда $n=\bigl[\sqrt{N}\,\bigr]=9\,999\,776\,783$, $p=n-a=9\,999\,128\,429$, $q=n+a+2b=10\,000\,425\,181$, откуда $a=648\,354$ и $b=22$.
По вашим формулам определяем $R=(n+1)^2-N=400\,812\,007$, $R'=N-n^2=19\,598\,741\,560$, $a_1=\bigl[\sqrt{R}\,\bigr]=20\,020$, $b_1=\left[\frac{R'+a_1^2}{2(n-a_1)}\right]+1=2$.
Дальнейшие вычисления протекают так:
\begin{tabular}{r|r|r}
$i$&$a_i$&$b_i$\\
\hline\hline
$1$&$20\,020$&$2$\\
$2$&$142\,828$&$3$\\
$3$&$200\,995$&$4$\\
$4$&$245\,760$&$5$\\
$5$&$283\,543$&$6$\\
$6$&$316\,852$&$7$\\
$7$&$346\,978$&$8$\\
$8$&$374\,689$&$9$\\
$9$&$400\,488$&$10$\\
$10$&$424\,722$&$11$\\
$11$&$447\,646$&$12$\\
$12$&$469\,452$&$13$\\
$13$&$490\,289$&$14$\\
$14$&$510\,276$&$15$\\
$15$&$529\,508$&$16$\\
$16$&$548\,067$&$17$\\
$17$&$566\,017$&$18$\\
$18$&$583\,415$&$19$\\
$19$&$600\,309$&$20$\\
$20$&$616\,740$&$21$\\
$21$&$632\,745$&$22$\\
$22$&$648\,355$&$23$\\
$23$&$663\,597$&$24$
\end{tabular}
Как видите, правильные значения $a$ и $b$ "перепрыгиваются" на $22$-м шаге.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение25.06.2019, 07:47 


29/07/08
536
У вас на 22 шаге ошибка. $a_{22}=648354$.
Я пересчитал с 21 шага и у меня все красиво получилось.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение25.06.2019, 11:19 


16/08/05
1146
У меня также на 22 шаге перепрыгивает. Но даже если добавить на выход из цикла соответствующую поправку, то для чуть большего N=99995535729424570673*77696531261762891394341 уже дождаться результата не возможно, а pari/gp его раскладывает за пол-секунды.

(код)

Код:
alp()=
{
N= 99995535729424570673*77696531261762891394341;
\\ N= 9999128429*10000425181;
n= sqrtint(N);
R= (n+1)^2-N; Rs= N-n^2;
a= sqrtint(R); b= floor((Rs+a^2)/(n-a)/2)+1;
while(1,
  a= floor(sqrt((n+b)^2-N)-b)+1; p= n-a;
  b= floor((Rs+a^2)/p/2)+1;
  \\print(a"    "b);
  if(gcd(p,N)>1, print(p"    "N/p); break());
  if(gcd(p+1,N)>1, print(p+1"    "N/(p+1)); break());
  if(gcd(p-1,N)>1, print(p-1"    "N/(p-1)); break());
);
print(b)
};

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение25.06.2019, 11:55 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
Побережный Александр в сообщении #1401361 писал(а):
У вас на 22 шаге ошибка. $a_{22}=648354$.
Я пересчитал с 21 шага и у меня все красиво получилось.
Я, конечно, догадываюсь, что Вы считали "руками", вычислили корень, обрадовались, что он целый, да ещё имеет правильное значение, на радостях единицу прибавлять не стали, и получили, что хотели. Но в алгоритме у Вас написано, что прибавлять единицу надо. Поэтому "руками" Вы правильный результат получаете, а компьютер — нет. Я же Вам советовал поэкспериментировать с бо́льшими числами. У Вас что, никакой системы компьютерной математики нет? Excel не в счёт.
При этом с меньшими числами у меня всё хорошо было, и с этим тоже надо разобраться. Сейчас мне некогда, может быть, вечером выберу несколько часов.

Замечание. Вы используете функцию "целая часть", которая есть "округление вниз до ближайшего целого", а Вам, судя по всему, нужно "округление вверх до ближайшего целого", которое обозначается $\lceil x\rceil$.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение25.06.2019, 12:15 
Заслуженный участник


20/08/14
11195
Россия, Москва
Побережный Александр в сообщении #1401361 писал(а):
У вас на 22 шаге ошибка. $a_{22}=648354$.
Я пересчитал с 21 шага и у меня все красиво получилось.
Нет, ошибка у Вас в алгоритме/формулах: надо не брать целую часть от выражений и добавлять к ней единицу, а округлять вверх, вот тогда и получится $648354$ вместо $648355$.
Как это повлияет на $b_i$ не берусь судить, но думаю там возможна та же проблема.

dmd в сообщении #1401404 писал(а):
то для чуть большего N=99995535729424570673*77696531261762891394341 уже дождаться результата не возможно,
Потому что числа сильно отличаются от $\sqrt{N}$. Вообще когда $p \ll q$, то работать будет очень долго. Например даже для N=101*907 надо более 120 итераций.
Очень уж подозрительно выглядит почти линейное возрастание $b_i$, напрашивается какой-то метод более быстрого изменения $b_i$, с вычислением по ним $a_i$, нахождения максимального значения $a_i$ и потом его уточнение делением пополам (по $b_i$).

PS. Вместо gcd(p,N)>1 логичнее использовать N%p==0, думаю так быстрее.

-- 25.06.2019, 12:39 --

Dmitriy40 в сообщении #1401415 писал(а):
напрашивается какой-то метод более быстрого изменения $b_i$, с вычислением по ним $a_i$, нахождения максимального значения $a_i$ и потом его уточнение делением пополам (по $b_i$).
Собственно максимально возможное значение $a_i$ известно: $a_{max}=n-2$, соответственно $b_{max}=(R'+a_{max}^2)/4$. Вот в этих пределах и искать правильное значение $b_i$ и соответственно $a_i$.

-- 25.06.2019, 14:32 --

Судя по всему, при относительно близких $p$ и $q$ (даже при 20% различии), $b_i$ будет последовательными числами и метод ничем не лучше метода Ферма. При большом отличии сомножителей будет некоторое ускорение за счёт пропуска некоторых $b_i$, раза в 2-3-4, что при наличии других улучшений метода Ферма (см. хоть рувики) большого интереса не вызывает.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение29.06.2019, 17:07 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
Задано натуральное число $N$, которое при делении на $4$ даёт остаток, отличный от $2$. Два следующих алгоритма находят натуральные числа $p$ и $q$, удовлетворяющие условиям $p\leq q$ и $N=pq$, с наименьшей возможной разностью $q-p$.
Количество шагов в методе Фурье равно $\frac{p+q}2-\bigl\lfloor\sqrt{N}\bigr\rfloor$. Модифицированный алгоритм может выполнять меньшее число шагов, но не обязательно будет быстрее, так как каждый шаг сложнее и требует больше времени.
Переменная $k$ является счётчиком шагов (фактическое число шагов равно $k+1$). Эта переменная полезна для досрочного окончания работы программы.

Обычно рекомендуется прогонять алгоритм не только для числа $N$, но и для ряда чисел вида $KN$, где значения $K$ выбираются так, чтобы остаток от деления $KN$ на $4$ отличался от $2$. Если удастся подобрать такое $K$, чтобы $KN$ было произведением двух достаточно близких множителей, то метод Фурье может найти их существенно быстрее.

Алгоритм метода Фурье.
1) Начальные значения: $k\leftarrow 0$, $s\leftarrow\bigl\lceil\sqrt{N}\,\bigr\rceil$.
2) Вычислить $x\leftarrow s+k$, $y=\sqrt{x^2-N}$, $k\leftarrow k+1$. Если число $y$ не целое, повторить пункт 2).
3) Вычислить $p\leftarrow x-y$, $q\leftarrow x+y$. Закончить работу.

Алгоритм модифицированного метода Фурье, который предлагает Побережный Александр.
1) Присвоить $n\leftarrow\bigl\lfloor\sqrt{N}\bigr\rfloor$ и $k\leftarrow 0$. Если $n^2=N$, то присвоить $p\leftarrow q\leftarrow n$ и закончить работу.
2) Вычислить $R\leftarrow(n+1)^2-N$ и $R'\leftarrow N-n^2$.
3) Начальное значение: $a\leftarrow\bigl\lfloor\sqrt{R}\bigr\rfloor$; если $a^2=R$, то присвоить $a\leftarrow a-1$.
4) Начальное значение: $b\leftarrow\left\lceil\frac{R'+a^2}{2(n-a)}\right\rceil$.
5) Если число $\frac N{n-a}$ целое, перейти в пункт 7).
6) Вычислить $a\leftarrow\bigl\lceil\sqrt{(n+b)^2-N}-b\bigl\rceil$, $b\leftarrow\left\lceil\frac{R'+a^2}{2(n-a)}\right\rceil$, $k\leftarrow k+1$ и перейти в пункт 5).
7) Вычислить $p\leftarrow n-a$, $q\leftarrow n+a+2b$. Закончить работу.

Примеры. Windows 7. Wolfram Mathematica 9.0. Четырёхъядерный процессор Intel(R) Xeon(R) X3320 2.50GHz. Время работы — в секундах.
{\begin{tabular}{|r|r|r|r|r|r|r|r|}
\hline
\multicolumn{8}{|c|}{Метод Ферма}\\
\hline
\multicolumn{1}{|c|}{\textnumero}&\multicolumn{1}{|c|}{$N$}&\multicolumn{1}{c|}{Шаги}&\multicolumn{1}{c|}{Время (с)}&\multicolumn{1}{c|}{$x$}&\multicolumn{1}{c|}{$y$}&\multicolumn{1}{c|}{$p$}&\multicolumn{1}{c|}{$q$}\\
\hline
$1.$&$4\,294\,967\,317$&$605\,275$&$51{,}417\,930$&$670\,811$&$667\,602$&$3\,209$&$1\,338\,413$\\
$2.$&$4\,294\,967\,321$&$2\,864\,549$&$373{,}544\,395$&$2\,930\,085$&$2\,929\,352$&$733$&$5\,859\,437$\\
$3.$&$100\,895\,598\,169$&$187\,723$&$10{,}795\,269$&$505\,363$&$393\,060$&$112\,303$&$898\,423$\\
$4.$&$3\times 100\,895\,598\,169$&$67\,497$&$4{,}383\,628$&$617\,666$&$280\,757$&$336\,909$&$898\,423$\\
$5.$&$4\times 100\,895\,598\,169$&$375\,445$&$29{,}718\,190$&$1\,010\,726$&$786\,120$&$224\,606$&$1\,796\,846$\\
$6.$&$5\times 100\,895\,598\,169$&$19\,703$&$1{,}092\,007$&$729\,969$&$168\,454$&$561\,515$&$898\,423$\\
$7.$&$7\times 100\,895\,598\,169$&$1\,874$&$0{,}046\,800$&$842\,272$&$56\,151$&$786\,121$&$898\,423$\\
$8.$&$8\times 100\,895\,598\,169$&$224\,606$&$23{,}587\,351$&$1\,123\,029$&$673\,817$&$449\,212$&$1\,796\,846$\\
\hline\hline
\multicolumn{8}{|c|}{Метод Побережного}\\
\hline
\multicolumn{1}{|c|}{\textnumero}&\multicolumn{1}{|c|}{$N$}&\multicolumn{1}{c|}{Шаги}&\multicolumn{1}{c|}{Время (с)}&\multicolumn{1}{c|}{$a$}&\multicolumn{1}{c|}{$b$}&\multicolumn{1}{c|}{$p$}&\multicolumn{1}{c|}{$q$}\\
\hline
$1.$&$4\,294\,967\,317$&$44\,766$&$5{,}241\,634$&$62\,327$&$605\,275$&$3\,209$&$1\,338\,413$\\
$2.$&$4\,294\,967\,321$&$47\,242$&$5{,}772\,037$&$64\,803$&$2\,864\,549$&$733$&$5\,859\,437$\\
$3.$&$100\,895\,598\,169$&$120\,226$&$15{,}147\,697$&$205\,337$&$187\,723$&$112\,303$&$898\,423$\\
$4.$&$3\times 100\,895\,598\,169$&$67\,497$&$8{,}486\,454$&$213\,260$&$67\,497$&$336\,909$&$898\,423$\\
$5.$&$4\times 100\,895\,598\,169$&$240\,452$&$35{,}318\,626$&$410\,675$&$375\,445$&$224\,606$&$1\,796\,846$\\
$6.$&$5\times 100\,895\,598\,169$&$19\,703$&$2{,}449\,216$&$148\,751$&$19\,703$&$561\,515$&$898\,423$\\
$7.$&$7\times 100\,895\,598\,169$&$1\,874$&$0{,}156\,001$&$54\,277$&$1\,874$&$786\,121$&$898\,423$\\
$8.$&$8\times 100\,895\,598\,169$&$208\,480$&$36{,}426\,234$&$449\,211$&$224\,606$&$449\,212$&$1\,796\,846$\\
\hline
\end{tabular}}
Пример 9. В таблицу не влезает.
$N=99\,000\,000\,001\,999\,999\,999=9\,000\,000\,001\times 10\,999\,999\,999$
Число шагов в обоих алгоритмах одинаковое: $50\,125\,629$.
Метод Ферма: время работы равно $12\,326{,}200\,614$ с, $x=10\,000\,000\,000$, $y=999\,999\,999$.
Метод Побережного: время работы равно $15\,791{,}294\,826$ с, $a=949\,874\,370$, $b=50\,125\,629$.

В общем, обсуждаемый метод может быть существенно эффективнее первоначального метода Фурье, если числа $p$ и $q$ сильно различаются, и хватит терпения дождаться результата. Может быть, автору следует подумать над тем, чтобы запустить метод в обратном направлении. В поиске сильно различающихся делителей он может быть эффективным.
Насколько этот метод новый — понятия не имею.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение30.06.2019, 11:39 


29/07/08
536
Уважаемый Someone, спасибо за замечательный анализ метода рекуррентной факторизации!
Ваша идея запустить метод в обратном направлении неожиданная для меня, на задумывался об этом. Сейчас попробую поразмышлять и в таком варианте.
Для близких $p$ и $q$ алгоритм можно ускорить, как мне кажется. Все-таки по сравнению с методом Ферма алгоритм достаточно громоздкий. За счет этого и времени уходит больше при одинаковом количестве шагов.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение30.06.2019, 19:12 
Заслуженный участник


20/08/14
11195
Россия, Москва
Вот бы сделать несколько тысяч итераций методом Ферма, а потом продолжить этим ... Конкретный порог переключения можно поискать, главное чтобы получилось продолжить.

 Профиль  
                  
 
 Re: Факторизация рекуррентным методом
Сообщение30.06.2019, 19:47 


29/07/08
536
Dmitriy40, это можно всегда сделать, если иметь в виду, что
$x=n+b$,
$y=a+b$.
Начинаем методом Ферма, останавливаемся на определенном шаге с известными $x$ и $y$.
Далее вычисляем соответственно $a$ и $b$, которые будут начальными значениями в рекуррентном методе и продолжаем вычислять уже рекуррентным методом.
Можно и обратно перейти соответственно.
Только мне кажется метод Ферма оптимально применять тогда, когда $b$ меняется с шагом 1.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Yules


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group