2014 dxdy logo

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

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


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


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



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Алгоритм для поиска НОК
Сообщение02.03.2016, 13:24 
Аватара пользователя


11/08/11
1135
Для поиска НОД известна куча алгоритмов, что евклидов, что подсмотренный мной у Кнута метод двоичных сдвигов (который работает быстрее). В принципе, зная два числа и их НОД, можно найти и НОК по всем известной формуле. Однако там есть умножение и деление, плюс сначала ищется НОД, который нам, может, и не нужен вовсе.

Но есть ли алгоритм, наподобие хотя бы евклидова, для поиска НОК? Чтобы там не было операций сложнее сложений-вычитаний и двоичных сдвигов вправо-влево? Я такого нигде не нашел, и придумать не смог.

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 14:15 
Заслуженный участник
Аватара пользователя


19/12/10
1546
INGELRII в сообщении #1103590 писал(а):
Чтобы там не было операций сложнее сложений-вычитаний и двоичных сдвигов вправо-влево?

Ну если вопрос эффективности не стоит, можно попеременно вычислять члены двух последовательностей:

$x_1=a,\ x_{n+1}=x_n+a;\ y_1=b,\ y_{n+1}=y_n+b$

первый общий член и будет $\operatorname{lcm}(a,b)$
:D

INGELRII в сообщении #1103590 писал(а):
В принципе, зная два числа и их НОД, можно найти и НОК по всем известной формуле.

А формулу для трёх и более чисел знаете?

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 15:04 
Аватара пользователя


07/02/12
1434
Питер
INGELRII в сообщении #1103590 писал(а):
Чтобы там не было операций сложнее сложений-вычитаний и двоичных сдвигов вправо-влево?

А умножение в Вашем случае - тоже слишком тяжелая операция? Железо - это какой-то старый контроллер?

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 15:07 
Аватара пользователя


11/08/11
1135
whitefox в сообщении #1103597 писал(а):
Ну если вопрос эффективности не стоит,

Ладно, поставим дополнительно вопрос эффективности :P А то для такого наивного алгоритма я предвижу некоторые неприятности для чисел типа $100500$ и $100501$, например.

whitefox в сообщении #1103597 писал(а):
А формулу для трёх и более чисел знаете?

Ничего проще чем: сначала найти НОК для пары чисел из заданных, затем НОК для найденного на предыдущем шаге и еще одного числа из заданных, и так далее делать шаги, пока массив заданных чисел не исчерпается - нет, не знаю.

-- 02.03.2016, 15:11 --

bondkim137
Ну допустим, нам надо с достаточно высокой частотой принимать на вход данные и в побыстрее выдавать их кратное. Тогда да, умножение и деление может испортить нам малину. Я предлагаю все же принять задачу как данность и решать именно ее, а не отвлекаться на вопросы типа какой процессор, сколько потоков, не роняли ли системный блок при переноске.

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 15:21 
Аватара пользователя


07/02/12
1434
Питер
Умножение в этой задаче - важный инструмент.
Я поинтересовался - от него отказываются из спортивных соображений или действительно в этом есть практическая необходимость.
Принципиально умножение делается через сложение и сдвиг, но это относительно медленно. Сейчас оно почти везде есть и по скорости уступает сложению незначительно. Если стоит вопрос эффективности - то это важный вопрос.

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 15:26 
Заслуженный участник
Аватара пользователя


19/12/10
1546
INGELRII в сообщении #1103603 писал(а):
Ничего проще чем: сначала найти НОК для пары чисел из заданных, затем НОК для найденного на предыдущем шаге и еще одного числа из заданных, и так далее делать шаги, пока массив заданных чисел не исчерпается - нет, не знаю.

Для трёх чисел:

$\operatorname{lcm}(a,b,c)=(a^{-1},b^{-1},c^{-1})^{-1}$

Здесь $(x,y,z)$ означает $\gcd(x,y,z),$ как это часто и пишут. Для большего числа чисел формула аналогична.

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 15:28 
Аватара пользователя


11/08/11
1135
whitefox
...где $a^{-1}$ означает?

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 15:37 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Что написано, то и означает. :D
Вы же Кнута читали.
Покажу на примере двух чисел:
$$(a^{-1},b^{-1})^{-1}=\frac1{(\frac1a,\frac1b)}=\frac{ab}{(\frac{ab}a,\frac{ab}b)}=\operatorname{lcm}(a,b)$$

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 15:47 
Аватара пользователя


