2014 dxdy logo

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

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


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Ускорение вычисления китайской теоремы об остатках
Сообщение03.03.2021, 15:43 
Заслуженный участник


20/08/14
11780
Россия, Москва
Всех приветствую.
Вопрос кратко: можно ли без полного перебора всех вариантов упорядочить числа (в смысле получить несколько наименьших), восстанавливаемые китайской теоремой об остатках по списку известных остатков по модулям?

Пример.
Пусть даны три множества: $a_{2357}=\{191\} \pmod{210}$, $a_{11}=\{2;3;4;8;9\} \pmod{11}$, $a_{13}=\{2;4;5;6;8;11;12\} \pmod{13}$. По китайской теореме об остатках они задают 35 различных чисел ${} \pmod{30030}$, от $1031$ до $29801$. Причём первые два множества задают 5 чисел $2081;2291;191;1031;1241 \pmod{2310}$.

Можно ли без полного перебора и вычисления всех 35 чисел, имея лишь сами три множества (и их модули разумеется), получить или число $1031$ (для него выполняется $a_{11}=8 \pmod{11}, \; a_{13}=4 \pmod {13}$, т.е. вовсе не наименьшие допустимые) или скажем 12 наименьших чисел из 35 или скажем все числа менее $10000$ (их как раз 12)?

Сколько ни думаю, кроме полного перебора всех 35 вариантов ничего в голову не приходит.
Глянул в "Дынкин, Успенский. Математические беседы.", рекомендованную Munin год назад, но там похоже ответа нет.
Пробовал вычислять числа через сумму произведений, надеялся минимизировать сумму взяв минимумы каждого слагаемого, но не работает: слагаемые большие, сумма большая, но по модулю мала. А в алгоритме Гарднера не получается считать (и минимизировать) произведения независимо.
Да, все числа натуральные и конечные, а модули вообще или простые или праймориалы, никаких идеалов и прочей зауми.

Возможно ли желаемое и если да, то в какую сторону смотреть?

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение03.03.2021, 15:59 
Заслуженный участник


16/02/13
4195
Владивосток
Имхо, ввиду банального отсутствия операций меньше/больше в арифметике остатков — полнаяя безнадёга.

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение03.03.2021, 17:43 
Заслуженный участник


27/04/09
28128
iifat
Циклический порядок там зато остаётся. Так что про него должны быть возможны какие-то утверждения, и если мы зафиксируем один из элементов, например 0 «самым левым», мы получим на оставшихся линейный порядок, так что если мы в вычислениях будем где-то иметь в виду этот зафиксированный 0, то есть надежда улучшить вычисления каким-то образом.

Но советов конкретно по теме у меня нет. :-(

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение03.03.2021, 17:44 
Заслуженный участник


18/01/15
3231
Dmitriy40 в сообщении #1507630 писал(а):
Можно ли без полного перебора и вычисления всех 35 чисел,
Можно. Немножко, по крайней мере.
iifat в сообщении #1507636 писал(а):
полнаяя безнадёга.
Ну что вы так пессимистичны ? :-)

Пусть у нас есть два взаимно простых модуля $m_1$ и $m_2$. Сначала найдем вычет $x_1$ по модулю $m=m_1m_2$ такой, что $x_1\equiv1\pmod{m_1}$ и $x_1\equiv0\pmod{m_2}$, и аналогично $x_2$ такой, что $x_2\equiv0\pmod{m_1}$ и $x_2\equiv1\pmod{m_2}$. Дальше, пусть есть два множества вычетов $A_1\subseteq\{0,1,\ldots, m_1-1\}$, и аналогичное $A_2$. Тогда нам надо найти наименьшее по модулю $m$ среди чисел вида $a_1x_1+a_2x_2$, где $a_i\in A_i$, не так ли ?

Вычисляем все числа вида $a_1x_1$ по модулю $m$, и упорядочиваем их. Затем то же самое делаем с числами вида $-a_2x_2$ (заметим минус !). Объединяем их в один список, упорядоченный, и потом по этому списку проходим, и смотрим, где там наименьшая разность между последовательными элементами. (При этом два элемента должны быть подходящих типов, т.е. тот, что больше, вида $a_1x_1$, а второй --- вида $-a_2x_2$.)

