2014 dxdy logo

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

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


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


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



Начать новую тему Ответить на тему На страницу Пред.  1 ... 14, 15, 16, 17, 18
 
 Re: Сложности в изучении комбинаторики(совсем в отчаянии)
Сообщение25.06.2019, 22:39 


20/03/14
12041
Придется и мне сделать неприятное дело.
 !  vpb
Munin
Предупреждение за использование раздела не по назначению: сообщения
post1400854.html#p1400854
post1400864.html#p1400864
post1401525.html#p1401525
и упомянутые здесь удаленные.

 Профиль  
                  
 
 Re: Сложности в изучении комбинаторики(совсем в отчаянии)
Сообщение26.06.2019, 12:31 


05/09/16
11533
Ещё о разбиениях.
В OEIS есть последовательность, A000041 -- количество разбиений числа на слагаемые.
Там написана куча всего, и что это не только количество разбиений но и то и сё и пятое и десятое... Большая, можно сказать, статья.
Там есть и несколько способов расчета количества разбиений, в т.ч. через производящие функции как нравится ув. arseniiv, и рекурсивные способы и другие.

в PARI/GP есть специальные функции которые считают количество разбиений, например для варианта a) задачи им. Yadryara (разложить непомеченные шары в непомеченные урны не менее одного шара в урну) есть функция посчета numbpart, работает она так:
? numbpart(7)
%1 = 15

Это общее количество разбиений числа 7 на слагемые.
Есть также генератор разбиений, функция partitions, которая выдаёт все разбиения, или только соответствующие ограничениям.
Для нашего случая работает так
? partitions(7,,[3,3])
%1 = [Vecsmall([1, 1, 5]), Vecsmall([1, 2, 4]), Vecsmall([1, 3, 3]), Vecsmall([2, 2, 3])]

Выдает разбиения числа 7 на не менее 3 и не более 3 частей (т.е. ровно на три части).
В PARI/GP есть оператор # который выдает количество элементов массива, вектора и т.п., так что количество по варианту а) задачи считается так:
? #partitions(7,,[3,3])
%1 = 4

То есть таких разбиений 4.
Дальше можно пользоваться этим результатом и по каждому из 4 разбиений посчитать количество вариантов.
Обозначения:
wrest в сообщении #1387316 писал(а):
Представим разбиение числа на слагаемые шаров на урны ($n$ шаров по $m$ урнам) в новых обозначениях так
$n=\sum \limits_i {k_ia_i};m=\sum \limits_ik_i$ и $\forall i\ne j:a_i \ne a_j$
То есть $a_i$ - это сколько шаров в урне, а $k_i$ - это сколько таких урн, при том что $a_i$ не повторяются (все $a_i$ различны)
Например для расклада 223
$a_1=2;k_1=2$
$a_2=3;k_2=1$

Формула:
romzes200677 в сообщении #1387955 писал(а):
$$ \dfrac{(\sum\limits_{i} {a_i}\cdot{k_i})!}{\prod \limits_i  a_i!^{k_i} \cdot  k_i!  } $$

Для облегчения итерирования по разбиениям, в PARI/GP есть оператор forpart, которые пербирает все разбиения удовлетворяющие условию. На нашего варианта а) он работает так:
? forpart(v=7,print(v),,[3,3])
Vecsmall([1, 1, 5])
Vecsmall([1, 2, 4])
Vecsmall([1, 3, 3])
Vecsmall([2, 2, 3])

Соответственно, вместо print(v) можем вставить обработку конкретного разбиения (которое помещается в вектор v) - подсчет количества вариантов, накопление суммы.

Если надо только проверить правильно ли считается количество, то в PARI/GP есть специальные функции которые прямо вычисляют все варианты. Так что для всех наших вариантов ответы получаем прямо вот так, не мудрствуя лукаво:
? variant_a(n,m)=#partitions(n,,[m,m]);
? variant_a(7,3)
%1 = 4


? variant_b(n,m)=binomial(n-1,m-1);
? variant_b(7,3)
%1 = 15


