Ответы пользователя по тегу Математика
  • Сколько нужно завести друзей в Facebook, чтобы с вероятностью близкой к 100% каждый день в году поздравлять с днем рождения хотя бы одного друга?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Это почти "Парадокс дней рождения". Каждому другу соответствует число от 0 до 365. Таким образом, N друзей порождают число в системе счисления по основанию 366. Нужно комбинаторно вычислить количество таких чисел M, в которых содержатся все различные цифры, для каждого N. Отношение M/(366^N) и будет вашей вероятностью.

    Очевидно, что нужно рассматривать N>=366

    М - число всевозможных расстановок 366 цифр по N местам, свободные места можно заполнить любыми цифрами. Для N=366 это 366!, что дает вероятность 10^-158 степени.

    С увеличением N, формула для числа M усложнится, это будет M=(366!)*(биномиальный коэффициент из 366 по N-366).
    Считайте.
    Ответ написан
    Комментировать
  • Как определить кривизну линии?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Посчитать коэффициент корелляции Пирсена между X и У этой линии. Чем ближе его модуль к 1, тем больше это похоже на прямую.
    Ответ написан
  • Аналитическое выражение асимметричной функции?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Вы ее зеркально отобразить желаете? Тогда это будет F(-x).
    Вы хотите формулу от графика на вашем рисунке?

    Расскажите всю задачу - экстрасенсы уже берут в евро, хрустальный шар поломался, libastral.so не собирается.
    Ответ написан
  • Как из математика адаптироваться-переквалифицироваться в программиста?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Можно начать с написания своих реализаций классических численных методов.

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

    Ремеслу программиста можно научится только на практике.

    Математику будет приятно использовать функциональные языки вроде LISP и Haskell, но на рынке они нынче мало востребованы.

    Итого, нужно ответить на вопрос - в какую область программирования лезть?
    Ответ написан
    Комментировать
  • Правильно ли я нашел КНФ и СКНФ?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Вот вам онлайн-сервис, проверяйте.
    Ответ написан
    3 комментария
  • Какого максимального размера должны быть квадраты, чтобы ровно впихнуть их в прямоугольник c известными сторонами?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Наибольший общий делитель длин сторон прямоугольника. Искать алгоритмом Евклида. Это будет сторона. А площадь найдется возведением в квадрат.
    Ответ написан
    2 комментария
  • Какие разделы математики актуальны в сфере нейронных сетей и ИИ?

    gbg
    @gbg
    Любые ответы на любые вопросы
    • Линейная алгебра - основа основ, без нее никаких численных дел не будет
    • Теория операторов - и без нее тоже. Нужно уметь оценивать операторы.
    • Теория меры и интеграла Лебега - и измерать множества тоже нужно уметь
    • Функциональный анализ - и работать с абстрактными операторами тоже
    • Высшая алгебра - без нее к операторам лезть можно, но лучше выучить
    • Гармонический анализ - без него в машинное зрение лезть смысла нет. Всякие операторы, свертки, ядра - это все туда
    • ТФКП - аналогично
    • Уравнения математической физики - без понимания того, как работает свет в этом мире анализировать что-либо смысла нет.
    • Теория интерполяции - как превратить результаты измерений в формулы
    • Численные методы - основа основ.


    В профессиональной деятельности математика нет деления на разделы. Математика используется вся. Куском.

    Учитесь лучше.
    Ответ написан
    5 комментариев
  • Как прогнозировать промежуточный прогресс для пошаговой задачи?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Время взять с дополнительным запасом, а прогресс пусть подбирается к следующему рубежу не с линейной скоростью, а с определенными пульсациями этой скорости.

    А чтобы угадывать, нужно иметь статистику, и чем она обширнее, тем точнее будет угадывание.
    Ответ написан
  • Какую мат основу нужно иметь что бы спокойно читать Кнута?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Вот что пишет об этом сам Д. Кнут:
    Эта книга написана для читателей самых разных степеней математической подготовки и иску-
    шенности, поэтому некоторые упражнения предназначены только для читателей с математическим
    уклоном. Если в каком-либо упражнении математические понятия или результаты используются
    более широко, чем это необходимо для тех, кого в первую очередь интересует программирование ал-
    горитмов, то перед оценкой такого упражнения ставится буква ”М”. Если для решения упражнения
    требуется знание высшей математики в большем объеме, чем это дано в настоящей книге, то ста-
    вятся буквы ”ВМ”. Пометка ”ВМ” отнюдь не является свидетельством того, что данное упражнение
    трудное


    Чтобы мягко начать, рекомендую стартовать с его же "Конкретной математики", а уже потом браться за "Искусство программирования". Это позволит подтянуть дела дискретные, вроде комбинаторики.
    Ответ написан
    Комментировать
  • Как определить, принадлежит ли точка ромбу?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Нужно четыре раза проверить, что точка лежит по одну сторону от прямой, содержащей сторону ромба:
    vecmul.svg?dl=0
    Знак Q определяет, с какой стороны от прямой AB лежит точка T.

    Остается проверить это для всех сторон ромба AB, BC, CD, DA, если знак везде одинаков - точка в ромбе.
    Ответ написан
  • Как происходят итерации квадрирования в методе Лобачевского?

    gbg
    @gbg
    Любые ответы на любые вопросы
    //Младший коэффициент возводится в квадрат
            coeff[l][0]=coeff[1-l][0]*coeff[1-l][0];
    //Старший коэффициент возводится в квадрат
            coeff[l][prox->power()]=coeff[1-l][prox->power()]*coeff[1-l][prox->power()];
    //для всех коэффициентов, кроме старшего и младшего
            for(idx i=1;i<prox->power();i++)
            {
                const idx d=std::min(prox->power()-i,i);
    //коэффициент с индексом i возводится в квадрат
                coeff[l][i]=coeff[1-l][i]*coeff[1-l][i];
    //и домножается на дополнительный набор коэффициентов
                for(idx j=1;j<=d;j++)
                {
                    idx k=(((1+j)%2)*2-1)<<1;
                    coeff[l][i]+=k*coeff[1-l][i-j]*coeff[1-l][i+j];
                }
            }


    Вот это ругательство:
    idx k=(((1+j)%2)*2-1)<<1;

    Равно 2 на четных j и -2 на нечетных.

    Математические подробности тут на странице 31.

    Допишите в исходник печать массива coeff после шага квадрирования, тогда вы увидите, что получается.
    Ответ написан
    Комментировать
  • Где почитать про метод Лобачевского?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Я тоже когда-то брал материал из того же Демидовича.
    Идея метода состоит в том, чтобы повторными преобразованиями получать многочлен, корнями которого будут квадраты корней многочлена, с которого процесс начали.

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

    Моя реализация на гитхабе. Работает только с вещественными коэффициентами и корнями!
    Полином задается классом, произведенным от PolyCoeffProxy:
    class PolyCoeffProxy
    {
    public:
        PolyCoeffProxy();
        virtual mpf_class getCoeff(int idx)=0;
        virtual int power()=0;
        void print();
    };


    Нужно дать реализацию двум методам - getCoeff(int idx) должен возвращать коэффициенты (нумерация с 0 по степеням x)
    power() должен возвращать степень:
    mpf_class SamplePoly::getCoeff(int idx)
    {
        static const mpf_class coeff[]={12,-8,1};
        return(coeff[idx]);
    }
    
    int SamplePoly::power()
    {
        return(2);
    }


    Тогда решатель используется так:
    int main()
    {
        SamplePoly sample;
        Point* ret=LobachevskySolver::solve(&sample,1e-10,100);
        ret->print();
        delete ret;
        return 0;
    }

    Здесь 1e-10 - отклонение корней от предыдущей итерации при квадрировании (меньше-точнее), 100 - максимальное количество итераций.

    Сам решатель:
    Point* LobachevskySolver::solve(PolyCoeffProxy *prox,double meps,int nmaxiter)
    {
        Point* ret=new Point(prox->power());
        rational* coeff[2];
        rational roots[prox->power()];
        for(idx i=0;i<2;i++)
        {
            coeff[i]=new rational[prox->power()+1];
        }
        for(idx i=0;i<prox->power();i++)
        {
            roots[i]=2;
        }
        for(idx i=0;i<=prox->power();i++)
        {
            coeff[0][i]=prox->getCoeff(i);
        }
        idx l=1;
        idx m=0;
        for(;m<nmaxiter;m++)
        {
            coeff[l][0]=coeff[1-l][0]*coeff[1-l][0];
            coeff[l][prox->power()]=coeff[1-l][prox->power()]*coeff[1-l][prox->power()];
            for(idx i=1;i<prox->power();i++)
            {
                const idx d=std::min(prox->power()-i,i);
                coeff[l][i]=coeff[1-l][i]*coeff[1-l][i];
                for(idx j=1;j<=d;j++)
                {
    
                    idx k=(((1+j)%2)*2-1)<<1;
                    coeff[l][i]+=k*coeff[1-l][i-j]*coeff[1-l][i+j];
                }
            }
            mpf_class eps=0;
            for(idx i=0;i<prox->power();i++)
            {
                const mpf_class znam=coeff[l][prox->power()-i];
                mpf_class tmp=coeff[l][prox->power()-1-i]/znam;
                tmp=abs(tmp);
    
                for(idx j=0;j<=m;j++)
                {
                    tmp=sqrt(tmp);
                }
                const mpf_class ceps=abs(tmp-roots[i]);
                eps=std::max(eps,ceps);
                roots[i]=tmp;
            }
    //        printf("%10.8lf\n",eps.get_d());
            if(eps<meps)
            {
                break;
            }
            l=1-l;
        }
        for(int i=0;i<prox->power();i++)
        {
            ret->coord[i]=roots[i].get_d();
        }
        for(int i=0;i<2;i++)
        {
            delete[] coeff[i];
        }
    
        return(ret);
    }


    Программа выдает 6 и 2, если дать многочлен Maxima:
    float(solve(x^2-8*x+12,x));
    она тоже дает 6 и 2.
    Ответ написан
    Комментировать