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

    @Mercury13
    Программист на «си с крестами» и не только
    Возможен и такой изврат: в одном месте будут свойства Лобачевского (через точку можно провести кучу прямых, параллельных данной), в другой — Евклида (ровно одну).

    Понятие «расстояние» — |AB| — там есть. Нет понятия «движение», и потому круг нарисовать можно, а нарисовать рядом равный ему, чтобы он имел аналогичные свойства, например, такую же площадь — нет.
    Ответ написан
  • Возможно ли решить данную задачу?

    @Mercury13
    Программист на «си с крестами» и не только
    1018 — это обычное 64-битное целое. long long в Си, long в Java, int64 в Delphi.

    Очевидно, задача переводная, спичка не только match (это слово у них очень многозначное), но и matchstick. Причём переводил то ли автомат, то ли редкий надмозг, пример неговорящий, и откровенно непонятно: то ли где находится число 11, то ли что на 11-й позиции. Будем решать 2-ю задачу: что на 11-й позиции.

    1. Определить количество разрядов (для этого хватает несложного цикла) и какой номер у данного числа среди N-значных чисел.
    2. А теперь находим, сколько есть N-значных чисел из M спичек. Рекуррентное соотношение:

    Q[N, M] = sum{k = 1..9} (Q[N−1, M−q(k)]), если N — найденная нами значность, но не 1-ца,
    Для остальных N формула та же, но суммирование 0…9.
    q(0) = 6, q(1) = 2, q(2) = 5, и т.д. — кол-во спичек в цифре.
    Граничное условие: Q[0, 0] = 1, Q[0, M] = 0 для остальных M.
    «Методом выкручивания рук» также примем, что для отрицательных M все Q равняются 0.

    Решаем рекуррентное соотношение динамическим программированием.
    3. А теперь самое интересное: воспользовавшись таблицей динамического программирования, находить цифру за цифрой, начиная со старшей.

    Например, у нас 15-е число. Первый шаг опустим, поверьте мне: это 4-е двузначное, начиная с нуля.
    2-й шаг.
    Q[1,2] = 1
    Q[1,3] = 1
    Q[1,4] = 1
    Q[1,5] = 3
    Q[1,6] = 3
    Q[1,7] = 1
    Q[2,4] = 1
    Q[2,5] = 2
    Q[2,6] не вычислял, главное — запредельно большое.

    Q[2,0]…Q[2,3] равняются нулю.
    Вычитаем Q[2,4] — получается 3.
    Вычитаем Q[2,5] — получается 1.
    Вычитаем Q[2,6] — не получается. Итого у нас шесть спичек, остаётся 1.

    3-й шаг, работаем по цифре.
    Ноль, Q[1, 6−6] = 0. Остаётся 1.
    Единица, Q[1, 6−2] = 1. Остаётся 0.
    Двойка, Q[1, 6−5] = 0. Остаётся 0.
    Тройка, Q[1, 6−5] = 0. Остаётся 0.
    Четвёрка, Q[1, 6−4] = 1. Не вычитается, остаётся 2 спички, 1 знак и номер 0. Записываем цифру 4.
    Ноль, Q[0, 2−5] = 0. Остаётся 0.
    Единица, Q[0, 2−2] = 1. Не вычитается, остаётся 0 спичек, 0 знаков и номер 0. Записываем цифру 1.

    Итого получили 41.
    Ответ написан
    3 комментария
  • Как решить данную задачу?

    @Mercury13
    Программист на «си с крестами» и не только
    Задача сложна и требует серьёзного исследования. Дело тут в том, что второй эшелон — склад промежуточного хранения — добавляют, если затраты НЕлинейны и в больших объёмах развоз товара дешевле. Это, конечно, можно сымитировать более дешёвым завозом на склады. (А также чтобы разгрузить «мёртвые запасы» магазинов и законом больших чисел скомпенсировать случайные колебания спроса, но это, как я понял, не ваше дело.)

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

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

    Лучше выводить не одно решение, а несколько — например, до 120% от оптимального. Дело в том, что после компьютерного вычисления возникнут какие-то человеческие факторы: узнав, что восточный склад только в Комсомольске-на-Амуре, а северо-западный можно ставить где угодно в окрестностях Ленинграда, принимаем решение ставить склады в Комсомольске и недалеко от ленинградского метро.
    Ответ написан
    Комментировать
  • Как найти среднее Hue (или другую «закольцованную» величину)?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Пока самый удачный способ таков.

    Переходим в координаты (x, y): x = cos(hue) · sat, y = sin(hue) · sat.
    Там можно получить среднее (x, y) и взять atan2.
    Ответ написан
    Комментировать
  • Как нарисовать изгиб мостика под нагрузкой?

    @Mercury13
    Программист на «си с крестами» и не только
    В первом приближении (деформации малы, балка лёгкая) — половина параболы.
    Если точно — решить можно только численно.
    Ответ написан
    Комментировать
  • Найти максимальное и минимальное значение от деления нацело?

    @Mercury13
    Программист на «си с крестами» и не только
    UPD. Переписал с нуля.
    r <= z/x < r + 1
    l <= z/y < l + 1

    Тогда y/x = z/x : z/y > r / (l+1)
    С другой стороны: y/x < z/x : z/y < (r+1)/l

    Пока вижу диапазон [r / (l+1)]; [(r+1)/l]
    Второе — минус один, если точное целое: приблизиться-то можно, а достичь нельзя. Сымитируем это таким образом…
    [r / (l+1)]; [r/l]

    Покажем, что границы достижимы (например, первая). Она затрагивает два неравенства.
    z/x < r + 1
    z/y >= l
    Подбором x, y и z можно довести второе до равенства и сколь угодно сильно приблизить первое.

    UPD2. Пусть r = [z/x] = 10, l = [z/y] = 3
    Тогда [y/x] будет в пределах от [10/4] = 2 до [10/3] = 3. А Если без целой части — то от 2,5 до 3 2/3.
    z = 100.000, x=10.000, y=25.001, y/x = 2,5001
    z = 100.000, x = 9091, y=33.333, y/x ≈ 3,66659
    Ответ написан
    Комментировать
  • Какую функцию использовать для построения такого графика?

    @Mercury13
    Программист на «си с крестами» и не только
    Вариантов много. Считаем пока, что никаких требований к f(0) нет. Перемасштабируем наши переменные:
    x' = (x − 1)/9
    y = 8y' + 2.
    Тогда x' и y' будут от 0 до 1, в то время как x и y — 1…10 и 2…10. И тогда варианты.
    1. Степенная функция: y' = x'a, a = 0…1. Если a=½, то квадратный корень, ⅓ — кубический корень…
    2. Четвертушка эллипса: y' = sqrt(1 − x'²)
    3. Синус: y' = sin((pi/2)·x')

    Если же f(0) = 0, то масштабируем по-другому:
    x' = x/10
    y = 10y'
    Ответ написан
    4 комментария
  • Почему в ряде Тейлора есть факториал и выражение в скобках имеет степень?

    @Mercury13
    Программист на «си с крестами» и не только
    Самый прикол ряда Тейлора — почему у него такой остаточный член.
    У Лагранжа и Коши
    Члены очень хороши.
    А у Шлёмильха и Роша
    Самый, говорят, хороший.

    Решим задачу попроще: прикинем на пальцах форму степенного ряда Sum{aixi}, который приближает функцию в окрестности x=0.
    0-е приближение: f(x) ≈ f(0).
    1-е приближение: f(x) ≈ f(0) + f'(0)·x.

    Пока никаких нареканий. Подумаем над вторым приближением.
    f(x) ≈ f(0) + f'(0)·x + ax².
    Хотелось бы, чтобы этот многочлен имел такие же производные вплоть до второй, как и функция f. (x²)|x=0=(x²)'|x=0=0, с этим никаких проблем. Поскольку (x²)''|x=0=2, получается, что a=f''(0)/2.

    И сразу n-е приближение.
    f(x) ≈ f(0) + f'(0)·x + f''(0)·x²/2 + … + bxn.
    И этот многочлен должен иметь такую же n-ю производную, как и функция f. Чему равен (xn)(n)|x=0? Разумеется, n!. Отсюда и коэффициент f(n)(0)/n!.
    Ответ написан
    1 комментарий
  • Структура данных типа очереди, позволяющая быстро определить позицию элемента. Есть?

    @Mercury13
    Программист на «си с крестами» и не только
    Очередь, физически не перемещающая элементы (кольцевая или некое подобие std::deque) и позволяющая по указателю быстро определить позицию.

    Плюс любой индекс (хэш- или деревянный), элементы которого — указатели на элементы очереди. Если элементы очереди unique_ptr, то указатели будут именно на unique_ptr! Для «мусорных» языков (C#, Java) вместо указателей можно придумать какие-то идентификационные коды — например, сочетание из номера в пуле массивов и номера в массиве.

    Enqueue — вписываем элемент в индекс. Dequeue — удаляем из индекса. Обмен позициями — корректируем эти два элемента индекса.
    Ответ написан
    Комментировать
  • Как решить эту задачу со множествами?

    @Mercury13
    Программист на «си с крестами» и не только
    1. ВЕРНО. A \cap C \in A \in B \in B \cup D (прости уж, что пишу тэгами TeX).
    3. ВЕРНО, следует из законов логики.
    5. UPD. Всё-таки ВЕРНО, тут надо действовать через x. Пусть $x \in A \cap C$, тогда $x \in A$ и $x \in C$. А значит, $x \in B$ и $x \in D$. Дальше понятно? Точно так же можно решить и 3.
    Ответ написан
  • Как найти координаты точки?

    @Mercury13
    Программист на «си с крестами» и не только
    Я плохо понял, что надо сделать. Но попробую.
    1. Переведи известный катет в вектор: (X3−X1, Y3−Y1).
    2. Поверни его на 90° в нужную сторону. Например, x'=y, y'=−x.
    3. Приведи к нужной длине (теорема Пифагора). Получился вектор-катет.
    4. Прибавив вектор-катет к вершине (X1, Y1), получаем второй конец.
    Ответ написан
    Комментировать
  • Как посчитать угол по 2-м координатам?

    @Mercury13
    Программист на «си с крестами» и не только
    Как я понял, вам нужен угол вектора (x1,y1)→(x2,y2).
    Любой школьный «арк», если им действовать в лоб, в определённом диапазоне углов не определён или неустойчив.
    Но именно для этого в большинстве языков присутствует функция
    atan2(y2 - y1, x2 - x1)
    Ответ написан
    Комментировать
  • Как найти координаты прямой d, направленного по биссектрисе угла между двумя прямыми, при условии, что длина бисс прямой с задается с клавиатуры?

    @Mercury13
    Программист на «си с крестами» и не только
    Как я понял, задача такова. Есть угол, заданный вершиной и двумя точками на сторонах. Найти, куда попадёт биссектриса длины 4.

    1. Из координат вершины угла и точек на его сторонах получить векторы-стороны.
    2. Привести векторы-стороны к единой длине (например, разделить на длину).
    3. Их среднее арифметическое — вектор-биссектриса. Если получился нулевой вектор — векторы-стороны смотрят на 180°, и непонятно, в какую сторону считать нашу биссектрису.
    4. Привести вектор-биссектрису к нужной длине (разделив на реальную длину и умножив на требуемую).
    5. Отсчитать этот вектор от вершины угла. Получится координата биссектрисы длины 4, отложенной от точки (3, 4).
    А математика совсем не высшая :)
    Ответ написан
    Комментировать
  • В группе вк 10319 человек. из них Московских 6.21%. Как мне вычислить точное число подписчиков из Москвы?

    @Mercury13
    Программист на «си с крестами» и не только
    Задача, как ни странно, нетривиальна.
    Какой возможен процент, чтобы округление дало 6,21? От 6,205 до 6,215%.
    Минимальное число — 10319 * 6,205 / 100 = 640,29
    Максимальное — 10319 * 6,215 / 100 = 641,32
    Ответ однозначен, 641 человек.

    Будь округление более грубым — например, 6,2% — тогда было бы от 635 до 644.
    Ответ написан
  • Как подсчитать комбинацию шагов коня на матрице 4 на 3?

    @Mercury13
    Программист на «си с крестами» и не только
    Твоё дело — перебор с кэшированием.
    Для каждой кнопки вручную закидываем в массив конских «соседей» — ни одного для 5-ки, три для 4 и 6, два для остальных.
    Затем заведи массив 10×7 (стартовая кнопка×длина) и устрой рекурсию с одним небольшим добавлением: если оно закэшировано, брать из кэша. Правила — f(b, 1) = 1, для остальных — sum{c=сосед(b)} f(c, i−1).
    Можно и динамическим программированием, без рекурсии — всё равно расход вычислительной мощи незначительный. Сначала f(b, 2), затем f(b, 3), и т.д. до 7.
    Ответ написан
  • Как определить число инверсий для перестановки?

    @Mercury13
    Программист на «си с крестами» и не только
    Инверсия — это когда a < b, но стоят они наоборот.
    В пределах блока (например, 1…3n−2) инверсий, разумеется, нет.

    Между первым и вторым блоком.
    • С 2-кой: 4, 7,… То есть n−1 шт.
    • С 5-кой: начиная с 7 — то есть n−2 шт.
    • Итого 0 + 1 + 2 +…+ (n−1) = n(n−1)/2 шт.

    Между первым и третьим, и между вторым и третьим сам инверсии посчитаешь? И чётное оно или нет — тоже, надеюсь, посчитать несложно.
    Ответ написан
    Комментировать
  • Как решить уравнение х*х-2=3y в целых числах?

    @Mercury13
    Программист на «си с крестами» и не только
    x делится на 3: 9z² − 2 = 3y. Справа делится на 3, слева нет.
    Иначе: (x−1)(x+1) = 3y + 1. Хотя бы один из множителей кратен трём. Всё наоборот: слева делится на 3, справа нет.
    Дальше уже, по-моему, доказательство не упростить.
    Ответ написан
    Комментировать
  • Можно ли подготовиться к Яндекс ШАД дза год?

    @Mercury13
    Программист на «си с крестами» и не только
    Да более чем! Главная проблема — интегралы. Один средней сложности точно будет.
    Ответ написан
  • Что такое проекция на множество узлов в графе?

    @Mercury13
    Программист на «си с крестами» и не только
    Двудольный граф можно представить как соответствие R ⊆ A×B. Тогда проекция двудольного графа на долю A (или B) — это те вершины из A (или из B), из которых идёт ребро.
    Ответ написан
    Комментировать
  • Почему в Python при целочисленном делении (-1 // 2) получается ответ (-1)?

    @Mercury13
    Программист на «си с крестами» и не только
    Соответствующий кусок статьи Википедии «Деление с остатком» во многом мой, расскажу вкратце.

    Когда делитель отрицательный, в моей практике такого не бывало. А когда отрицательное делимое, есть два подхода. Но прежде выясним, что такое неполное частное и что такое остаток.
    q = [a / b], r = a − bq.
    Когда b>0, есть два подхода к округлению.
    1. Неполное частное округляется к нулю, остаток отрицательный.
    2. Неполное частное округляется к −∞, остаток положительный.
    Оба имеют право на жизнь: первый — когда преобразуем сумму в копейках в рубли-копейки, второй — когда огрубляем координаты, чтобы указать, в какой клетке находится точка.
    Можно эти правила расширить и на отрицательный делитель: a mod (−b) = −a mod b. В такой ситуации знак остатка равняется знаку делимого и делителя соответственно.
    В x86 (а значит, в большинстве ЯП) принят первый подход. А в Питоне — второй.
    Ответ написан
    Комментировать