Хотя я написал весьма примерно, но надеюсь понятно.

-- 03.03.2021, 16:54 --

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

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение03.03.2021, 18:04 
Заслуженный участник
Аватара пользователя


23/07/08
10909
Crna Gora
Dmitriy40 в сообщении #1507630 писал(а):
Можно ли без полного перебора
Из первого сравнения вытекает, что достаточно для чисел вида $p_n=191+210n$, где $n=0...(11\cdot 13-1)$, проверить, что остатки $p_n\operatorname{mod} 11$ и $p_n\operatorname{mod} 13$ будут подходящими.
«Коэффициент полезного действия» при этом будет $\frac{5\cdot 7}{11\cdot 13}\approx 0.245$, то есть примерно каждое четвёртое проверяемое число окажется подходящим.
Чтобы добраться до числа $1031$, нужно проверить всего пять чисел такого вида.

-- Ср мар 03, 2021 17:26:53 --

Более того, пусть $m_n=p_n \operatorname{mod} 11$. Найдя
$191\operatorname{mod} 11=4$,
$210\operatorname{mod} 11=1$,
можно эффективно вычислять $m_n$:
$m_0=4$
$m_n=m_{n-1}+1$ (и ещё минус $11$, если результат $\geqslant 11$).

Аналогично для $p_n \operatorname{mod} 13$

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение03.03.2021, 20:13 
Заслуженный участник


20/08/14
11780
Россия, Москва
vpb
Обобщить вроде бы можно: ищем такие $x_i$, чтобы они были $\forall i: x_i \equiv 1 \pmod{m_i}$ и $\forall j \ne i: x_i \equiv 0 \pmod{m_j}$, т.е. единичные ровно по одному модулю, по остальным нулевые. Остальное как у Вас. Или там засада в знаке минус?
Только я не понял откуда возьмётся ускорение если перебор всё равно будет при подборе $a_i$, который предлагаете выполнять проходом по списку (ещё плохо понятно как объединять списки). Или Вы имели в виду что сложность слияния с сортировкой и линейного прохода даже в сумме меньше сложности перебора? Надо обдумать и попробовать на других примерах. Пока заметного преимущества не замечаю.

svv
Да, похоже в ограниченном примере это работает неплохо, 25% вероятность хороша. Но вот при расширении примера до реальной задачи, а надо хотя бы два десятка простых модуля и искомые числа порядка $10^{30}$, КПД упадёт, причём я даже знаю насколько.
На самом деле я видимо уже использую нечто подобное.

Для реальных задач и объёмов памяти — "КПД" упадёт в миллионы раз, например в одной из задач из интервала в $13\cdot10^{15}$ чисел у меня уходят дальше на проверку лишь $3.83\cdot10^6$ чисел, или одна трёхмиллиардная часть, вместо 1.1% ($35/30030$) как в примере, и этот показатель хочется улучшить ещё на несколько порядков путём более прямого построения подходящих чисел вместо поиска их перебором, потому что реальные решения очень часто буквально в первых подходящих числах, при том что большинство остальных на порядки больше, но вот как найти эти подходящие среди всех ...

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение03.03.2021, 20:55 
Заслуженный участник


18/01/15
3231
Dmitriy40 в сообщении #1507685 писал(а):
Только я не понял откуда возьмётся ускорение
Допустим, есть два множества чисел $X$ и $Y$, и нам надо найти пару $(x,y)\in X\times Y$ такую, что $x-y$ --- минимальное возможное (и положительное). Ясно, что можно перебирать все пары $(x,y)$, вычислять для них разность. На это нужно время порядка $|X|\cdot|Y|$. Но можно и не перебирать все пары, а сначала сортировать одно из множеств, скажем $X$, а потом для каждого элемента из $Y$ находить ближайший к нему элемент из $X$. Так нужно перебрать только элементы из $Y$. И время $O(|Y| \log |X|)$. Так понятнее ?

-- 03.03.2021, 20:17 --