? variant_v(n,m)=stirling(n,m,2);
? variant_v(7,3)
%1 = 301


? variant_g(n,m)=m!*stirling(n,m,2);
? variant_g(7,3)
%1 = 1806


Для чего я это написал: я всё ещё думаю что romzes200677 надо написать и отладить программы для расчета вариантов а-г, а чтобы не сверяться все время с форумом, пользоваться короткими функциями которые уже есть в матпакетах, в том же PARI/GP
И освоить не только задачи а-г, но освоить всё "двенадцатизадачие", сформулированное в книжке Кнута (4 Том "Искусства программирования", раздел 7.2.1.4):
Изображение

 Профиль  
                  
 
 Re: Сложности в изучении комбинаторики(совсем в отчаянии)
Сообщение26.06.2019, 13:02 
Аватара пользователя


29/04/13
7227
Богородский
wrest, я вам больше скажу, я специально не упоминал OEIS, дабы не искушать нашего ТС, ибо там есть все числа, встречавшиеся в рассмотренных задачах "а"-"г". Хотелось бы, чтобы он всё-таки решал сам, не подглядывая в ответ.

Спасибо, очень интересно. Вообще, про PARI на русском языке интересно. Возможно, ваш пост больше подходит для темы «интерактивный курс: введение в программирование на PARI/GP»

Давайте попросим модераторов отделить эти два наших поста в ту тему.

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

 Профиль  
                  
 
 Re: Сложности в изучении комбинаторики(совсем в отчаянии)
Сообщение26.06.2019, 13:13 


05/09/16
11533
Yadryara в сообщении #1401610 писал(а):
я вам больше скажу, я специально не упоминал OEIS, дабы не искушать нашего ТС,

Да, ну так времени-то сколько прошло... Пора, ящетаю, открыть двери в новый дивный мир :mrgreen:

 Профиль  
                  
 
 Re: Сложности в изучении комбинаторики(совсем в отчаянии)
Сообщение28.06.2019, 10:55 


05/09/12
2587
Набрел на тему из жалобы модераторам в соответствующем разделе :lol:

Дисклеймер для ТС: я не математик, простой программист, и не знаю все эти страшные сочетания/размещения и прочие биномиальные коэффициенты. Но, как уже писал Munin, при решении алгоритмических задач чаще всего важно не просто получить число вариантов, жонглируя комбинаторными формулами, а написать алгоритм, перебирающий сами эти варианты (с отсечением лишних веток), для получения самих вариантов перебора. И здесь я бы рекомендовал вам забыть отложить на время волшебные формулы получения одних чисел их других, а обратить больше внимания на алгоритмы. Например, вы писали:

romzes200677 в сообщении #1383523 писал(а):
И вот когда я в итоге разобрал как решают задачу о сдаче не пойму все равно некоторые моменты :
1)
(какое кол-во монет можно выдать выдавая сумму n , если есть неограниченное кол-во монет номиналом 1,3,5 , порядок выдачи сдачи важен)
Рекурентая формула $S_n=\min ( 1+S(n-1),1+S(n-3),1+S(n-5))$ , S[0]=1,S[1]=1 (так до суммы 4), остальное вычисляем по рекурентной формуле

Вот по этому видео я разбирал задачу 1 https://www.youtube.com/watch?v=3tE1Ht6 ... S&index=17

2)
Так вот подобно комбинаторике , немного изменив условие задачи опять решается она совсем по другому
(какое минимальное кол-во монет можно выдать выдавая сумму n , если есть неограниченное кол-во монет номиналом 1,3,5 , порядок выдачи сдачи важен)
$S_n=1+S(n-1)+1+S(n-3)+1+S(n-5)$ , S[0]=0,S[1]=1

Вот по этому видео я разбирал задачу 2 https://www.youtube.com/watch?v=eOpyywc ... S&index=21


Почему во второй задаче прибавляется единица , $1 +S[n-k] $ и затем находится минимум из полученных сумм .. .в формуле , а в первой выданная монета не учитывается просто .. ?


