Size: a a a

2020 December 10

LL

Lama Lover in pro.elixir
Alexander Beniaminov
Есть задача о Санта Клаусе. На чистом erlang или elixir она решается относительно легко, но вот решить ее в рамках ОТП может быть сложнее
Что за задача?
источник

AB

Alexander Beniaminov in pro.elixir
источник

AB

Alexander Beniaminov in pro.elixir
Заброшу перевод
Санта Клаус спит в своем доме на Северном полюсе и просыпается, когда все девять северных оленей возвращаются со своих каникул длинною в год, который они проводят на одном из тропических островов Южной части Тихого океана, или когда у некоторых эльфов возникают проблемы с изготовлением новогодних игрушек. Трудности у одного эльфа не является поводом, чтобы будить Санту (иначе ему спать не придется), поэтому, эльфы посещают Санту группой по трое. Пока три эльфа решают свои проблемы, все другие эльфы, надеющиеся на аудиенцию, должны ждать, пока эти трое вернутся к работе. Если Санта проснувшись, обнаружит, что три эльфа ждут у дверей его дома, но в то же время последний олень вернулся из тропиков, Санта принимает решение, что эльфы могут подождать до окончания Рождества, потому как более важным является, как можно быстрее готовить сани. ( Можно предположить, что северным оленям не хочется покидать тропики, и поэтому они тянут с возвращением до последней возможности. Они могли бы вообще не возвращаться, но именно Санта оплачивает их счета за год проведенный в раю ... Это также объясняет быстроту, с которой они доставляют рождественские подарки: ведь олени не могут дождаться того времени, когда они окажутся в тепле). Последнему прибывшиму северному оленю, приходится расплачиваться тем, что он должен будить Санту, в то время как остальные ждут в своих теплых стойлах когда их запрягут в сани.
источник

SM

Sergei Maximov in pro.elixir
Ivan Ananev
ну это в итоге O(n) ?
Не знаю, писали уже (не читал весь тред), но в BEAM есть оптимизация для случая, когда мы создаём свежий ref, отправляем с ним сообщение и делаем selective receive по этому же ref-у, в этом случае можно избежать цикла по mailbox-у.
источник

a

arikai in pro.elixir
arikai
В коде не подскажу, но упоминание есть как минимум в LYSE (конец страницы): https://learnyousomeerlang.com/more-on-multiprocessing

'''
Note: Since R14A, a new optimization has been added to Erlang's compiler. It simplifies selective receives in very specific cases of back-and-forth communications between processes. An example of such a function is optimized/1 in multiproc.erl.

To make it work, a reference (make_ref()) has to be created in a function and then sent in a message. In the same function, a selective receive is then made. If no message can match unless it contains the same reference, the compiler automatically makes sure the VM will skip messages received before the creation of that reference.

Note that you shouldn't try to coerce your code to fit such optimizations. The Erlang developers only look for patterns that are frequently used and then make them faster. If you write idiomatic code, optimizations should come to you. Not the other way around.
'''
Недавно вспоминали
источник
2020 December 11

AD

Aaron Delarge in pro.elixir
Делаю задачку из проекта Эйлера, и при переборе большого числа программа падает по таймауту🤔 есть какие-то особенности при работе с большими числами? Чет я особо не нагуглил ничего про это
источник

AD

Aaron Delarge in pro.elixir
Глянул решения на питоне. Люди пишут алгоритм со сложностью N2 без какой-либо оптимизации и кайфуют сидят
источник

AD

Aaron Delarge in pro.elixir
источник

IK

Ihor Katkov in pro.elixir
Aaron Delarge
Делаю задачку из проекта Эйлера, и при переборе большого числа программа падает по таймауту🤔 есть какие-то особенности при работе с большими числами? Чет я особо не нагуглил ничего про это
Сбрось код, покурим
источник

AD

Aaron Delarge in pro.elixir
Ihor Katkov
Сбрось код, покурим
https://github.com/USATUKirill96/euler_project_elixir/blob/master/lib/euler_project/problem_3.ex Описание задачи есть в докстринге. Возможно, есть решение с меньшей алгоритмической сложностью, и нужно использовать его. Я попытался оптимизировать код следующим образом:
1. Перебор при поиске делителей осуществлять с меньших чисел, так как там вероятность найти делитель выше
2. Ограничивать верхнюю границу поиска делителя половиной исследуемого числа, т.к. выше их уже быть не может
Комментариев в коде не хватает, потому что я отчаялся уже и промежуточный вариант выгрузил
источник