11/08/11
1135
Поздравляю, Вам удалось меня затроллить :D То есть, я так понимаю, надо расширить алгоритм на рациональные числа. То есть пара числитель-знаменатель, далее по формулам сложения дробей... Тут-то при нахождении числителя умножение и вылезет. Кроме того, вылезет поиск НОД при нахождении знаменателя. И все это каждый раз, как мы складываем-вычитаем. Это только в теории формула красивая, а на практике вон оно че.

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 15:50 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Ну красивая же. :D
А насчёт эффективности ... никто и не обещал.

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 17:12 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
Алгоритм поиска наибольшего общего кратного для двух простых чисел (собственно, и не только простых, для чисел с НОД=1) должен выдавать их произведение. Следовательно, он либо не проще умножения, либо существует некий метод умножения много быстрее существующего. Первое весьма правдоподобно, но, значит, пользы от особого метода для НОК сравнительно с вычислением через НОД и умножение нет, второе маловероятно, но вдруг? Приз будет побольше просто нового алгоритма для НОК, хотя вряд ли удастся его получить.

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 20:16 
Аватара пользователя


11/08/11
1135
У все того же дяди Кнута читаем, что для двух случайных натуральных чисел веротность иметь НОД равный единице - это $\frac{6}{\pi^2}$ (и давайте воздержимся от холивара на тему "что есть два случайных натуральных числа", а то тема разрастется на пятьдесят страниц), значит вероятность иметь НОД больше единицы около $0.35$. Уже не так мало, чтобы не давать некий достаточно хороший выигрыш по времени в таких случаях. Есть к чему стремиться.

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

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 21:20 
Заслуженный участник


20/08/14
11776
Россия, Москва
INGELRII
Вы не учитываете что в реальной практике возможны и нередки случаи противоречия теоретическим оценкам, например умножение может быть быстрее сложения ... (Пример: сложение и умножение вещественных чисел, сложение требует двух нормализаций, до и после, умножение лишь одной после, если нормализация выполняется дольше умножения, а такое вполне реально, матричные умножители никто не отменял, то налицо парадокс.) А во многих современных архитектурах умножение конечно медленнее сложения, но вовсе не так катастрофично, как следует из Кнута и теории алгоритмов. Просто потому, что его специально ускоряют, аппаратными методами. И заменять имеющуюся аппаратную команду даже самым лучшим и быстрым алгоритмом выгодно весьма редко.

По теме, я думаю алгоритм нахождения НОК будет не быстрее алгоритма НОД, а тогда добавка к НОД умножения и деления (которое можно в 60% случаев и не выполнять) не слишком заметна. Наверное. И как правильно сказали выше, уж точно не будет быстрее умножения.

Хотя ради спортивного интереса мне бы тоже хотелось взглянуть на алгоритм нахождения НОК без нахождения НОК и быстрее чем приведённый выше со сложениями. :-)

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 21:30 
Заслуженный участник


04/05/09
4587
Есть смысл избегать деления - оно весьма медленно выполняется. Умножение на современных процессорах почти такое-же быстрое, как и сложение, так что тут экономить смысл есть только если алгоритм поиска НОД не станет сложнее, в чём я сомневаюсь. А без деления можно обойтись - расширенный алгоритм Евклида (бинарный или нет) находит одновременно НОД и частные от деления исходных чисел на НОД. После этого достаточно одного умножения, чтобы получить НОК.

 Профиль  
                  
 
 Re: Алгоритм для поиска НОК
Сообщение02.03.2016, 21:31 
Аватара пользователя


11/08/11
1135
Dmitriy40 в сообщении #1103702 писал(а):
Пример: сложение и умножение вещественных чисел

Но я веду речь не о вещественных числах, внезапно. Пример не засчитан.

Чей-то вас всех уносит мыслью по древу. Не, я и сам не против поговорить за королей и капусту, но может, разберемся для начала с моим первоначальным вопросом? А потом все вместе переместимся в Свободный Полет и уж там как пообщаемся, как пообщаемся, на самые отвлеченные темы! :roll:

-- 02.03.2016, 21:32 --

venco
А вот ваша мысль ближе к делу. Пожалуй, это и впрямь решение.

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

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



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

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


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

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