Математика для программиста


    Нужна ли математика программисту?

    Нужна. А, кроме неё, нужна сферическая геометрия, география, музыка и банковское дело. И я сейчас не шучу.


    Дело в том, что программисты редко решают задачи для самих себя: мы работаем в банковских сервисах, сервисах бронирования отелей, картографических сервисах и прочих Яндекс.Почтах. Получается, что мы решаем задачи наших пользователей.


    Для решения чисто программистских задач у нас есть алгоритмы и паттерны: если посмотреть на код интернет-магазина цветов и банковского сайта он будет очень похож. Будут использоваться одинаковые условия, одинаковые циклы и даже паттерн MVC будет один и тот же.


    Важнее то, что стоит за этими вещами: понимание как работает система в целом. Если посмотреть на вещи с этой стороны, то станет понятно, что программист — это младший специалист в области, в которой работает сайт.


    Ещё пять лет назад Артём Поликарпов доказал, что каждый фронтендер немного дизайнер. Нам нужно понимать как устроены шрифты: что такое гротеск, чем он отличается от антиквы, что такое интерлиньяж, кернинг, разрядка, капитель. Понимать, что такое сетки и что такое композиция. Кроме этого, разбираться в UX — мы должны знать что такое оптимистичный UI, где поставить прелоадер и зачем это всё нужно пользователю.


    Но быть только дизайнером — мало. Дело в том, что пользователи взаимодействуют с нашими сайтами: в интернет-магазинах они вводят данные своих банковских карт, на картографических сервисах прокладывают маршруты и измеряют расстояния, на музыкальных сайтах они транспонируют тональность песен и настраивают гитару по тюнеру. И всё это должен кто-то запрограммировать. Получается, что у программиста должны быть специальные знания.


    Например, правильность номера банковской карты определяется по алгоритму Луна — это теория кодирования.


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


    С картами, вообще, связано очень много интересного. Например, Яндекс.Карты используют эллиптическую проекцию Меркатора, а все остальные географические сервисы — сферическую, поэтому если вы захотите наложить слой Яндекс.Пробок на любую другую карту у вас не сойдутся улицы и вам нужно будет знать, как трансформировать одну проекцию в другую.


    Кстати, о трансформациях. Помните CSS-фильтр matrix? Те самые числа в странном порядке, которые непонятно как влияют на поведение вашего блока? Это матрицы перехода из линейной алгебры. Если разобраться что такое матрицы и как перемножать их между собой, то вы сможете очень эффективно писать трансформации не пользуясь алиасами.


    .neo {
      transform: matrix(0, -1, 1, 0, 50px, 50px);
    }

    С кругозором понятно — изучайте всё, что хотите, потому что в любом случае это вам пригодится. Но есть ли какая-то общая область, которая нужна всем программистам? Да, такая область есть, она называется «дискретная математика». Наука, которая лежит в основе информатики.


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


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


    Ещё одна хорошая тема из дискретки — это графы. Очень многие программистские задачи решаются с помощью графов. Даже скучный и привычный DOM — это дерево, частный случай графа. И здесь неплохо бы понимать хотя бы как по деревьям можно ходить.


    Например, вы знаете, что querySelector использует поиск в глубину? Это значит, что когда он заходит на узел DOM-дерева, он пытается посмотреть сначала его дочерние узлы и только потом соседние. Это значит если вы будете искать с помощью querySelector первый элемент на странице, то необязательно это будет элемент верхнего уровня, найденный элемент может находиться на любой вложенности.


    <main>
      <section>
        <div id="underdog"></div>
      </section>
      <div id="favorite"></div>
    </main>

    const firstDiv = document.querySelector('div');
    firstDiv.id === 'underdog';

    Ещё одна тема из дискретной математики — алгоритмы. Теория алгоритмов изучает что такое алгоритмы и оценку их эффективности. Представьте, у вас есть список людей, у которых вам нужно посчитать средний рост. Список задан в виде массива объектов.


    const people = [
      { name: 'Иван', height: 183 },
      { name: 'Марья', height: 155 },
    ];

    Первое решение, которое может прийти в голову — это с помощью метода map собрать другой массив, массив ростов этих людей, а потом с помощью метода reduce посчитать их сумму и поделить на количество.


    const averageHeight = people
      .map(it => it.height)
      .reduce((acc, it) => acc + it) / people.length;

    Но это решение будет неэффективным, потому что вы будете использовать два прохода по массиву, вместо одного. Вы могли бы сразу использовать reduce для того, чтобы сложить сразу все показатели по росту.


    const averageHeight = people
      .reduce((acc, it) => acc + it.height) / people.length;

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


    Итого: учите всё подряд, что попадётся вам под руку. Для начала изучите дискретку, потому что она будет вашим основным инструментом в работе, а потом сосредоточьтесь на задачах вашего бизнеса и вы откроете для себя очень много нового в бизнесе, математике, строительстве и медицине.


    Видеоверсия



    Вопросы можно задавать здесь.

    HTML Academy 153,63
    Интерактивные онлайн-курсы
    Поделиться публикацией

    Вакансии компании HTML Academy

    • Front-end developer
      от 60 000 до 100 000 руб.
      Санкт-Петербург Полный рабочий день
    Комментарии 274
    • +16

      Гораздо важнее уметь разобраться в предметной области в кратчайшие сроки и без посторонней помощи. Как бы полезна информация ни была, всё в голове не унесёшь. Неиспользуемое имеет свойство забываться.

      • +3

        Есть совсем-совсем базовые вещи, которые нужны очень часто и везде. Утрированный пример — сложение чисел. Да, можно разобраться в предметной области по ходу. Но хорошо понимать, как складываются числа — как без этого?


        Более жизненный пример — исчисление предикатов (and, or — это вот оно). Вряд ли есть программист, который не сталкивается с ним каждый день (даже если не знает, как называется). Но людей, которые его толком не знают, я встречал. Выглядит очень странно, почти как программист, не умеющий складывать.


        Матрицы и реляционная алгебра нужны чуть реже, но все же плохо было бы их не знать.

        • 0
          Я админ(или модный devops если угодно) и матрицы с более сложной математикой даже мне нужны часто(каждый второй-третий проект в котором надо написать какой нибудь код, часто автоматизировать что-то). Но в принципе если в школе была сильная математика то 11 школьных классов математики хватит для подавляющего числа задач.
        • +2

          Знание математики гораздо универсальнее других узких предметных областей, и применимо ко многим другим предметным областям.

          • 0
            Да это так.
            Причем через некоторое время становится абсолютно по барабану: считать прочностные характеристики зданий, или рассчитывать логистику крупной компании. Можн ос легкостью переходить с задачи на задачу, которые вообще никак друг с другом не связаны.
        • +9
          В общем программист должен уметь все. А для этого надо всю жизнь ходить на курсы HTMLAcademy и учиться писать CSS через матрицы))
          Только вот зачем тогда все прочие люди на проекте?
          • +1
            Я вот тоже всегда об этому думаю — зачем все эти люди?
          • +2
            Что программисту нужно 100% — это логика. Без этого — увы никак (если программированием не называть рисование формочек, само собой).
            Математика же, обычно, нужна постольку-поскольку. Всегда можно нанять узкоспециализированного аутсорсера, если что. А держать такого в штате, обычно, накладно. Может для каких-то CAD'ов — максимум.

            Итого: учите всё подряд, что попадётся вам под руку.

            Плохой совет. Намного эффективнее изучать только то, что ограничено рамками текущей задачи, а не всё подряд.
            • +13

              На 10 году работы программистом внезапно нашёл область, где действительно нужна математика. В частности, тригонометрия и линейная алгебра… И эта область – разработка игр.

              • +3

                У меня в своё время в анализе изображений ТФКП внезапно вылезла. Причем не в связи с преобразованием Фурье, а для простого и быстрого детектирования наличия и направления полосок текстуры (и сегментации в соответствии с ним)

                • –7
                  преобразование фурье, свёртки и прочую мелочевку я как-то особо за математику и не считаю. сотни готовых библиотек.
                  • +5

                    был у меня такой коллега))) слава Богу уже работаем порознь. орал зачем ему знать основы — он и так умный)
                    написал свой атомик на Java, потому что оракловские медленно работают… они, видите ли работают через синхронизацию…
                    мало того, что работало с ошибками (ни разу не запустил чтобы проверить), так еще и скорость по бенчмарку показал на ДЕВЯТЬ порядков ниже…
                    если вы не видите пользы в математике — это совсем не значит, что она не нужна. это просто означает, что в вашей работе будет много велосипедов.
                    а готовые библиотеки не панацея. как это странно не прозвучит, но надо знать внутреннюю структуру всего, что используется в критических местах, чтобы писать эффективно.


                    пример из жизни — когда я был маленьким и глупым — получил тестовое задание от яндекса… посчитать количество чисел на офигенно большом отрезке, в которых цифры не повторяются… решение в лоб считало на 8 ядрах около 5 часов… после некоторых манипуляций с точки зрения алгоритмов — 20 секунд...))) убитое время научило в чем разница между быдлокодером и программистом.

                    • 0
                      <zanuda_mode="on">
                      Вы уверены, что на 9 порядков? Может быть в 9 раз? Просто на 9 порядков — это в 1000000000 раз медленнее…
                      <zanuda_mode="off">
                      • +2

                        сам был в шоке. уверен.

                        • –3
                          О! Мать иматики великие собрались :)
                          Итак — пусть по бенчу оптимальный алгоритм считает нечто 10 секунд (10^1).
                          Неоптимальный — (10^10) секунд.
                          Воспользуемся гуглом для того, что бы посчитать сколько это:
                          otvet.mail.ru/question/29213929
                          «примерно 31 год и 8 месяцев»
                          Вы ждали ответ 31 год? :) Математики собрались,… Яблоку негде упасть :)
                          Вы там прежде, чем плюсы и минусы расставлять, хотя бы в азах 11тилетки разобрались :)
                          Школота. Рано вам всем программировать что-то сложнее 2+2.
                          • +1

                            Напоминаю: речь идет об атомике, атомарной переменной. Это не какой-то алгоритм. Время одной операции тут измеряется микросекундами, если не наносекундами. Т.е. порядок тут 10^-6, если не 10^-9. Соответственно, на 9 порядков дольше — это от 10^0 до 10^3.


                            Нет, я, конечно тоже не понимаю как можно так накосячить с атомиком чтобы он 15 минут на операцию тратил — но технически тут ничего невозможного нет.


                            Написали же однажды партнеры самозамедляющуюся очередь с квадратичным временем на операцию...

                            • 0
                              Ок, пусть и так. Вы верите в 15 минут ожидания одной операции? Это физически возможно?
                              • +1

                                В коде которых коллег я видел много бреда. И я не вижу причин по которым в том коде, который я не видел, не было бы все еще хуже.

                                • +1

                                  откуда 15 минут? речь о нескольких операциях в секунду вместо пары десятков миллиардов за то же время.
                                  не заметили сразу потому что не сверхкритический модуль и без ограничений по времени (когда выполнится — тогда и выполнится).
                                  да и заметили-то из-за ошибок. а так бы и работало это чудо дальше.

                                  • +1

                                    Хм, 10 миллиардов атомарных операций в секунду — это вообще как? Это ж больше тактовой частоты процессора...

                                    • 0

                                      открываем спецификацию, исходники и разбираемся… а можно просто взять jmh и сделать самому — вопрос 5 минут.
                                      кроме того, вы считаете, что операции чтения тоже блокируют объект? отличный способ выстрелить себе в ногу получился бы.

                                  • 0

                                    У меня совсем недавно был случай, когда скрипт для анализа логов отрабатывал за 8 часов. Пришел, переписал, стало в 50 раз меньше кода и время работы в 7 минут.

                          • –5
                            Улыбнуло.
                            Теперь то вы точно не быдлокодер, запилили таки расчет чисел на большом отрезке.
                            Тепрь нужно узнать в чем различие между просто быдлом и нормальным человеком.
                            • +1
                              Я не говорю о том, что математику знать не нужно. Я говорю о том, что не нужно заниматься велосипедостроительством. Математических библиотек для основных расчетов написано невероятное множество, на всех основных языках и под все основные платформы. Крайне маловероятно, что кто-то напишет что-то лучше имеющегося. Изучайте лучше нейронки. Вот где математика нужна. Там еще кот не и начинался валятся.
                              • +2

                                боюсь, что вы в этой сфере не работали и не до конца понимаете необходимость алгоритмов. соболезную.
                                далеко не всегда может подойти библиотека.
                                возьмем простейшую систему, занимающуюся сверхскоростными вычислениями. пусть это будет высокочастотная торговля. нет сомнений, что там можно прикрутить какие-то алгоритмы, которые дадут кучу важной информации и чемодан денег.
                                только вот ключевое слово тут — "высокочастотная". буквально это значит, что вычисление через определенный промежуток времени уже может быть никому нафиг не нужным.
                                да… придет программист и повесит таймаут. все, что считалось дольше миллисекунды в топку и забыть. ок. ошибки не будет. только будут большие потери в мощности и куча ненужной работы.
                                потом придет другой программист, сядет, разберется и скажет "ребята… вот 90 процентов сделок мы можем отсеять если..". чтобы так сделать нужно разбираться в том, что происходит. нужно это все по возможности ЗНАТЬ.
                                просто прикрутить библиотеку может любой первокурсник.


                                для продуктов с 10 пользователями в час это не актуально. им допустимо жить под лозунгом "фулскан. и пусть весь мир подождет."

                                • 0
                                  Пафос оценил. Повторюсь: я говорил про основные расчетные алгоритмы математики.
                                  • 0

                                    ок…
                                    более основного алгоритма, чем перемножение, вы врятли найдете…
                                    только вот берем убогую машинку со считанными килобайтами памяти и ловим снижение его производительности. переписываем вручную на перемножение Карацубы — вуаля… скорость при малодоступных ресурсах выше, а результат тот же. (на высоких мощностях не работает, а кое где и вредно — ждем реализации проекта Amber)
                                    еще раз повторяю — необходимость возникнет при ограниченных ресурсах. мало памяти. мало времени, много данных, миллионы параллельных сессий… любое допущение стандартного метода выйдет боком уже не на доли миллисекунды. если бы гугл выдавал вам ответ 10 минут — стали бы вы им пользоваться? даже если гарантированно будет ответ в первой же строке.

                                    • 0
                                      1. Даже на такой относительно специализированный алгоритм уже есть множество статей и реализаций (первые найденные, наверняка можно и готовую, оттестированную, библиотеку найти):
                                      habrahabr.ru/post/124258
                                      habrahabr.ru/post/262705
                                      habrahabr.ru/post/121950
                                      Ну давайте еще одну реализацию, с блэк-джеком и остальным, сделаем :)
                                      2. Может показаться удивительным, но ограничение ресурсов есть всегда и везде, только лишь в большей или меньшей степени.
                                      • 0

                                        то есть вы утверждаете, что нашли бы все эти статьи ДО того, как поставили бы задачку написать код для какого-нибудь микроконтроллера? и особенно до того, как я этот метод упомянул?
                                        не зная теории? я обычно верю людям на слово, но все же…
                                        особенно я бы поржал с оправданий "это не у меня ошибка! это там! в библиотеке!!! где-то в ней! найти не могу — я в исходниках не разбираюсь".
                                        я немного неграмотный специалист, видимо. не могли бы вы мне указать где в этих статьях БИБЛИОТЕКИ, да еще и тесты? я вижу просто красивый код, который вы бы скопипастили. библиотек не вижу.

                              • 0
                                Быдлокодерство — это изобретение собственных кривых велосипедов вместо использования нормальных имеющихся в том числе.
                          • +1
                            Просто при разработки игр требования несколько жестче — с одной стороны необходимо писать производительный код, а с другой стороны — игра это маленькая математическая симуляция выдуманной реальности. Поэтому сразу все всплывает.

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

                            Все зависит от задач и от того насколько добросовестно подходят к её решению. Вообще в русском языке есть такое понятие как «халтура». Большая часть погроммистов именно что халтурит — кто-то осознано, кто-то неосознано, но халтурят, причем массово — целыми конторами. Благо в IT полно задач, которые при современных условиях (вычислительные мощности, обилие библиотек, фреймворков, развитые инструменты разработки) позволяют халтурить. Но вот игры — как раз задача не из этой области, прокатить на халтурку — не получится (но народ пытается, и даже наблюдаются какие-то успехи на этом фронте...)

                            Еще игры делаютя при крайне ограниченном бюджете, так что рулят человеке оркестры. В тоже время придя в какой-нибудь Синопсис можно всю жизнь лепить кнопочки и не вникать, что же там делает вон тот яйцеголовый чувак за соседним столом — просто разделение труда и компания может себе это позволить.
                          • –13
                            Что программисту нужно 100% — это логика[...]
                            Математика же, обычно, нужна постольку-поскольку
                            Какой идиот плюс комментарию поставил? ЕГЭ дает свои плоды: логику из математики выкинуть — это пиздец, граждане!
                            • +6
                              Смотря какая логика. Формальная логика это раздел философии, исчисление предикатов или булева алгебра это к математике. Я бы так однозначно не классифицировал логику :)
                              • +1
                                Вот только хотел сказать то же самое. И видимо, имелось ввиду исчисление предикатов. Так эта жуть тоже не особо нужна. Можно знать что такое OR и AND, свободно ими оперировать, и не знать такие слова как конъюнкция, дизъюнкция, предикат и не знать вообще, что это из мат. логики
                                • +1

                                  разве что при работе в коллективе для понимания между коллегами. если коммуникаций никаких и не предполагается развитие специалиста через книги / лекции / конференции — тогда есть возможность не знать терминологию.

                                  • 0
                                    Даже если предполагаются книги/лекции/конференции/общение есть большой шанс не встретить слов конъюнкция и предикат
                                    • 0

                                      не сказал бы, что большой. в общении — да. в книгах — вероятность встретить повыше… не встретить на конференции доклад с упоминанием предиката можно только не придя на нее.
                                      я не призываю учить все, что только попадается. жизни не хватит.
                                      не обязательно на зубок это все помнить. но если к вам обратится человек и употребит этот термин — крайне желательно, чтобы вы понимали о чем речь. хотя бы на уровне знания где искать его определение.
                                      Как говорится:
                                      Страшен не тот, у кого есть ядерная бомба, а тот у кого есть ее чертежи и материалы.

                                  • +1
                                    А законы де Моргана нужно знать или можно не знать?
                                    • –2
                                      Хотел сначала написать, что я вот например не знаю, потом погуглил и вспомнил, что в ВУЗе это было. С тех пор мне ни разу не пригодилось это знание. Но я — это частный случай
                                      • 0
                                        Мне всю жизнь регулярно пригождаются.
                                        С тех пор как папа в детстве вдолбил.
                                        • 0
                                          Можете привести пример задачи, где вам это пригодилось?
                                          • +1
                                            Очевидно, упрощение логических выражений. Люблю, знаете ли, писать довольно сложные логические выражения в if-ах. Иногда к ним приходится применять отрицание. А лишние скобки только мешают. Ну и «Теорию автоматов» тут сыну недавно объяснял, тоже пригодилось. Полезные законы, берите, не сомневайтесь.
                                            • 0
                                              Потом программисты после вас «любят» втыкать, чего это вы там напихали, вместо того, что бы сделать более читабельно.
                                              • 0
                                                Вот так, не видя кода, Вы быстренько провели мне codereview и вынесли вердикт. Завидую, я так не умею. До сих пор «другие программисты» не жаловались. А если вдруг кто-то из них не знает законов де Моргана, я им с удовольствием объясняю.
                                                • +1
                                                  Вот — код бы увидеть ) Что бы было что обсуждать.
                                                  • 0
                                                    Да мне не жалко. Смотрите.
                                                    • –2
                                                      А где именно вам там пригодилось хитрое преобразование по законам де Моргана?
                                                      • 0
                                                        Оно не хитрое. Оно общеупотребительное.
                                                        • 0
                                                          Мой вопрос был к тому, что там у вас везде обычные простые условия, которые пишутся так сразу без всяких преобразований.
                                                          • 0
                                                            Я помню, что такие случаи при разработки (конкретно этого проекта) были, но по всему репозиторию искать, просто для того чтобы пальцем ткнуть, большого желания нет. Возможно потом было отрефакторено.
                                                            • 0
                                                              Ну вот, чтоб далеко не ходить, из сегодняшнего коммита:
                                                              if ((piece !== null) && (piece.player == board.player)) {...}

                                                              Вполне может получиться, что напахал с условием (много раз так получалось) и надо было сверху добавить отрицание. Если «де Морган» впитался в костный мозг — сразу меняем && на || и меняем условия на противоположные. Часто так получается лучше чем один уродливый not над всей скобкой. Ну это тривиально, в самом то деле.
                                                              • 0

                                                                Ну, конкретно в этом случае это тривиально без законов де Моргана, потому что правило составлено из одного бизнес-правила и одной проверки на null. И когда "напахал с условием" не факт, что отрицать надо все сразу. А иногда "уродливый not над скобкой" лучше читается, потому что понятно, какое именно условие отрицается. Особенно если оно потом рефакторится в отдельный предикат.

                                                                • 0
                                                                  Большое достоинство таких законов в том, что им пофигу тривиально оно в данном конкретном случае или не очень. Они просто работают. И их полезно знать.

                                                                  Когда уродливый not лучше читается, я его оставляю.
                                                                • 0

                                                                  Это так что-ли?)


                                                                  if ((piece === null) || (piece.player != board.player))

                                                                  Правильно выше сказали, насчет втыкания и читабельности. Я вот даже сходу затрудняюсь, как назвать это условие.


                                                                  isCurrentPlayer = ((piece !== null) && (piece.player == board.player));
                                                                  if (isCurrentPlayer) { ... }
                                                                  if (!isCurrentPlayer) { ... }
                                                                  • 0
                                                                    Заведите issue. Обещаю её рассмотреть.
                                                    • 0
                                                      Это опыт.
                                                      Есть люди, которых хлебом не корми, дай «упростить» и засунуть в строку как можно больше, потом смотри, гадай ребусы де Моргана.
                                                      Ну это как вариант, к вам наверняка не относится, хотя не исключено.
                                                      • 0
                                                        Может быть и относится. Люблю засовывать в каждую строку побольше. С институтского Паскаля на перфокартах пошло. Там где у других студентов была стопка перфокарт толщиной в сантиметр, у меня их было всего с десяток. Важно было даже не это, а то, что в перфокартах всегда были опечатки. А поскольку у меня перфокарт было меньше, меньше приходилось и исправлять. Как бы там ни было, я давно и успешно работаю в софтверной компании и на мой код никто (уже давно) не жалуется. Вот когда я был юниором — было дело.
                                                  • 0
                                                    Если вы серьёзно делаете так в условиях в своём коде в if выражениях, то я не завидую тем, кто будет его читать и отлаживать
                                                    • 0
                                                      Это Ваше право — завидовать кому-то или нет, но владеть навыками упрощения логических (а заодно и арифметических, чего уж там) выражений полезно. Дистрибутивный закон ещё не забыли?
                                                      • 0
                                                        а полезно для чего? какой у вас критерий полезности? вот например, легко читаемый код — это полезно
                                                        • 0
                                                          Умение читать чужой код (не всегда легкочитаемый) — тоже полезно, согласитесь. Меня это умение не раз выручало.
                                                          • 0
                                                            Конечно умение читать код полезно. Но речь сейчас идет скорее об умении писать понятный код, что, согласитесь, полезно
                                                            • 0
                                                              Безусловно! Всегда стараюсь такой и писать. Я там выше ссылочку кинул. Буду очень рад, если Вы возьмёте на себя труд проревьюить код.
                                                  • +1

                                                    Проверка эквивалентности двух выражений с некоторыми ограничениями через приведение к ДНФ/КНФ.

                                                    • –2
                                                      Я понимаю, что лабораторная задача, поставленная таким образом потребует именно тех знаний, ради закрепления которых она и была придумана. А вот что-нибудь жизненное было бы интересно
                                                      • +1

                                                        Это и была жизненная задача (вернее, решение жизненной задачи, одно из возможных). Не во фронтенде и не в CSS, увы.

                                                        • 0
                                                          и как задача была поставлена изначально?
                                                          • 0

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

                                              • 0
                                                прочитал я про них… законом назвали то, что любому логическому мыслящему человеку в голову придет во время работы?
                                                • +1
                                                  Ну прочитайте ещё. Там их довольно много этих законов. И все используются для формального преобразования логических выражений. Разумеется, «логически мыслящий» человек вполне в состоянии вывести любой из них, но… Зачем ему тратить на это время? Вполне достаточно их знать (ну, или один раз вывести самому, а потом знать).
                                              • +1

                                                А вот, к примеру, тому кто делает моды для игр серии TES и "приравненных" к ним (Fallout 3+) — нужно знать как работать с конъюнктивными нормальными формами. Потому что условия в редакторе задаются именно в формате КНФ вместо интуитивно понятных ДНФ.

                                                • –1
                                                  Довольно специфичная задача, такие не очень то часто встретишь
                                                  • +1
                                                    Большая часть программистской деятельности складывается из довольно специфичных задач.
                                                    • 0
                                                      Это так. Но у нас же контекст обсуждения «нужна ли математика программисту». А специфические задачи программирования могут быть связаны не только с математикой или вообще не с математикой
                                                      • +2
                                                        Согласен. Даже согласен с тем, что есть такие программисты, которым серьёзная математика ни разу за всю жизнь не пригодилась. В этом плане, статья немного наивна, но, на мой взгляд, посыл даёт правильный. Помимо этого, математика — это весело! Серьёзно, я искренне сочувствую программистам, которым не нужна математика.
                                                        • 0
                                                          И я с вами согласен :)
                                        • +3
                                          Нам нужно понимать как устроены шрифты: что такое гротеск, чем он отличается от антиквы, что такое интерлиньяж, кернинг, разрядка, капитель. Понимать, что такое сетки и что такое композиция. Кроме этого, разбираться в UX — мы должны знать что такое оптимистичный UI, где поставить прелоадер и зачем это всё нужно пользователю.

                                          Я, например, зеленого понятия обо всём этом не имею :) Что мне не мешает активно и успешно делать отличные интерфейсы, под веб в том числе.
                                          • +3
                                            Можно пару работ посмотреть?
                                            • +1
                                              Что мне не мешает активно и успешно делать отличные интерфейсы, под веб в том числе.

                                              Может быть, эта успешность только в вашем воображении?
                                              • –3
                                                Врятли за плохие результаты будут хорошо платить, согласитесь :)
                                                • +5

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

                                                  • –1
                                                    Видишь ли, я и есть начальство :) Я — совладелец продуктовой софтверной компании. А платят нам наши клиенты. Конкуренция у нас — выше крыши. Не как у 1С с их монополией. На аутсорс мы кое-что и отдаём и довольно хорошо платим.
                                                    • +1

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


                                                      зы вспомнил на предмет "у меня высокая зарплата". одно из старых мест моей работы. сидел человечек и получал до фига денег. только не за то, что он писал что-то немыслимое. все в рамках. а просто за то, что продукт был откровенным нагромождением как письмо дяди Федора и он единственный, кто там хоть как-то разбирался. буквально ему платили за то, что он единственный был готов работать говнокопателем. все случаи индивидуальны)

                                                      • –1
                                                        Что не так? Я совладелец и сооснователь компании. И, да, мне платят за мой код в том числе. 60-70% кода всех проектов написаны мной. Про зарплату я нигде не говорил, учитесь внимательно читать. Но говорил, что платят хорошо.

                                                        чинит за начальником его код. и никто не скажет,

                                                        Всяко бывает. Но чаще наоброт, когда ревью гита делаю. И да, мы еще никого за чужое отличное мнение не увольняли. Слушаем всех, постоянно обсуждаем всё. Хотя последнее слово за владельцами, само собой.

                                                        указали на его некомпетентность используя всю глубину русского языка

                                                        Странные у вас понятия об IT компании :) На уровне совкового строитреста где-то.
                                                        • +1
                                                          за чужое отличное мнение не увольняли

                                                          ну еще бы кто-то так официально объявил. был свидетелем как за высказывание об управленческих способностях назначили "наказание" — ходить точно минута в минуту на работу и после рабочего дня еще отдельно заходить и отчитываться. т.е. расписание с 9. отдел приходит обычно в 10-11 (кому как удобно). а этот человек должен явиться в 9 утра, потому что начальник ему позвонит на рабочий номер и не дай бог тот трубку не снимет. а потом 8 рабочих часов уже прошли, но надо сходить и рассказать что делал. это же не увольнение. это просто охота на ведьм и видел я подобное несколько раз.
                                                          смех был когда сотрудник ушел и директору передали "а вообще-то он у нас половину инфраструктуры обслуживал и никто кроме него этого не умеет".


                                                          60-70% кода всех проектов написаны мной

                                                          мммм… ну еще бы свой код идеальным не казался. я уже выше говорил — все познается в сравнении. наймите человека с опытом 10+ и быстро получите отповедь насколько все криво и допотопно написано. таким людям откровенно пофиг кто перед ними — работу найдут за неделю если что.


                                                          На уровне совкового строитреста где-то

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

                                                • 0
                                                  Я может быть из другого фронтенда, но со статьей не согласен. Никогда в мои задачи как фронтенд-разработчка не входило вот это все, что описано в статье (интерлиньяж, кернинг и пр). В мои задачи входила разработка архитектуры приложения с использованием фреймворков или без них. После того, как основная часть готова, приходит макет от дизайнера (который как раз таки все это знает) и это просто накладывается сверху без особых разбирательств. Нет, это конечно же не тупое копирование шаблона из psd в css, можно и поинтересоваться всегда почему так, а не иначе. Однако, это совсем не обязательно и необходимо крайне редко.
                                                • +1

                                                  Вы не знаете, что такое кернинг и делаете UI? Можно мне тоже пример работ? Возможно, у вас талант, но талант плюс знания дали бы больше. Или вы пользуетесь заготовками от людей, которые знают, что это такое.

                                                  • +6
                                                    Где в CSS есть кернинг, который кроссбраузерный?
                                                    Уж лучше пусть будет стандартный шрифт, чем измененный дизайнеров, который потом в CSS не воспроизведешь)
                                                  • 0
                                                    Или вы пользуетесь заготовками от людей, которые знают, что это такое.

                                                    Я уже писал про UniGUI. Вот им и пользуюсь. Он позволяет отстранится от большинства браузерных особенностей и заниматься непосредственно дизайном форм + кодингом логики.
                                                    • +9
                                                      Погуглил, что такое кернинг. Каким образом это касается кого бы то ни было, кроме разработчиков шрифтов?
                                                      • –4
                                                        Зачем знать о garbage collector кому-либо, кроме разработчиков V8?
                                                        • 0

                                                          Ещё это касается того, кто выбирает шрифт. Что бы выбирать не по принципу "вроде красивый", а осмысленно. Ещё про засечки надо бы знать. Не очень глубоко, но общее представление имеет смысл иметь.

                                                          • 0
                                                            Наверное, вы правы. А как осмысленно выбирать шрифт по кернингу? Мне не очевидно. Он просто должен нормально выглядеть.
                                                            • 0

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


                                                              При этом я не хочу сказать, что такие мелкие детали нужно знать всем. Кто никогда не проектирует интерфейсы, им не обязательно.

                                                          • –1
                                                            А кто разрабатывает шрифт? Разве не дизайнеры?
                                                        • +2

                                                          Ой, и снова здравствуйте!


                                                          Это же вы на UniGUI интерфейсы делаете? Из готовых блоков, с дизайном 10-летней давности?

                                                          • 0
                                                            Скоро на 6-ку перейдут ExtJS, будет новее. Обещают до нового года. Мы пишем не чистые веб сайты, а веб-клиенты к своим программам. Результат отличный. Копию того же GMail'а на унигуе можно вполне и быстро накидать. Гугл так безнадёжно устарел?
                                                        • +6
                                                          Нужна ли математика программисту?


                                                          Пользователи NumPy недоуменно переглянулись…
                                                          • –2
                                                            При программировании интерфейсов (отображения), как только переходишь черту однообразности, без математики, хотя бы уровня отличника 11 класса, никуда. Пока разработчик берет готовое, я не буду даже говорить об архитектуре, которая, как ни странно, у всех разная, он не подозревает, что ДАЖЕ обычный прелодер, например 3D, вынесет ему мозг. Мне вообще кажется что 90% фронтэндов не понимают матрицы. В сторону canvas, там вообще никуда. Все примеры, которые выкладывают для демонстрации своих фраймворков, естествно демонстрируют самые сильные стороны, которые в реальных проектах в таком виде не используются. на phaser можно онлайн танчики на 10 пользователей сделать за день, на 500 пользователей, придется отказываться от phaser и писать свой движок. В реальности готовое можно использовать только в том виде, в котором тебе дают.

                                                            А что будет, если кому-то на работе предложат реализовать алгоритм с первого курса по вписыванию прямоугольников в пространство, как в галерее мансури. Если не знаешь математики, то даже лучше не тратить время, а увольняться, притворившись, что мне с вами не интересно :)
                                                            • 0
                                                              Спорно. Я думаю все движется в сторону унификации интерфейсов и всякие красивости на канвасе не всегда нужны. Ну а галерея масонри реализуется через display: grid тремя строками CSS)
                                                            • 0
                                                              Программисту не нужно то что легко гуглится.
                                                              • +1
                                                                то что легко гуглится.

                                                                И это точно не математика.
                                                                • +1
                                                                  Это точно та часть математики которая и нужна программисту, ему не нужно решать сложные задчи, ему нужны способы решения типичных задач, которые есть в изобилии.
                                                                  • +2

                                                                    если он никогда не учил паттерны — как же он узнает, что поставленная перед ним задача типична?

                                                                    • 0
                                                                      Любая задача типична. Если задача не типична и программист не знает этого/не понимает этого — тот кто дал ему задачу ошибся в уровне программиста.
                                                                      • 0
                                                                        Если не получилось загуглить значит нетипична, тогда нужно обращаться к спецам этой области, тут уже знание математики не поможет нужно этим заниматься всерьез.
                                                                        • 0

                                                                          серьезно?
                                                                          простите, а запрос как должен выглядеть?


                                                                          обеспечение единственной точки доступа к ресурсу базы данных приложения (выскочит, разумеется, одиночка)
                                                                          обеспечение распараллеливания вычислений данных и их суммирование как результата с сортировками и другими преобразованиями (выскочит map-reduce)


                                                                          или вы предлагаете писать по любой проблеме на StackOverFlow, чтобы другие ребята решали за вас? зачем такой спец тогда вообще нужен? за умение писать на форумах?


                                                                          или вы текст задачи в строку поиска вбивать предлагаете?


                                                                          я не пытаюсь как-то острить или обидеть. я хочу понять что мне нужно вбить в гугл чтобы выскочило "о! ваша задача уже решалась — вот готовый код для копипаста.".

                                                                          • 0
                                                                            Умение использовать нормальные готовые решения, либо довести их до таких — это одно из того, за что готовы платить в софт. компаниях. На собственном опыте.
                                                                            Всего всё равно не найти. Но то, что можно найти, позволяет лицензия и нормально работает — использовать можно и нужно.
                                                                            • 0

                                                                              прежде чем их использовать — о них нужно знать.
                                                                              или вы считаете программистом человека, который перед каждой задачей идет на форум и спрашивает не подскажет ли кто типовое решение?
                                                                              вручили бы вам в 7 классе учебник по аналитической геометрии, физике твердых металлов и музыкальному сольфеджио. поставили задачи, для решения которых в этих учебниках все есть — помогло бы?) даже если бы сказали, что время не ограниченно.


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

                                                                            • 0
                                                                              Не совсем понял, из того что вы написали следует что программист не должен знать программирование, но я такого не утверждал.
                                                                              • 0

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


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

                                                                    • +2
                                                                      «В поисковике найдётся всё» может и сыграть злую шутку в ответственный момент.
                                                                      • +3
                                                                        1. Начнем с того что надо знать что гуглить. Как правило все практические задачи покрывают сразу несколько разделов математики. Ну вот я сейчас потихонечку пилю задачку где захвачено сразу: глобальная оптимизация и мета-эвристические алгоритмы (метод имитации отжига, генетические алгоритмы, роевой интеллект и т.д.), задачи на обход графа (дискретная математика в принципе базовый минимум для программиста), задачи на раскраску графов, дискретная оптимизация, градиентные методы (Нелдер-Мид, BFGS и т.д.), компьютерная/вычислительная геометрия и внезапно еще потребовалась физика и метод конечных элементов, хотя задача к физике не имеет никакого отношения, ну и т.д. Вообще задача не особо сложная, давно известная и уже 100500 раз решенная, но конечным решением никто естественно не поделится, а охватывает она целую кучу разделов математики :-)

                                                                        2. Некоторые вещи гуглятся с трудом, если не знать конкретно, что это такое. Если Вы загуглите Kraftwerk 2, то Яндекс и Гугл буду подсовывать второй студийный альбом германской группы Крафтверк, а не алгоритм быстрой оптимизации упаковки. Добавления слов optimization и algorithm поможет слабо (хотя Гугл уже начнет подавать надежды), и так пока не добавите что-нибудь типа VLSI, placement, force-directed и прочие ключевые слова из контекста именно этого алгоритма, хотя и тут гугл с яндексом будут подсовывать много хлама. И это ситуация, когда название алгоритма известно точно, а если еще нет, то что тогда? Наедятся на то что 1 млрд обезьян чисто теоретически могут написать Войну и Мир?

                                                                        3. Чтобы применять алгоритм, нужно знать тонкости, нужно понимать как работает алгоритм, какие у него особенности. Программисты никогда не слышавшее про вычислительную геометрию на вопрос определения точки внутри многоугольника, начинают выдавать простыни тормозящего говнокода, а потом еще и удивляются почему алгоритм отрабатывает не все случаи, после чего начинают добавлять костыли, когда всего-то надо написать 19 строчек кода включая комментарии, скобочки и пропуски широко-известного Winding number algorithm (который впрочем тоже имеет ограничения применения). Но это еще простая и рутинная задача, а если что-нибудь посложнее? Ну я уже неоднократно наблюдал как погроммисты пренебрегавшие в свое время математикой, по 2-3 недели не могут написать Simulated Annealing — алгоритм 30-и летней давности и уровнем математики 1-го курса любого вуза. Крайний раз чувак перепутал знак «больше»-«меньше» и долго не мог понять почему не работает, когда ему об этом сообщили.

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

                                                                        5. Возвращаясь к Гугл нельзя не отметить, что зачастую по теме выдается всякий шлак. Если запросить чего-нибудь про Генетические алгоритмы, то там в большинстве случаев будет научпоп 70-ых годов про бинарные хромосомы и одноточечный/многоточечный кроссовер. Ну вот для решения задачи коммивояжера (около 2-х лет проработал на проекте где эта задачка была одной из основных частей ПО) это уже работать не будет, благо эта задачка учебно-типовая гугл осилит, а если что-то посложнее? А вот для чего-то посложнее операторы мутации и кроссовера (а это все математические операторы) придется разрабатывать самому в зависимости от задачи (см. пункт 4).

                                                                        6. Алгоритмов много, просто тьма. Одну и туже задачу можно решить несколькими десятками алгоритмов, каждый из которых имеет свои достоинства и недостатки — без знания предметной области и без определенного математического бэкграунда оптимального решения не будет никогда (если вообще появится, знаю пару кодерских контор, которые так зафейлили очень жирные заказы). Еще очень распространенная проблема, когда алгоритмы применяют неправильно. Или другой пример, сейчас пошла мода на нейросети и все давай пихать их во все щели, даже туда, где обычный МНК справится.

                                                                        7. Все любят петь про библиотеки. Так вот хорошие и быстрые библиотеки, которые нас избавят от написания своей реализации умножения матриц, уже стоят денег, ну от 8 до 32 тыщ. долларов за 1 рабочее место. И все равно надо понимать, что и для чего это делается, иначе будет пустая трата денег.

                                                                        8. Ну и последнее. Программирование — это всего лишь часть прикладной математики, не более чем инструмент для реализации тех или иных математических методов решения практических задач. Научить синтаксису языка N можно любую обезьяну, вот только программируют не ради программирования.
                                                                        • 0
                                                                          Можно чуть подробнее про сильно платные библиотеки? Я пользуюсь BLAS/CuBLAS, понимаю, что она не идеальна (как любое ПО), но базовые вещи закрывает уверенно.
                                                                          • 0
                                                                            Тут все упирается в вопрос что Вам нужно.
                                                                            Можно быть стильным, модным молодежным и использоваться халявный Python/NumPy — только вот скорость там будет мягко говоря уровня черепахи.

                                                                            BLAS — сейчас де-факто стандарт API для создания библиотек линейной алгебры. Так что BLAS'ов на самом деле много, тот Intel MKL (который тоже бесплатный) этот BLAS содержит, есть Boost C++, который в себе содержит тот же самый uBLAS, вроде как тоже бесплатный, но вот Intel MKL будет уже быстрее.

                                                                            Основные проблемы начинаются когда:
                                                                            1) Нужно больше функционала чем просто перемножение и вращение матриц, Фурье и т.п., что можно и самому без особого труда написать. Например, работа с гигантскими разряженными матрицами, просто гигантские матрицы, всякие хитрые солверы (например, какую-нибудь хитрую реализацию Нелдера-Мида), там вообще много чего может быть. Например, в Matlab, в Global optimization toolbox для генетических алгоритмов используется запатентованный Mathworks оператор мутации, а результаты с ним заметно лучше. В общем всегда в платных библиотеках функционала куда больше и там есть то, исходники чего Вы никогда не найдете.
                                                                            2) Производительность — Intel MKL это уже хорошо и быстро, но иметь компилятор C/Fortran от Intel — лучше, а это уже денег стоит (там разное лицензирование и уже цены от 4 и до 32 тыщ долларов). В общем реально высокопроизводительные вещи стоят уже денег. Всегда.
                                                                            3) Всякие мелкие тонкости, например, совместимость — ну вот самая распространенная проблема это совместимость по бинарникам. Вставляли недавно одну бесплатную билиотечку, которая реализует L-BFGS, причем с возможность наложения ограничений (вообще BFGS unconstrained алгоритм, но математики не просто так хлеб едят) и еще всякие вкусные солверы (я бы сказал что нетривиальные, я писал проще) и тут начались проблемы с ошибками памяти (причем только под Windows и совсем какие-то рэндомные). Берем исходники, вставляем их в наш проект, немного их правим, компилируем — все работает зашибись, вот только лицензия там GPL… В итоге все сводится к тому, что надо: а) платить, или б) писать самим, а это тоже время-деньги, или в) искать другое решение, которое внезапно оказывается тоже платным.
                                                                            А еще есть всякие штуки типа многопоточности, векторизации и т.д.
                                                                            4) Нужны дополнительные компоненты. Есть вот даже такой термин Business Intelligence(или просто BI) — нужно обрабатывать большие объемы данные, анализировать их и выводить в удобно-читаемом виде. Там Вам будет и математика и кучу интерфейнсых мозголомок. Начинаем писать такие штуки сами — тратим время и соответственно деньги. Начинаем использовать халявные библиотеки — все зашибись пока данных не становится слишком много, даже банальная отрисовка графика (только отрисовка!) начинает вешать всю систему (см. п.2), а ведь эти графики должны быть интерактивными… Естественно есть куча готовых высокопроизводительных компонент, например, BI Dundas, который стоит денег… много денег (на сайте даже цены не указаны, т.к. с каждой компании разработчиков бабло стригут индивидуально)
                                                                            5) Язык программирования. Это отдельная тема. Хорошо быть C/C++ или Fortran программистом. Fortran де-факто язык математического программирования для которого написано десятки тысяч самых разных библиотек, С/С++ тоже неплох и на него оперативно переписывают фортрановские библиотеки. Но вообще и Fortran и C/C++ программисты дорогие, найти их сложно, на C/C++ ее и разработка часто оказывается дороже. Зато каждую обезьяну можно научит писать на Java и C# — таких программистов полно, а вот с библиотеками… гхм, ну вот например .NET до версии 4.5 не поддерживал SIMD, сейчас вроде как начал поддерживать, но как-то не возбуждающе. Выбор библиотек здесь уже куда более куций, библиотеки которые дадут и перфоманс и легкое внедрение — стоят уже деньги, например, ILNumerics или NMath. Можно взять какой-нибудь Accord.NET, но он будет медленный (см. п.2)
                                                                            6) Особенности лицензирования — то что можно быку (творить всякие безобразия), то не позволено Юпитеру, а Цезаря за это так вообще в Сенате закололи. Например, Advanced Simulation Librar — офигенная штука для высокопроизводительных симуляций бесплатная, пока ты ей дома пользуешься для лабораторок каких-нибудь, а вот для коммерческого пользования рано или поздно придется платить. Или, например, ALGLIB (Delphi, C/C++, C# и т.д.) имеет двойную лицензию — можно использовать на халяву, но там не будет ни многопоточности, ни векторизации, ни интеграции с MKL, ни нативных HPC (higth-perfomance computing) — т.е. медленно, а самое главное халява по GPL, либо платите бабки и все это будет и даже исходники дадут (см. п.1,2,3)

                                                                            Т.е. все зависит от потребностей и возможностей. Что бы сразу было все, работало быстро и легко интегрировалось (самые главные качества любой библиотеки) — стоит денег или это белый единорог. За какие-то базовые вещи никто денег брать не будет — понятно что за БПФ никто не заплатит, его итак можно быстро написать. С линейной алгеброй дела будут обстоять еще сложнее — т.к. быстро крутить-верететь матрицами сложно.

                                                                            В любом случае, даже обходясь совсем-совсем готовой библиотекой надо понимать что там внутри происходит. Например, Вы можете найти псевдобратную матрицу с помощью: LU-разложение, разложения Холецкого, QR-разложения, SVD. LU-разложение работает только с невырожденными матрицами, т.е. на практике малоприменимый метод, разложение Холецкого работает только для положительно-определенных матриц и точность оставляет желать лучшего, а QR-разложение в общем-то неустойчивое (для устойчивого нужно использовать модифицированный алгоритм Грама-Шмидта), самым точным и надежным будет SVD-разложение… и самым медленным (а еще оно в своей основе использует QR-разложение). Ну в нахождение псевдообратной матрицы необходимо для получения МНК-решения системы линейных уравнений, а такие задачи встречаются абсолютно везде, фактически любую практическую задачу пытаются свести к МНК.
                                                                            • –1
                                                                              Платное — оно обычно не просто так платное. Если задача, где нужно использовать эту библиотеку, позволит заработать 30-40 тысяч зелени и выше, почему бы и 4-10 не заплатить? А не позволит — то зачем ею вообще заморачиваться? Даже на бесплатных либах? Академический интерес? Ну ок — посчитаете рано или поздно, однопоточно. Странное у всех отношение какое-то к платным инструментам, честное слово. Платные инструменты позволяют экономить время и/или деньги. Иначе бы их просто вообще никто не покупал.
                                                                              • 0
                                                                                Ну на то и расчет. Обычно все упирается в производительность и набор функций, чтоб самим время-деньги сэкономить, иначе может выйти дороже (если вообще выйдет).

                                                                                Для академических целей прайсы кстати очень демократичные, а можно и вообще бесплатно получит. Обычно различают: академические цели, коммерческое использование малыми компаниями, коммерческое использование большими компаниями (вот тут ценник становится просто конским.

                                                                                Но тут правда еще одна проблема может вылезти — купить-то можно, а потом окажется, что там чего-то нет.

                                                                                Ну а если говорить о совсем-совсем ПО для математиков, то это: Matlab, Mathematica, Mapple. Стоят тоже конских денег. Например, бесплатная альтернатива Matlab — это Octave, которая таки несколько медленнее и не имеет (пока еще) всего функционала. Они на самом деле крайне удобны для математического программирования — прежде всего за счет синтаксиса и богатых библиотек для всяких рисовалок, вот только коммерческий продукт на них фиг напишешь — все равно потом придется брать какой-нибудь язык общего назначения и переписывать на нем и вот тут выясняется, что Mathwork требует конских бабок за свои продукты не просто так…

                                                                                Мне иногда кажется, что развитие языков свернуло куда-то не туда…

                                                                                Хотя вот сейчас появилась Julia, которая, если будет развиваться дальше наверное переломит существующую практику.
                                                                              • 0
                                                                                Спасибо, я хотел узнать, когда не хватает бесплатных альтернатив, я узнал, когда не хватает.
                                                                            • 0
                                                                              Программисты никогда не слышавшее про вычислительную геометрию на вопрос определения точки внутри многоугольника, начинают выдавать простыни тормозящего говнокода, а потом еще и удивляются почему алгоритм отрабатывает не все случаи

                                                                              Более вероятно, что программисты загуглят "point in polygon", прочитают википедию, загуглят названия алгоритмов, и выберут подходящую реализацию.


                                                                              Возвращаясь к Гугл нельзя не отметить, что зачастую по теме выдается всякий шлак.

                                                                              А вот для этого нужно умение анализировать информацию и разбираться в предметной области. А не учить все подряд из всех разделов математики.

                                                                              • 0
                                                                                Более вероятно, что программисты загуглят «point in polygon», прочитают википедию, загуглят названия алгоритмов, и выберут подходящую реализацию.

                                                                                Хз, за 10 лет наблюдений обнаружил, что находят только 2 самых простых способа: использование скалярного произведения или райкастинг. И то, и то — школьный уровень, человек и без гугла должен сообразить. Первый работает только для выпуклых многоугольников, для второго надо учитывать граничные случаи.

                                                                                А вот для этого нужно умение анализировать информацию и разбираться в предметной области. А не учить все подряд из всех разделов математики.

                                                                                Вода.
                                                                                • 0

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


                                                                                  человек и без гугла должен сообразить

                                                                                  Зачем мне писать свой кривой велосипед, если можно взять проверенную реализацию, в которой учитываются граничные случаи?


                                                                                  Вода.

                                                                                  Не вода, а подтверждение моей точки зрения, что важнее анализ и проектирование, а не доскональное знание одной предметной области. Если математику будет нужно сделать подключение к БД на C#, а Гугл будет выдавать всякий шлак, как ему математика поможет найти среди него правильное решение?

                                                                                  • +2
                                                                                    Зачем мне писать свой кривой велосипед, если можно взять проверенную реализацию, в которой учитываются граничные случаи?

                                                                                    Я в другом посте привел простой пример — обращение матрицы, это наверное одна самых распространенных операций вообще:
                                                                                    1) Разложение Холецкого — работает только с положительно-определенными симметричными матрицами
                                                                                    2) LU-разложение — работает только с невырожденными матрицами
                                                                                    3) QR-разложение — может работать с разными матрицами, но не все реализации устойчивые (я встречал в стандартных библиотеках разные варианты) и скорость выполнения уже не айс
                                                                                    4) SVD — переваривает все и с высокой точностью, но медленно, очень медленно.
                                                                                    Возьмете стандартную библиотеку, а там будут реализованы все 4 способа, какой выберите если никогда не слышали алгоритмы факторизации матриц? По-умолчанию разработчики либ обычно подсовывают SVD, шоб пользователь не испытал батхерд, когда попытается засунуть любую случайно сгенерированную матрицу.

                                                                                    Что касается определения точки в многоугольнике, то самых разных вариаций решений этой задачи я уже видел десятка 2, а в библиотеке может оказаться несколько реализаций:
                                                                                    а) Для выпуклых многоугольников (это самое простое)
                                                                                    б) Для простых многоугольников
                                                                                    в) Для ортогональных многоугольников (т.к. для них можно написать просто сверхсветовую реализацию)
                                                                                    г) Для многоугольников общего вида и
                                                                                    если можно взять проверенную реализацию, в которой учитываются граничные случаи?

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

                                                                                    Или другой пример, в FarseerPhysics (теперь VelcroPhysics) и Box2D используются 2 разных подхода для бинарных операций над полигонами общего вида, а еще для Convex ecomposition в первом используется и Ear clipping algorithm, и Bayazit algorithm, а в Box2D только Ear clipping algorithm. Какой сами будите использовать, какой другу посоветуйте?..

                                                                                    Святая вера в идеально стандартное решение — это уже какая-то религия походу.

                                                                                    Если математику будет нужно сделать подключение к БД на C#, а Гугл будет выдавать всякий шлак, как ему математика поможет найти среди него правильное решение?

                                                                                    Подключение БД к C# — это рутина, которая итак описана в MSDN и книжках по .NET, туда его гугл и отправит. А вот на основании чего он будет делать выбор в пользу Array, Dictionary, LinkedList, List, Queue, Stack и т.д. вот это уже куда интереснее, погроммисты которые учились на погроммиста в универе и в отличии от меня не забивали на какую-нибудь дискретку и тому подобное, знают эту разницу без привязки к языку. Внезапно это все математика и там начинаются такие вещи как вычислительная сложность вставок, удаления, поиска, получения по индексу и прочие страшные О.

                                                                                    Гугл будет выдавать всякий шлак, как ему математика поможет найти среди него правильное решение?

                                                                                    Если он ище вопрос по математике и алгоритмам, то:
                                                                                    а) Он сможет задавать более уточняющие запросы, т.к. знает что примерно надо найти, так что шлака внезапно станет меньше
                                                                                    б) Он отфильтрует весь шлак и школьный говнокод
                                                                                    в) Некоторые вещи (по которым он специализируется) он и искать не будет по памяти сразу сделает (если память хорошая)
                                                                                    д) В отличии от чувака с улицы он будет в курсе, что полезные вещи не только на Гугле ищутся, а например, на IEEEXplore или ScienceDirect, наверняка кто-то знает еще больше.

                                                                                    Не вода, а подтверждение моей точки зрения, что важнее анализ и проектирование, а не доскональное знание одной предметной области.

                                                                                    Ок, Гугл! Используя только анализ и проектирование, напишите мне программку, которая будет мне синтезировать антенную решетку с максимальным уровнем SSL и с учетом всяких дополнительных ограничений (угол качания луча, ширина луча, нули ДН, динамический диапазон и т.д., в общем сам с помощью гугла догадайтесь). Если кажется что это слишком сложно и оторвано от жизни, то хотя бы напишите программу оптимальной расстановки мебели в хрущовке…
                                                                                    • 0
                                                                                      А вот на основании чего он будет делать выбор в пользу Array, Dictionary, LinkedList, List, Queue, Stack и т.д. вот это уже куда интереснее, погроммисты которые учились на погроммиста в универе и в отличии от меня не забивали на какую-нибудь дискретку и тому подобное, знают эту разницу без привязки к языку.

                                                                                      Я вот в университете на программиста не учился. И "дискретку", что бы это ни было, забивать не мог, ибо у меня ее тоже не было. Это не мешает мне знать, чем отличаются описанные коллекции.

                                                                                      • 0
                                                                                        какой выберите если никогда не слышали алгоритмы факторизации матриц

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


                                                                                        и это может оказаться самая медленная реализация из возможных

                                                                                        Может мне ее будет достаточно?


                                                                                        На основании чего разработчик будет делать выбор, если его знания ограничены первыми 6-ю классами школы?

                                                                                        На основании информации, которую он получил за последние пару часов (или дней) изучения задачи.


                                                                                        Святая вера в идеально стандартное решение

                                                                                        Как из "выберут подходящую реализацию" можно сделать вывод про "идеально стандартное решение"?


                                                                                        Подключение БД к C# — это рутина, которая итак описана в MSDN и книжках по .NET, туда его гугл и отправит.

                                                                                        Там так-то тоже разные способы есть. Библиотеки, фреймворки.


                                                                                        Если он ищет вопрос по математике и алгоритмам, то

                                                                                        Так он ищет про организацию работы с БД.


                                                                                        Используя только анализ и проектирование, напишите мне программку, которая будет мне синтезировать антенную решетку

                                                                                        "Извините, я не специалист в этой области. Обратитесь, пожалуйста, к другому специалисту". Поэтому мне понадобится много времени на анализ именно этой области. Если согласны оплатить это время, пожалуйста.
                                                                                        Задачами на проектирование я с вами меряться не буду, потому что они требуют подробного описания.

                                                                                • +1
                                                                                  Программисты никогда не слышавшее про вычислительную геометрию на вопрос определения точки внутри многоугольника, начинают выдавать простыни тормозящего говнокода, а потом еще и удивляются почему алгоритм отрабатывает не все случаи

                                                                                  О! Как раз наша тема, в том числе. У нас в компании работает программист, который как раз отлично знает нужные нам части математики. Собственно — для этого и брали.
                                                                                  Его реализация алгоритма была страницы две кода, недели 1.5-2 по времени. Работала, правда, безупречно. Моя же, нагугленная за час, реализация была такой:

                                                                                  function DotInPolygon(X, Y: integer; const Polygon: TPointDynArray): boolean;
                                                                                  var
                                                                                   i, j: integer;
                                                                                  begin
                                                                                   Result := False;
                                                                                   j := 0;
                                                                                   i := Length(Polygon) - 1;
                                                                                   while i >= 0 do
                                                                                   begin
                                                                                    if not ((Polygon[i].X < X) xor (X <= Polygon[j].X)) then
                                                                                     if Y - Polygon[i].Y < (X - Polygon[i].X) * (Polygon[j].Y - Polygon[i].Y) / (Polygon[j].X - Polygon[i].X) then
                                                                                      Result := not Result;
                                                                                    j := i;
                                                                                    Dec(i);
                                                                                   end;
                                                                                  end;
                                                                                  

                                                                                  Он очень удивлялся такой реализации :) Впрочем — польза от его алгоритма тоже была — погоняли на множестве тестов и убедились что оба алгоритма работают совершенно одинаково. Знание математики при незнании алгоритмов и неумении пользоваться гуглом иногда может помешать разработке.

                                                                                  Так вот хорошие и быстрые библиотеки, которые нас избавят от написания своей реализации умножения матриц, уже стоят денег, ну от 8 до 32 тыщ. долларов за 1 рабочее место.

                                                                                  Ссылки бы было интересно увидеть на либы и цены.
                                                                                  • –1
                                                                                    Моя же, нагугленная за час, реализация была такой

                                                                                    Crossing number algorithm, Франклин (вроде даже еще живой), думаю это года 70-80, вытекает напрямую из теоремы Жордана (XIX век). Такой сейчас любой школьник на Паскале напишет и без гугла даже (внезапно). Ничего особенного.

                                                                                    Гуглите дальше, пока не нагуглите без операции деления (я даже подсказку дал).

                                                                                    погоняли на множестве тестов

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

                                                                                    Ссылки бы было интересно увидеть на либы и цены.

                                                                                    Вы же вроде бы гугл-гуру? Разве нет?
                                                                                    Пожалуйста
                                                                                    тыц
                                                                                    Можете потыкать на этой страничке, чтоб посмотреть как меняется цена не забудте еще добавить НДС (18%) и не забываем что ценовая политика зависит от того, кто покупает. Дистрибьютер кстати тоже маржу иметь хочет. Кстати это без Rogue Wave IMSL, на это придется отдельно раскошелится (благо стоит не дрого), а есть еще и другие аддоны.
                                                                                    тыц
                                                                                    тыц
                                                                                    тыц
                                                                                    тыц
                                                                                    • +1
                                                                                      Работать будет только для простых многоугольников

                                                                                      Ну так может там в задаче только простые многоугольники и есть?

                                                                                      • +1
                                                                                        Может и есть, но об этом ничего не сказали, значит тут 2 случая:
                                                                                        1) Многоугольники общего вида — феил, т.к. задач не решена
                                                                                        2) Чувак просто не понимает возможную сложность и объемы задачи — феил, т.к. люди просто не разобрались в задачи и когда наступит час Х все будут ломать голову над тем, почему все не работает

                                                                                        Плюс пункт 3): там нехорошая операция деления (она вообще-то не такая уж и тривиальная с точки зрения машины), а это уже погрешность вычислений. Так что на простых многоугольниках этот алгоритм тоже может ВНЕЗАПНО зафейлиться — иногда это не критично, иногда нет… хотя есть аналогичные алгоритмы без деления

                                                                                        Соответственно добавим еще и пункт 4) нет никакого обоснования почему решили именно так, а не иначе. Алгоритмов то полно, каждый из них имеет свои достоинства и недостатки — и именно этим надо оперировать, а не:
                                                                                        нагугленная за час

                                                                                        погоняли на множестве тестов


                                                                                        Ну и все это еще приправлено целочисленными аргументами (откуда? зачем? почему?). В общем либо совсем что-то узкоспециализированное, либо очередной говнокод, который потом будет обрастать костылями и в итоге все придет к:
                                                                                        Его реализация алгоритма была страницы две кода, недели 1.5-2 по времени.

                                                                                        Меня всегда такая святая простота умиляла.

                                                                                        Ну и хвалиться что нагуглил такой алгоритм несколько странно: я такую же фигню писал в школе на Паскале, а тогда гуглов не было, а интернет был через соседа по dialup модему. Современные школьники на олимпиадах тоже его вспоминают, студенты у которых были хоть какие-то азы вычислительной геометрии напишут сходу — он простой и элегантный, но уровнем не сильно круче использования скалярного произведения и гуглить тут будет только человек который вообще никогда не слышал про вычислительную и компьютерную геометрию — в этом ничего зазорного нет, но не хвалиться же этим…
                                                                                        • 0
                                                                                          Ну и все это еще приправлено целочисленными аргументами (откуда? зачем? почему?). В общем либо совсем что-то узкоспециализированное, либо очередной говнокод, который потом будет обрастать костылями и в итоге все придет к:

                                                                                          Это часть векторного движка. Координаты точки на экране целочисленные.

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


                                                                                          Я в курсе :) В своё время процессора паяли на макетках ещё )

                                                                                          Ну и хвалиться что нагуглил такой алгоритм несколько странно: я такую же фигню писал в школе на Паскале, а тогда гуглов не было, а интернет был через соседа по dialup модему.

                                                                                          Честь и хвала. У меня несколько иные были интересы (больше ассемблер + разное железо). И, как видим, этот алгоритм даже в вузах не дают.
                                                                                          • 0
                                                                                            Честь и хвала. У меня несколько иные были интересы (больше ассемблер + разное железо). И, как видим, этот алгоритм даже в вузах не дают.

                                                                                            Хз, у меня на 2 или 3 курсе его давали, причем на физфаке. Школьники-олимпиадники тоже его знают — в олимпиады любят такие задачки вставлять. Просто не все помнят, а кто-то может пробухал лекцию. Я вот, например, пробухал алгоритм Каргера как недавно выяснилось (спустя кучу лет). Просто подготовка у нас в стране очень-очень неравномерная. Но вообще компьютерная геометрия — это отдельная и очень большая часть математики на котрую по идее должны натаскивать только на определенных специальностях, ну вот, например, на кафедре автоматизации систем вычислительных комплексов ВМК МГУ, а вот чуваки с какой-нибудь механики мехмата МГУ вряд ли будут в курсе что там и как, зато им можно нейросети давать.

                                                                                            Т.е. специализация. Она у всех разная:
                                                                                            У меня несколько иные были интересы (больше ассемблер + разное железо)

                                                                                            Ну я вот как раз от этого и отошел в сторону программ где не надо соображать, как уложиться в 512 байт RAM (некоторый линейки MSP430 нас радают просто гигантскими размерами RAM и ROM)
                                                                                      • 0
                                                                                        Crossing number algorithm, Франклин (вроде даже еще живой), думаю это года 70-80, вытекает напрямую из теоремы Жордана (XIX век). Такой сейчас любой школьник на Паскале напишет и без гугла даже (внезапно). Ничего особенного.

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

                                                                                        Плохо гоняли. Вы заставили меня усомниться в эффективности Ваших тестов


                                                                                        Я в курсе про ограничения. Формула хорошо работает на любых многоугольниках, кроме тех, у которых есть пересечения граней. И знаю причину — что непонятно, какую часть многоугольника считать внутренней, а какую — нет. Есть дополнительная проверка на пересечения. За ссылки спасибо — посмотрю.
                                                                                        • 0
                                                                                          Так я и не говорю, что тут — какой-то космос. Но вот — человек впервые алгоритм такой видел. Хотя в математике разбирается очень хорошо.

                                                                                          Все упирается в специлаизацию. Если человек никогда не слышал про компьютерную геометрию — первое что ему придет в голову, считать через скалярное произведение, работать правда будет только если многоугольник выпуклый (convex), то и фиг с этим, да и вообще лучше стараться сводить все задачи к выпуклым если можно — с ними жить проще :-)
                                                                                          Если погуглить дальше то можно будет найти метод трассировки лучей/метод пересечений, вот как раз у Вас из этой серии пример кода, а есть еще другой подход — на количество оборотов причем потенциально эта идея может работать вообще с фигурами, которые описаны гладкими кривыми.

                                                                                          За ссылки спасибо — посмотрю.

                                                                                          Могу и еще накидать. Все на самом деле зависит от целей и задач. Вот где-то рядом чувак отписывался, что ему хватает BLAS/uBLAS, соответственно — это MKL или C++ boost они бесплатные и достаточно быстрые (MKL ИМХО быстрее, но он на самом деле условно бесплатный). Есть еще ROOT, но я им никогда не пользовался.

                                                                                          А вот иногда бывают другие ситуации:
                                                                                          1) Разработчик/заказчик хочет чего-то странного. Обычно это всякие высокоуровневые вещи и хитрые солверы. Ну т.е. одно дело просто матрицы перемножить, другое дело нужно что-то посложнее (ну я хз, например какое-нибудь квадратичное программирование) и что бы не изобретать велосипед и не тратить время проще купить.
                                                                                          2) Нужна супер-пупер производительность. Люди наигрались с Python/NumPy и внезапно узнают, что на других ЯП и с другими библиотеками эти же задачи решаются в 20 раз быстрее (таки реальный замер).
                                                                                          3) Нужны всякие свистелки и перделки. Ну банально без графиков никуда.
                                                                                          4) Внезапно выясняется, что кругом одни Жаба и ДотНет кодеры и никто не хочет писать на С/С++, а уж про Fortran так вообще в РФ забыли (за бугром таки нет, практически вся запрограммированная математика идет от Фортрана). Можно найти халявную библиотеку, но платная библиотека будет лучше. А так был случай когда наткнулись на C#-враппер над C/C++ библиотекой, которая в итоге сама оказалась враппером над библиотекой, написанной на Фортране. При этом исходная фортрановская библиотека была под MIT (таки общенародной достояние), а С-враппер уже под GPL 0_0
                                                                                          5) Людям нужна среда разработки а еще лучше — быстрый компилятор, а еще лучше что бы было все и сразу

                                                                                          Но вообще все же лучше по возможности писать самому: во-первых, слишком много тонкостей по применению и использованию, во-вторых, иногда бывают такие ситуацию, когда единственный доступный гугл — это книжка за много денег
                                                                                          • 0
                                                                                            Спасибо. Раз вы такой ссылкообильный в математическом программировании :) Может есть ссылки на еще один довольно частный алгоритм. Пока найти не можем, но нужен. Опять же векторный движок. Задача стоит провести некую гладкую линию (сплайн), проходящую через заданные точки. Из инструментов есть только кривые Безье. Думаю, известно, что они не проходят через 'опорные' точки. Стоит задача пересчитать исходные точки в 'опорные' Безье. Может кто-то что-то такое видел?
                                                                                            • +1
                                                                                              Гы. Вот буквально несколько лет назад такую задачу решал. Да и сейчас маячит.
                                                                                              Я так предполагаю шо сплайн кубический (с квадратичным вроде как достаточно просто должен быть), т.е.
                                                                                              p(t)= (1-t)*(1-t)*(1-t)*x0
                                                                                              +3*t*(1-t)*(1-t)*x1
                                                                                              +3*t*t*(1-t)*x2
                                                                                              +t*t*t*x3;
                                                                                              т.к. контрольные точки x0 и x3 у нас вообще-то известные — они же a и d, а вот x1 и x2 уже будут хз. t = t0, t1, t2, t3, 0<t<1. Зато нам будут известны 2 другие точки, пусть b и c.
                                                                                              b = (1-t1) * (1-t1) * (1-t1) * x0 + 3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2 + t1 * t1 * t1 * x3
                                                                                              c = (1-t2) * (1-t2) * (1-t2) * x0 + 3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2 + t2 * t2 * t2 * x3

                                                                                              Ну (1-t1) * (1-t1) * (1-t1) * x0 + t1 * t1 * t1 * x3 и (1-t2) * (1-t2) * (1-t2) * x0 + t2 * t2 * t2 * x3 нам известны, так что можно это представить вот так
                                                                                              3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2 = b — (1-t1) * (1-t1) * (1-t1) * x0 — t1 * t1 * t1 * x3

                                                                                              3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2 = c —
                                                                                              (1-t2) * (1-t2) * (1-t2) * x0 — t2 * t2 * t2 * x3

                                                                                              Получаем систему линейных уравнений.

                                                                                              Обзовем правую часть как вектор-столбец Y = [y1,y2], т.е.
                                                                                              y1 = b — (1-t1) * (1-t1) * (1-t1) * x0 — t1 * t1 * t1 * x3
                                                                                              y2 = c — (1-t2) * (1-t2) * (1-t2) * x0 — t2 * t2 * t2 * x3
                                                                                              мы её можем однозначно вычислить.
                                                                                              Это с одной стороны, а вот с другой стороны
                                                                                              y1 = 3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2
                                                                                              y2 = 3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2

                                                                                              Назовем (для компактности) неизвестные переменные как вектор-столбец X = [x1, x2], мы их не знаем. Получится:
                                                                                              A*X=Y
                                                                                              Где A — это матрица
                                                                                              [ 3 * (1-t1) * (1-t1) * t1, 3 * (1-t1) * t1 * t1;
                                                                                              3 * (1-t2) * (1-t2) * t2, 3 * (1-t2) * t2 * t2]
                                                                                              Она тоже одназночно вычислима, соответственно получается, решая эту СЛАУ в матричном виде:
                                                                                              X = inv(A) * Y
                                                                                              inv — это инверсия матрицы.
                                                                                              Почему такие сложности? Та хрен его знает — формально так положено, красиво и компактно выглядит… ну еще потому что получается, что в матрице А торчат полиномы Берштейна и задача по поиску контрольных точек в итоге сводится к решению системы линейных уравнений. Собственно каждая точка