LL

Lama Lover in pro.elixir
Aaron Delarge
Делаю задачку из проекта Эйлера, и при переборе большого числа программа падает по таймауту🤔 есть какие-то особенности при работе с большими числами? Чет я особо не нагуглил ничего про это
В elixir всё вроде само в какой-то момент превращается в большие числа само по себе
Я вот только что возвёл 2 в 200 степень
источник

LL

Lama Lover in pro.elixir
Aaron Delarge
https://github.com/USATUKirill96/euler_project_elixir/blob/master/lib/euler_project/problem_3.ex Описание задачи есть в докстринге. Возможно, есть решение с меньшей алгоритмической сложностью, и нужно использовать его. Я попытался оптимизировать код следующим образом:
1. Перебор при поиске делителей осуществлять с меньших чисел, так как там вероятность найти делитель выше
2. Ограничивать верхнюю границу поиска делителя половиной исследуемого числа, т.к. выше их уже быть не может
Комментариев в коде не хватает, потому что я отчаялся уже и промежуточный вариант выгрузил
Тебе нужно найти наибольший простой делитель
Я бы предложил делать перебор так:
Взять корень из 600851475143 и перебирать числа от корня к единице
Первое встреченное простое — наибольший простой делитель
источник

LL

Lama Lover in pro.elixir
Я ошибся, но мой алгоритм можно модифицировать, хехе
источник

AD

Aaron Delarge in pro.elixir
Lama Lover
Я ошибся, но мой алгоритм можно модифицировать, хехе
Я уже начал думать офигеть как просто было пхахах. Наверное, мне лучше надо в курс по алгоритмам зарубиться🤔
источник

ŹR

Źmićer Rubinštejn in pro.elixir
А как понять, что первое встречное - простое?
источник

A

Aldar in pro.elixir
Aaron Delarge
https://github.com/USATUKirill96/euler_project_elixir/blob/master/lib/euler_project/problem_3.ex Описание задачи есть в докстринге. Возможно, есть решение с меньшей алгоритмической сложностью, и нужно использовать его. Я попытался оптимизировать код следующим образом:
1. Перебор при поиске делителей осуществлять с меньших чисел, так как там вероятность найти делитель выше
2. Ограничивать верхнюю границу поиска делителя половиной исследуемого числа, т.к. выше их уже быть не может
Комментариев в коде не хватает, потому что я отчаялся уже и промежуточный вариант выгрузил
Решетом эратосфена все простые от 2 до корня найти и начав с самого большого проверять являются ли делителями
источник

S

Solopa in pro.elixir
Aaron Delarge
https://github.com/USATUKirill96/euler_project_elixir/blob/master/lib/euler_project/problem_3.ex Описание задачи есть в докстринге. Возможно, есть решение с меньшей алгоритмической сложностью, и нужно использовать его. Я попытался оптимизировать код следующим образом:
1. Перебор при поиске делителей осуществлять с меньших чисел, так как там вероятность найти делитель выше
2. Ограничивать верхнюю границу поиска делителя половиной исследуемого числа, т.к. выше их уже быть не может
Комментариев в коде не хватает, потому что я отчаялся уже и промежуточный вариант выгрузил
Вот, остались со студенчества закладки ещё)
http://mech.math.msu.su/~shvetz/54/inf/perl-problems/chPrimes_sIdeas.xhtml
источник

AD

Aaron Delarge in pro.elixir
Źmićer Rubinštejn
А как понять, что первое встречное - простое?
Я проверял, есть ли для него делители в диапазоне [2 .. number/2], но подозреваю что есть более быстрые способы
источник

AD

Aaron Delarge in pro.elixir
Всем спасибо большое)
источник

MS

Mikhail Spiridonov in pro.elixir
чтобы найти наибольший простой делитель(X) числа (A) достаточно найти наименьший простой делитель(Y) тогда X = A/Y

проверять делители имеет смысл от 1 до корня из А
источник