Собственно, про $O(|Y|\log |X|)$ я зря написал. Если сортировать заранее оба $X$ и $Y$, то только $O(|X|+|Y|)$, да еще $O(|X|\log |X|+|Y|\log |Y|)$ на саму сортировку.

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение04.03.2021, 20:27 
Заслуженный участник


20/08/14
11780
Россия, Москва
vpb
Ну да, я так и понял, что предварительной сортировкой уменьшаете потом время поиска минимума.
Сомнения были что две сортировки будут быстрее перебора всех пар. Множества то маленькие, с полсотни элементов, на них важнее не $O()$, а конкретное время. Хотя, если брать не по простому модулю, а сразу по произведению простых, множества будут большими ... Буду думать и пробовать.

Интересно можно ли это обобщить на большее количество множеств, моя мысль выше про единственность единичного вычета не работает.

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение04.03.2021, 20:47 
Заслуженный участник


18/01/15
3231
Dmitriy40 в сообщении #1507878 писал(а):
Хотя, если брать не по простому модулю, а сразу по произведению простых, множества будут большими ...

Так вот то-то и оно. Я как раз имел в виду, разбить множество простых модулей на две группы, найти группы вычетов по модулям, являющимся произведениями простых в каждой из групп, и дальше применить указанный прием. А можно ли обобщить на несколько множеств (три и больше), это, боюсь, вопрос на миллион (NP-полная задача, то есть).

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение05.03.2021, 21:44 
Заслуженный участник


20/08/14
11780
Россия, Москва
vpb
Ну в общем с двумя множествами способ очевидно работает (после некоторых мелких доработок).
Засада что я не могу разбить интересующий диапазон всего на два множества, они получаются длиной порядка $10^{20}$ элементов, столько ни вычислить, ни сохранить, ни отсортировать, ни перебрать. В принципе они все и не нужны, хватило бы и наименьших $10^{15}$, но как их получить без вычисления всех $10^{20}$ мне непонятно (вопрос в частности как раз об этом). Рекурсивно спуститься не получится, они не равны суммам, там произведения.

Если б побить исходные $10^{40}$ хотя бы на пять множеств по $10^{8}$ элементов, то вот их уже можно и отсортировать и потом перебрать, но количество вариантов сумм кардинально увеличивается: для двух множеств вариантов всего два (оба элемента в начале каждого множества и элементы в разных концах множеств), для трёх уже больше десятка (вроде бы, даже не выписал ещё все), и т.д. (UPD. Глупость написал, всё проще.) Наверное можно их все аккуратно выписать и закодировать, и если это делать автоматически, а не руками, то должно получиться.
Спасибо за идею, буду думать как автоматизировать процесс.


Но конечно желалось более прямого и простого пути. Ведь праймориал $127\# > 4\cdot10^{48}$, а значит зная все остатки/вычеты по простым до $127$ можно узнать и список допустимых чисел до $4\cdot10^{48}$ и в нём будет хотя бы относительно мало чисел меньше скажем $10^{25}$ и уже их можно более-менее быстро перебрать. Вопрос как их получить не вычисляя все допустимые $10^{36}$ (для одной из задач) во всём праймориале. А если учесть ещё и допустимые остатки по следующей сотне тысяч простых, то можно сразу более-менее вероятно гарантировать простоту допустимых чисел не проверяя их каждое на простоту.

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение08.03.2021, 22:37 
Заслуженный участник


20/08/14
11780
Россия, Москва
Никак не получается для реальных задач применить, массивы слишком большие (десятки терабайт и более), а по частям их не получается обрабатывать. Дело не доходит даже до пробной реализации, каждая предварительная оценка даёт нереальные размеры массивов. Или не даёт уменьшения перебора допустимых чисел. Или слишком медленно генерируются и проверяются потом числа.

