Ответы пользователя по тегу Математика
  • Как работает этот рекурсивный алгоритм разложения на слагаемые?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Функция генерирует все разбиения числа n на слагаемые не больше maxx. Ддя этого ыункуия перебирает, а какое же максимальное число будет в разбиении (цикл по i), берет это число и рекурсивно разбивает оставшуюся часть. Обратите внимание, в качестве maxx в рекурсии передается i. Ведь именно это было максимальное число в перебираемом разбиении. Значит следующее не может его превышать.

    Вся эта сложность с максимальным числом сделана, что бы не перебирать перестановки слагаемых. Ведь 4=1+2+1 можно по идее получить тремя способами, меняя порядок. Генерируя слагаемые в не возрастающем прядке, мы избавляемся от таких дубликатов.
    Ответ написан
    Комментировать
  • Как найти площадь квадрата, имея 2 отрезка?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Отлично, в комментариях уточнили задачу - надо описать вокруг двух заданных прямоугольников квадрат минимальной площади. Прямоугольники не пересекаются и не касаются и параллельны осям координат.

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

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

    Если же это не сработает и квадрат можно вращать, то тут все сложно. Путем очень хитрых геометрических рассуждений можно доказать, что квадрат в оптимальном случае, все-таки, будет параллелен осям координат и просто написать решение выше. Ну, или, если не верите, то можно ввести угол поворота как переменную, написать функцию, котороя поворачивает все точки на данный угол, а потом ищет (по алгоритму в начале) площадь описанного параллельного осям квадрата, и потом запустить тернарный поиск минимума по этой функции.
    Ответ написан
    2 комментария
  • Почему последний множитель в формуле числа размещений = (n-k+1)?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Потому что оно есть n! / (n-k)! Вот n-k и в числителе и в знаменателе сокращается. А вот n-k+1 в числителе остается, потому что сокращатся ему не с чем.
    Ответ написан
    Комментировать
  • Формула вращающегося прямоугольника как?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Ну это же школьная геометрия. (L-W)/sqrt(2), если длинная сторона L, а короткая W.

    Там равносторонний прямоугольный треугольник с длиной (L-W)/2 (вычли пересечение из длины, осталось 2 одинаковых куска, поделили пополам - нашли искомый кусок. А дальше - теорема Пифагора.
    Ответ написан
  • Как в данной системе из линейных уравнений получился x и y?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Это если решить систему любым методом, то вы получите вот такое вот решение. Неважно, как решать - решение же однозначное и выражается через коэффициенты (может чуть в другой форме, но после упращения и приведения к общему знаменателю вы все-равно именно эту формулу и получите).

    Можно из одного уравнения выразить y через x, подставить в другое, найти x, потом найти y.

    Или можно получить эти формулы в одно действие методом Крамера.
    Ответ написан
    5 комментариев
  • Доказательство простого факта. Математический анализ, равномерная непрерывность. Как?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Я так понял в условии на самом деле говрится, что для любого достаточно маленького z (0 < z < Z0) функциональный ряд равномерно сходится на (a+z, b-z)

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

    Пусть есть a<x0<b. Возьмем z = min(Z0, (x0-a)/2, (b-x0)/2). Используем данное, что ряд равномерно сходится на отрезке (a+z,b-z), а значит F на этом отрезке непрерывна. Значит F непрерывна в точке x0 (ведь мы так z подобрали, чтобы x0 в этом интервале лежала). Мы взяли любую точку x0 из (a,b), а значит F непрерывна на всем интервале.

    Edit: Если же в условии тупо дана равномерная сохдимость на каком-то интервале (c,d) (a < c < d < b), а не для сколь угодно близкого к (a,b) вложенного интервала, то, очевидно, что непрерывности там никакой и нет.
    Ответ написан
    Комментировать
  • Как задать плотность вероятностей перехода λij системы из состояния Si в Sj?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Ну... Это какие-то числа, которые вам надо придумать и задать. Руководствуясь какими-то методами тыканья пальцем в небо, пытаясь обосновать их физически.

    Допустим, телефон, когда он сядет, где-то за пару часов в среднем втыкают в разетку. Значит плотность перехода из S4 в S2 должна быть такой, чтобы среднее время до совершения осбытия было где-то пару часов. Процесс, видимо пуассоновский, раз у вас такие формулы, значит время до перехода будет распределенно показательно, значит среднее время равно 1/лямбда. Остюда лямбда = 1/<среднее время перехода>, или 1/2.

    Заряжается телефон где-то за 3 часа - значит переход между разряжен->выключен происходят с интенсивностью 1/3.

    Остальные числа выдумайте сами. Можно на основании собственной статистики.
    Ответ написан
    2 комментария
  • Как найти число через проценты, по заданным условиям?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Раз вам надо такое целое, чтобы при домножении на все проценты получалось целое, то вам надо получить знаменатели всех дробей после сокращения и взять их наименьшее общее кратное. Это и будет ответ. При домножении на все дроби знаменатель сократится и останется только целое число.

    В примере:

    60/100 = 3/5
    30/100 = 3/10
    10/100 = 1/10

    Знаменатели 5,10 и 10. НОК(5, 10, 10) = 10.

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

    Пусть n2 равно 1, если есть число в процентах, не делящееся на 2, и равно 0 - иначе.
    n4 - тоже для 4, n5, n25 - тоже для 5 и 25.

    Тогда ответ 2^(n2+n4)*5^(n5+n25).

    В примере есть число не делящееся на 4 (10 и 30), поэтому n4=1. Все четные - поэтому n2=0.
    n5 = 0, потому что все делится на 5. n25=1 - все не делится на 25. Поэтому ответ 2^(0+1)*5^(0+1) = 2*5=10

    edit:

    Вы обновили вопрос - проценты у вас могут быть нецелые. Например 3.71%

    Тогда забейте на 2 и 5 - проще через НОК считать. Опять же сократите дроби и возьмите знаменатели:
    3.71% = 371/10000
    3.72% = 372/10000 = 186/5000 = 93/2500
    и т.д.
    Ответ написан
  • Как найти следующий корень уравнения, используя метод простых итераций?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Никак в общем случае. Вы даже не можете же знать, что текущий корень был последним.

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

    Но даже если вы начальную точку выберите в нужном отрезке, вам может не повезти и при поиске корня вы перепрыгните на соседний отрезок. Действительно работающий метод, что бы найти все корни - бинарный поиск.
    Ответ написан
    Комментировать
  • Как составить функцию, которая отдала бы вероятность в зависимости от текущего времени?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Соберите вашу функцию из квдаратичных или кубических сплайнов.

    Когда подберете параметры, функция будет вычислятся кусочно. Сначала найдите к какому отрезку относится текущее время (или тупо циклом или набором if-else, или, если сделаете отрезки одинаковым количеством часов, то можно поделить время на длину отрезка и округлить вниз, чтобы получить номер отрезка). Потом вычислите значение нужного сплайна, что будет просто вычислением полинома второй или третьей степени.

    Ну, или можете просто задать нексолько ключевых значений, и проинтерполировать полиномом лагранжа. Правда тут сложно будет заставить его идти именно как вам хочется. Через точки-то он точно пройдет, но вот между ними может иметь какие-то левые пики и изгибы. Так что придется поэксперементировать. Можно поиграться, например, в wolframalpha.com (введите "interpolating polynomial calculator", потом задайте значения функции в точках и получите и график и формулу. Ссылку дать не могу, qna ссылки на wolfram банит за одно со спамерскими ссылками по ошибке).
    Ответ написан
    Комментировать
  • Как найти сумму N векторов, взятых по одному из N множеств векторов, ближайшую к заданному вектору?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Вообще - это очень сложная задача. Даже в одномерном случае это получается что-то типа задачи размена монет. И главная проблема, что целевая функция - не линейная. Там или модули или квадраты вылезают в любом случае.

    Поэтому симплекc метод тут никак не поможет. Это задача квадратичного программирования, в лучшем случае.

    Тут или полный перебор, или какой-нибудь метод отжига придется делать. В одномерном случае при небольших числах можно какое-нибудь динамическое программирование использовать, но это вряд ли ваш случай.
    Ответ написан
    Комментировать
  • Как сгенеририовать СЛАУ (система линейных алгебраических уравнений) больших размеров?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Просто сгенерируйте случайную матрицу. Двумя циклами получайте коэффициенты через генератор случайных чисел. Вероятность, что она будет вырождена ничтожна. Потом сгенерируйте сулчайные значения всех переменных, подставьте в уравнения с имеющимеся теперь у вас коэффициентами и получите так правую часть уравнений. Вот и ваша СЛАУ с решением. Если хотите, чтобы решения не было, то можно случайно поменять правую часть в каких-то уравнениях. Если хотите, чтобы система была вырожденной, то замените какие-то строки случайной линейной комбинацией других строк (случайно получив коэффициенты линейной комбинации).

    В C++ есть генератор случайных чисел - функция rand(). Гуглите ее, она вернет случайное целое число. Если вам нужны вещественные и возможно отрицательные коэффициенты, то эти целые числа можно использовать для получения вещественных. Гуглите "C++ случайное вещественное число".
    Ответ написан
  • Сколькими ходами кубик Рубика возвращается в изначальное положение?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Мне кажется, формулу тут фиг выведешь и надо на компьютере эмулировать действия в цикле, пока оно назад не вернется. В группах могут быть очень сложные структуры и формулы какой-то может и не быть.
    Ответ написан
    1 комментарий
  • Как проверить n-количество или они образуют последовательность Фибоначчи?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Проверьте, что первый элемент равен 0.
    Проверьте, что второй элемент равен 1.
    В цикле с третьего по последний элемент проверьте, что каждый элемент равен сумме двух предыдущих.

    Если какая-то проверка где-то не сошлась - надо вывести нет. Иначе, надо вывести да.

    Удобно это делать в виде функции возвращающей булевое значение. Тогда в конце ее пишите return true. А внутри каждая проверка возвращает false, если она провалилась.
    Ответ написан
    Комментировать
  • Как найти общую формулу?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    По идее надо бы задать формулу кусочно для разных n, но можно все собрать в одну формулу как-то так:
    (2-n)(3-n)/2*f1(n) + (n-1)(3-n)*f2(n) + (n-1)(n-2)/2*f3(n)


    Далее f1(n) = b-a+1

    Для нахождения f2 и f3 можно сдвинуть левую границу вправо до первого числа нужной четности, а правую границу - влево. Потом уже зная, что 2 крайних числа в промежутке между a' и b' берутся, то фромула будет (b'-a')/2+1.

    Для такого сдвига надо будет смотреть на четность a и b и четность n.

    В итоге:
    f2(n) = ((b-b%2)-(a+a%2))/2+1
    f3(n) = ((b-1+b%2)-(a+1-a%2))/2+1

    Можно f2 и f3 объединить используя n%2 и операцию xor: если четность a или b не такая же как у n, то надо границу сдвигать (вычесть/прибваить 1). Иначе надо вычесть/прибавить 0. xor как раз равен 1 при неравнестве и 0 при совпадении четностей.

    f23(n) = ((a+(a%2 ^ n%2))-(b-(b%2)^(n%2)))/2+1

    Итоговая формула:
    (2-n)(3-n)/2*(b-a+1) + ((n-1)(3-n) + (n-1)(n-2)/2)*(((a+(a%2 ^ n%2))-(b-(b%2)^(n%2)))/2+1)


    А еще, если пользоваться битовыми функциями, то можно вместо (n-1)(3-n) + (n-1)(n-2)/2 использовать (n & 2)/2, в вместо первой скобки (1 - (n & 2)/2)

    Формула правильно возвращает 0, если чисел в промежутке нет. Правда, она не работает, если a > b.
    Ответ написан
    Комментировать
  • Как запрограммировать построение мультипликативной группы по неприводимому многочлену?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Научитесь выполнять операции в группе. Перемножение полиномов происходит как обычно, двумя циклами, но надо потом взять по модулю многочлена, образующего группу. Тут надо будет реализовать деление столбиком.

    А дальше, чтобы найти мультипликативную группу, придется делать полный перебор. Перебирайте все полиномы (они у вас, видимо, над полем по модулю 2, их 2^n. Можно их перебирать как биты у целого числа). Потом умножайте на текущий полином в цикле, помечая в массиве уже полученные ранее полиномы. Если получили все 2^n элементов - вы нашли нужную группу. Если наткнулись на уже ранее полученный полином раньше времени - текущий кандидат не подходит.
    Ответ написан
    Комментировать
  • Как решить задачу о распределении?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Если есть какой-то уникальный id у заказа, и они равномерно и плотно растут (например, имеют порядковые номера), то можно смотреть на последнюю цифру. 0-2 отдавать фирме с 30% заказов, 3-9 - второй фирме. Или для равномерности отдавать второй фирме цифры 1,3,4,6,7,8,0 Если таких номеров нет, то можно генерировать случайное число для заказа и смотреть на последнюю цифру там. В среднем будет соотношение 30/70 примерно.
    Ответ написан
    Комментировать
  • Существует ли такой алгорим?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Я так понял задача в том, а есть ли алгоритм, который для двух входных чисел всегда выводит их сумму, но невозможно доказать, а выводит ли он ее или что-то другое.

    Есть такой алгоритм. В общем случае он выглядит так:

    Read(a);
    Read(b);
    DoSomething(a, b);
    Write(a+b);


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

    Поэтому 100% существует такой DoSomething, про который формально доказать что он не виснет нельзя. Иначе бы проблема остановки решалась.
    Ответ написан
    4 комментария
  • Нахождение определенного интеграла модуля косинуса?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Проблема в том, что вот эта вот ваша формула - она работает только на отрезке, где sinx*sgn(cos x) непрерывна. А она имеет разрывы в точках, где косинус меняет знак. Вы ее, видимо, подобрали методом тыка. И действительно, если взять ее производную в каждой точке, то получается |cos x|. Но эту производную не взять в точках, где косинус меняет знак, ведь там разрывы. Это не первообразная, хотя бы потому, что первообразная должна быть непрерывна. поэтому формула определенного интегралла тут и не работает.
    Ответ написан
    2 комментария
  • Откуда следует этот предел?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    u ограничена. h стремится к нулю. Поэтому u*h - стремится к нулю.
    Ответ написан
    Комментировать