И если вы не понимаете почему это все (а также, что рекуррентные формулы к вариантам у вас перепутаны с точностью до наоборот :-) и что важность порядка выдачи монет во второй задаче - лишнее условие, никак не влияющее на ответ), то стоит это разобрать. Здесь 1 - это одна монета (а не ее номинал! нам же надо выяснить количество монет), номинал которой вычитается из общей суммы. При этом задача сводится к самой себе на уменьшенном значении аргумента - а значит на натуральных аргументах наша рекурсивная формула вычислится за конечное число шагов. Как видите, в обоих рекуррентных формулах нет никаких страшных комбинаторных букв. Хотя и рассчитываться в таком наивном виде они будут неоптимально и долго. Но тут мы призываем на помощь волшебную динамику (судя по цитате, вы не стесняетесь смотреть видео на ютубе - стрим про ДП https://www.youtube.com/watch?v=OnUXYVd-EuY )

 Профиль  
                  
 
 Re: Сложности в изучении комбинаторики(совсем в отчаянии)
Сообщение23.07.2020, 18:43 


23/09/17
90
Привет всем , решил так сказать подытожить все мои старания, проблемы начались у меня при попытке устроиться на работу программистом и решении задач по алгоритмам.Выяснилось что нужна математика но вот какой раздел тут был вопрос. В итоге все таки я устрился работать программистом c# (обычная поддержка и сопровождение копроративного приложения на IIS сервере) в средней по размеру для региона России компании и работаю там успешно 1 год уже с моим текущим уровнем знаний по математике. На данной должности мне оказались нужны лишь поверхностные знания по комбинаторике .

Основная сложность в том чтобы помнить(найти/определить) все зависимости изменяемого участка кода , чтобы не сломать что работает. Получается ты придумываешь условие при котором должно что-то отработать , все запускаешь , бах ,не учел еще какие то зависимости, переписал условие , опять проверяешь , еще одна зависимость найдена , переписываешь по сто раз этот кусок кода и такая лапша получается .Потом получается огровное неоптимальное ветвление с кучей условий, его начинаешь упрощать , и это дается мне крайне тяжело. Вобщем огромное преимущество дает хорошая память , грубо говоря ты помнишь алгоритм какого-то блока и его зависимости . Возможно со временем все таки я запомню логику программы , но пока лишь в общих чертах за 1 год. Мне кажется хорошие математики более быстро разбираются в коде программы и быстрее вникают в ее алгоритм , вот где их гланое преимущество. Программу мою разрабатывали 4 человека в серьезной фирме в течении 1 года. Теперь я один на поддержке :) .

Вобщем если уровень математики посредственный программистом работать можно , но будете медленно въезжать в существующий код и долго возиться с задачами, но если приводить аналогию с летчиками - не все летчики являются летчиками испытателями , есть и обычные которые управляют небольшими самолетами. Не знаю , может со временем разгонюсь, но пока за 1 год я начал работать быстрее процентов на 20 % . Добавить кнопку с табличкой и формой на страницу(+ код извлечения нужных данных) в моем приложении чтобы ничего не поломать занимает у меня неделю ( бизнес логика там не простая , правда на мне front + backend ) .Короче здесь я fullstack джун . В очень серьезную фирму вряд ли я смогу устроиться с моим уровнем подготовки математики , а вот что-то попроще возможно. Так что может кто-то найдет из программистов начинающих тему думаю будет интересна кем можно устроиться с таким уровнем знаний. А форуму и всем ребятам огромное спасибо что помогали, думаю все равно часть этих знаний у меня все равно осталась и когда-то пригодится все равно. Всем удачи ...

 Профиль  
                  
 
 Re: Сложности в изучении комбинаторики(совсем в отчаянии)
Сообщение23.07.2020, 19:05 
Заслуженный участник


18/01/15
3104
Пожалуйста. И Вам наилучшие пожелания на новом месте работы. А математика, да, способствует тому, чтобы ум в порядок приводить.

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

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



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

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


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

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