Пока проще всего и намного быстрее оказался старый рабочий способ (реализованный ещё 5 лет назад), почти как svv описал: сформировал список допустимых остатков по некоторому большому модулю и иду по числовому ряду с шагом модуля и проверяю лишь вот этот список допустимых чисел в каждом интервале. Каждое число проверяется на допустимость по остаткам на 15 следующих простых в среднем за 5 тактов процессора (на все 15 простых суммарно).
Для примера из первого сообщения это будет примерно так: иду с шагом $2310$ и проверяю числа $x=2310n+\{2081;2291;191;1031;1241\}$ (это допустимые остатки по модулю $2310$, полученные из $a_{2357}$ и $a_{11}$ китайской теоремой об остатках) на остаток от деления каждого на $13$, чтобы он попал в множество $a_{13}=\{2;4;5;6;8;11;12\}$. Подходит только $1031$, оно в данном случае и является искомым решением. В других случаях $n$ может быть очень велико.

Вот для одной из несложных задач надо проверить $6\cdot10^{15}$ чисел в диапазоне $10^{23}$ (если я прав и искомое число его не превышает), все они в память не лезут или слишком медленно проверяются по двум массивам и приходится поджать модуль лишь до $7.4\cdot10^{12}$ с $6.6\cdot10^6$ допустимыми числами, ну и вместо $6\cdot10^{15}$ проверить надо $10^{17}$ чисел и при итоговой скорости $3\cdot10^9$ проверяемых чисел в секунду (в 4 потока) время возрастает с примерно трёх недель до более года. :-( А если я ошибся и искомое число ещё больше, то ... :facepalm:

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение09.03.2021, 08:55 
Заслуженный участник


20/08/14
11780
Россия, Москва
Что же, тогда немного другой вопрос в продолжение той же темы.
Пусть для того же примера из первого сообщения дополнительно известны допустимые остатки ещё по модулю: $a_{17}=\{1,2,3,4,5,6,7,8,9,10,12,13,14,15,16\}\pmod{17}$.
Сделаем предположение что искомое число менее $2310$. Тогда вычислив его по модулю $2310$ получим что оно не просто должно давать допустимые остатки из $a_{13}$ и $a_{17}$, но и более того, оно не должно меняться при учёте китайской теоремой об остатках модулей $13$ и $17$. При этом условии при учёте модуля $13$ из 5-ти допустимых чисел по модулю $2310$ остаётся всего 2 допустимых числа по модулю $30030$ вместо всего возможных 35-ти. Фактически лишь два из них меньше $2310$. А при учёте и модуля $17$ количество допустимых чисел падает до нуля из 525 возможных (т.е. все они не меньше $2310$). Т.е. сделанное предположение оказалось неверным. И число, удовлетворяющее всем модулям никак не меньше $2310$.

Вопрос можно ли как-то вот эти условия на следующие модули интегрировать в список допустимых остатков по предыдущим модулям? Т.е. не перебирая все 5 чисел по модулю сразу как-то ограничить их до 2 (или хотя бы менее 35) учётом множества $a_{13}$? Вроде бы здесь должно наблюдаться не объединение множеств (как по китайской теореме об остатках), а пересечение. А значит можно как-то "перекинуть" условия сравнимости из одного модуля в другой (другие), но вот как ...
Или всё в итоге всё равно сведётся к перебору всех комбинаций чисел (например предложенным выше vpb способом с делением на два разных модуля и однократным проходом по двум массивам с проверкой лишь чисел менее желаемого порога)?

 Профиль  
                  
 
 Re: Ускорение вычисления китайской теоремы об остатках
Сообщение12.03.2021, 05:16 
Заслуженный участник


20/08/14
11780
Россия, Москва
Чего-то не получается у меня математическими методами уменьшить размер перебора при одновременном не слишком сильном возрастании размеров массивов. Даже для простенького модельного примерчика выше.

А высказанная выше надежда об уменьшении списка допустимых остатков вообще не работает, во всяком случае как задумывалось: чтобы по известной величине $a_{2357} \bmod 13$ уменьшить список $a_{11}$ с пяти до двух элементов. Он конечно уменьшается, но почему-то (sic!) для разных чисел $a_{2357}=\{9,35,87,139,191\}\equiv 9 \pmod{13}$ одинаковых по модулю $13$ он разный. А это собственно убивает всю идею. :-(

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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