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

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

    Сначала полным перебором найдите суммы всех подмножеств. Если есть совпадения, возьмите минимальную сумму, которую можно набрать больше 1 раза. Вычтите из случайного заказа 1 копейку. Повторяйте процесс. Если цены правдоподобны, сильно больше 100 копеек и цены различаются, то даже для 20 заказов вам придется лишь несколько копеек вычесть.

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

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

    Форомула будет (x0 - xr)(y1-yr) - (x1-xr)(y0-yr), где xr, yr - центр окружности.
    Ответ написан
    Комментировать
  • Почему sum(sum(xy)/sum(x))/n приближенно равен sum(sum(xy))/sum(sum(x))?

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

    X= {{1, 5}, { 1, 5}}, Y={{5, 1/5}, {5, 1/5}}

    слева даст: 1/2 (10/2 + 2/10) = 1/2 (5 + 0.2) = 2.7

    а справа: (5+5+1+1)/(1+5+1+5)= 1

    Вообще даже близко не равно. Меняя 5 в матрице выше на сколь угодно большое число, вы получите сколь угодно большую разницу.
    Ответ написан
    4 комментария
  • Верно ли я поставил знаки в формуле?

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

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

    А дальше там будет 2 соседних слагаемых A !B !C !D+A C !D. Тут можно A !D вынести за скобки и останется (!B !C+C). Это можно сократить просто до !B + C. Было такое правило, вроде бы, но это можно доказать. Если C истинно, то исходное уже истинно. Если !B истинно, то либо !С истинно и истинно первое слагаемое, либо С истинно, и истинно второе слагаемое.

    Вот уже третье слагаемое сократилось то A !B !D

    Потом повторите фокус, вынеся за скобки из первого и второго слагаемого !B. Там останется !A+A !D = !A + !D
    Ответ написан
    3 комментария
  • Как доказать это или где можно почитать доказательство этого факта?

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

    Так можно по номеру получить уникальное подмножество и любое подмножество имеет какой-то номер. Все. Вот мы и занумеровали множество всех подмножеств натуральными числами. Оно счетно.
    Ответ написан
    2 комментария
  • Следствие из свойств скалярного произведения. Из чего это следует?

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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Найдите остаток от деления искомой штуки на 4 и на 25. Далее примените китайскую теорему об остатках.

    Так проще, потому что остаток от деления a^(b^c) на степень простого числа можно найти по малой теореме Эйлера:

    a^(b^c) = a ^ (b^c % (p-1)p^(n-1)) mod p^k.

    Т.е. 7^9^9 = 7^((9^9) % 20) mod 25

    9^9 % 20 уже можно вычеслить через логарифмическое возведение в степень.

    Аналогично для 4.

    Правда, тут можно и без теоремы об остатках. Надо просто сразу применить теорему ейлера. фи(100) надо только аккуратно вычислить. И числа будут чуть больше, но все-равно подъемные.
    Ответ написан
    Комментировать
  • Как доказать что последовательные производные также имеют вещественные корни?

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

    Если нет кратных корней - то все просто. У вас n-1 последовательный промежуток между двумя корнями. На каждом должен быть ноль производной.

    Теперь, допустим есть какой-то корень степени k > 1.

    Тогда P(x) = (x-a)^k Q(x).

    Если взять производную, то видно, что она делится на (x-a) в степени k-1, т.е имеет k-1 корней:

    P'(x) = k*(x-a)^(k-1)*Q(x)+(x-a)^k*Q'(x)

    Т.е, если у вас m различных корней (суммарной кратностью n), то производная, как и в первом случае имеет m-1 корней между корнями P(x) и еще n-m раз повторяет корни полинома как во втором случае. Суммарно - n-1 вещественных корней, значит все корни - вещественные.
    Ответ написан
    Комментировать
  • Как посчитать значение счетчика со сбросом?

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

    Один вариант решения - прибавлять к текущему числу 65536, пока оно меньше предыдущего. Можно обойтись арифметикой:

    a[i] += ceil((a[i-1]-a[i])/65536)*65536

    Только проверьте, что в вашем языке ceil(-0.5) даёт 0, иначе надо отдельно проверять случай, когда последовательность возрастает в начале и прибавлять ничего не надо. И ещё, тут считается, что числа в неурезанной последовательности могут повторяться. Если нет, то надо отдельно рассмотреть случай равных чисел в итоге и ещё раз прибавить 65536.
    Ответ написан
    Комментировать
  • Как можно найти центроид четырёх точек ( Quadrilateral ), зная координаты этих вершин?

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

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

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

    Итоговая фромула (в векторах):
    C = ((p1+p2+p3)/3*(p1p2*p1p3)+(p3+p4+p1)/3*(p1p3*p1p4))/((p1p2*p1p3)+(p1p3*p1p4))


    Тут pi - i-ая вершина четырехугольника, pipj - вектор между точками i и j. pipj*pkpl - векторное произведение двух векторов.
    Ответ написан
    Комментировать
  • Есть ли сервис для создания формулы для числа?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Зачем сервис? Вот вам формула для любого числа X = (X-1) + 1. Например, 172 = 171+1.

    Или вам какое-то особое свойство у формулы нужно?
    Ответ написан
  • C# Math правильно ли я делаю?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Да вроде все правильно. Скорее всего опечатка в задании где-то. Так бывает. Или где-то может быть сказано, что углы должны быть в градусах а не радианах. Тогда выражение под синусом/косиносом надо домножать на 180/pi.
    Ответ написан
    1 комментарий
  • Как найти точку пересечения двух графиков?

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

    Дальше завивит от того, как графики заданны. Если это наборы точек, то надо найти 2 одинаковые точки в отсортированных массивах. Или попересекать кучу отрезков, если график кусочно-задан.

    Если графики заданны функциями, то надо решить уравнение. Тут вам помогут численные методы, если это не полиномы степени 4 и меньше. Например, метод Ньютона.

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

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

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

    В отдельных случаях (сумма не очень большая и множеств всего 2; числа очень маленькие) возможны быстрые алгоритмы на основе динамического программирования
    Ответ написан
  • Определить победителя КНБ?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    (-1) % 3 = 2

    Это математическое определение вычетов по модулю. Все числа, которые отличаются на n, имеют одинаковый остаток по модулю n. Конфуз происходит из-за того, что операция взятия по модулю во многих языках программирования работает не так. Для отрицательных чисел она выдаст отрицательное значение, правда к которому можно прибавить n, что бы получить правильный модуль - число от 0 до n-1.

    Поэтому при реализации можно делать (a-b+3)%3 Или преобразовать, чтобы не было вычитания: b == (a+1)%3
    Ответ написан
    Комментировать
  • Формула повышения уровня игры?

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

    Попробуйте что-то вроде 1.2**lvl *50 и 1.3**lvl *100.
    Ответ написан
  • Сумма арифметической прогрессии?

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

    Первый член - 1 (при j=i+1), последний - n-i (при j=n). Всего их n-i. Ну а дальше - стандартная формула: среднее крайних членов, помноженное на их количество.

    Как из этого получается O(n^3). По уму, надо раскрыть скобки и разложить на сумму трёх рядов, в зависимости от степени i в слагаемом. Дальше сумма i даст также O(n^2). Сумма по i^2 даст O(n^3). Тут уже нельзя арифметическую прогрессию применять, но это известная формула - сумма n квадратов даст n(n+1)(2n+1)/6. Ее можно вывести, если взять ряд f(x)=1+x+x^2+...+x^n = (1-x^{n+1})/(1-x) и найти (x*f'(x))'. Потом туда можно подставить x=1. Или есть визуальные доказательства. Каждый квадрат - это квадрат из кубиков. Их все можно сложить в пирамиду. 6 таких пирамид можно сложить в параллелепипед.
    Ответ написан
    1 комментарий
  • Как посчитать число 2 в 1 000 000 000 000 000 степени?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    2^10 ~ 10^3. 2^1 000 000 000 000 000 ~ 10^300 000 000 000 000.

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

    Вряд ли у вас цель - получить эти 300 миллиардов цифр. Наверно, вам нужно что-то с этим числом делать. Возможно, это можно сделать без вычисления всех цифр числа. Например, если вам нужны последние 100 цифр - то можно на том же питоне производить вычисления по модулю 10^100. Правда, придется писать экспоненциальное возведение в степень самостоятельно.
    Ответ написан
    Комментировать
  • Какой алгоритм использовать для определения нахождения точки за границей треугольника пространства?

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

    Если же оно на плоскости, то введите там систему координат (например, орто-нормируйте вектора p2-p1 и p3-p1). Получите координаты всех точек (p1 можно назначить началом координат).

    Потом придется применять формулу для плоскости. Можно воспользоваться векторными произведениями. Произведение пар векторов {p-p1, p2-p1}, {p-p2, p3-p2}, {p-p3, p1-p3} должны все давать одинаковый знак (или все <=0 или все >=0. Равенство 0 чего-то будет означать, что точка на границе).

    Или можно посчитать площади, опять же через векторное произведение. |(p2-p1)(p3-p1)| = |(p1-p)(p2-p)+(p2-p)(p3-p)+(p3-p)(p1-p)|
    Ответ написан