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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Сначала заменой x=x'+x0, y=y'+y0 можно убрать коэффициенты D и E и считать, что центр лежит в точке {0, 0}.

    Дальше надо подобрать такой угол поворота, что коэффициент при xy станет нулем. Тогда останется что-то вроде A'x^2+C'y^2 + F' = 0 - а значит эллипс выравнен вдоль осей и это был искомый угол.

    Подставляя формулы поворота системы координат x=x' cosa-y' sina и y=x' sina + y' cosa и приводя слагаемые можно составить уравнение на этот самый коэффициент перед xy. Он будет озависить только от A,B,C и sina, cosa. Далее это тригонометрическое уравнение надо причесать и решить. Вам придется воспользоваться вот этой формулой для котангенса двойного угла: maxresdefault.jpg.

    У вас будет уравнение с косинусами, синусами. Его можно элементарно привести к тангенсу. Далее применяете эту формулу и получаете ответ.
    Ответ написан
    Комментировать
  • Что не так с синусом?

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

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

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

    Вам надо взять f:[0,1] -> R^2, f(0) = (-1,1), f(1) = (1,-1).

    Дальше ввести g(t) = f(t)_y - f(t)_x и там уже применять теорему о промежуточном значении для непрерывных функций.
    Ответ написан
    Комментировать
  • Как округлять с отрицательной точностью?

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

    Точность говорит, что все цифры после этого индекса должны быть 0. А предыдущая, может увеличится на 1, в зависимости от правил округления.
    Ответ написан
    Комментировать
  • Можно ли выразить алгоритм в виде математической формулы?

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

    Значение в каждой ячейке будет
    max(0, (тукущее значение) - max(0, (платеж) - (сумма всех следующих ячеек)))


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

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

    Но вы еще и сумму ряда неправильно подсчитали. А вам что-то похожее считать придется. Там можно через интегрирование/дифференцирование рядов вывести формулу.
    Ответ написан
  • Как сравниваются перцептивные хэши?

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

    Например, можно проиндексировать все последовательности из n символов подряд в каждом хеше. Потом поискать в этом индексе все последовательности из n символов в образце. Потом хеши из получившегося списка уже проверить на расстояние хемминга. Если брать n < L/k, где L - длина хеша, а k -допустимое количество ошибок, то все нужные хеши попадут в список. Чем больше n, тем меньше лишнего будет в списке.

    Другой пример - использование бора (trie). Все хеши складываются в бор. Потом там запускается рекурсивный алгоритм, который может сделать k ошибок (параметр функции). Он или идет по текущему символу или делает ошибку и идет по любой другому ребру, но уже там может сделать максимум k-1 ошибку. Конечно, этот метод будет заходить в тупики, но он обойдет лишь малую долю всего дерева.

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

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

    Вот первая формула r= ... - это значит, что значение переменной r вычисляется по выражению справа. Там участвуют переменные p, g, значения которых вам даны.

    Там дробь, в числителе стоит сумма p и g. В знаменателе один плюс значение логарифма в квадрате от суммы корня pg+p и g^2. Расставьте скобки и получите (p+g)/(1+log(...)*log(...))

    Аналогично вторая формула для y через p,g,r и z ( три из них вам даны, r вычисляется в предыдущем действии).

    Возведение в квадрат - зависит от языка программирования. Или функция sqr(), или **2, или просто написать (выражение)*(выражение). lg() - вызов встроенной функции логарифма. Опять же, зависит от языка, как именно она называется у вас. Квадратный корень - функция sqrt().
    Ответ написан
    1 комментарий
  • Как выглядит стандартное решение эллипса по центру и 3 точкам?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    TL;DR:
    S = Pi*sqrt(3 / [ (1/L1+1/L2+1/L3)^2-2*(1/L1^2+1/L2^2+1/L3^2) ])

    тут L1, L2, L3 - квадраты трех измерений.

    Вывод формул:
    Чуть-чуть аналитической геометрии и куча элементарной алгебры помогут вам вывести эти уравнения.
    Если ввести систему координат с осями по главным радиусам эллипса, то уравнение эллипса будет:
    x^2/a^2+y^2/b^2 = 1

    При этом все точки под углом alpha к большой полуоси будут на луче:
    x(t, alpha) = t*cos(alpha)
    y(t, alpha) = t*sin(alpha)


    Обозначим синус и косинус угла для первого измерения как:
    s = sin(a1), c = cos(a1)

    Пусть квадраты расстояний - L1, L2, L3.

    Если пересечь луч и эллипс, то можно составить уравнение для длины вдоль угла a1 (первое измерение), просто подставив известные x(a1, sqrt(L1)) и y(a1, sqrt(L1)).
    1/L1 = c^2/a^2+s^2/b^2

    Для остальных измерений надо прибавлять 120 градусов к углу под cos и sin. Если раскрыть cos(120+a1) = cos(120)cos(a1)-sin(120)sin(a1) и sin(120+a1) = cos(120)sin(a1)+sin(120)cos(a1), то можно составить еще 2 уравнения:

    1/L2 = (-1/2*c-sqrt(3)/2*s)^2/a^2+(sqrt(3)/2*c-1/2*s)^2/b^2
    L3 = (-1/2*c+sqrt(3)/2*s)^2/a^2+(-sqrt(3)/2*c-1/2*s)^2/b^2


    Всего с учетом тригонометрического тождества s^2+c^2=1 у нас 4 уравнения на 4 неизвестных a, b, c, s.

    Но нам не нужны все значения. Площадь эллипса Pi*a*b, а радиусы эллипса - a и b.

    Раскрыв квадраты выше и всячески складывая эти уравнения можно получить в итоге
    1/a^2+1/b^2 = 2/3*(1/L1+1/L2+1/L3)
    1/a^2*b^2 = [ (1/L1+1/L2+1/L3)^2-2*(1/L1^2+1/L2^2+1/L3^2) ]/3


    Отсюда площадь:
    S = Pi*ab = Pi*sqrt([ (L1+L2+L3)^2-2*(L1^2+L2^2+L3^2 ]/3)


    Чтобы найти радиусы эллипса, вам надо найти a и b. Выше уже даны два уравнения для суммы и произведения 1/a^2 и 1/b^2 - можно из них получить квадратное уравнение для t=1/a^2. Два его решения и будут вашими радиусами эллипса (не забудьте взять корни и обратить). Тут надо аккуратно подставить выражения в школьные формулы для квадратного уравнения.
    Ответ написан
    9 комментариев
  • Как предсказать следующее числовое значение по предыдущим?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Есть целая наука об этом. "Временные ряды", вроде, называется. Там есть куча всяких моделей, типа ARIMA.
    Ответ написан
    4 комментария
  • Как доказать, что муха будет бесконечно разворачиваться?

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

    И надо еще доказать, почему не может быть последнее отражение когда поезда встретились. Допустим оба поезда и муха встретились в одной точке. А что было в момент предыдущего отражения? какое-то ненулевое расстояние между поездами. Но если с этого момента проиграть, то следующее отражение будет до момента встречи двух поездов. Опять противоречие.
    Ответ написан
    1 комментарий
  • Что требуется в задаче Python?

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

    В первой задаче надо выбрать какие-то числа, в числах выбрать какие-то цифры (всего не более k цифр) и заменить их другими цифрами так, чтобы сумма увеличилась как можно больше. Очевидно, что заменять надо старшие цифры и всегда на 9. Поэтому можно сразу сказать, что если мы в числе 128694 заменяем 3 цифры - то это "128" и получится 999694.

    Особый случай тут, если число содержит девятки - их надо пропустить.

    Теперь задача немного упрощается. Надо распределить k цифр по числам, чтобы получить максимум профита, т.е. увеличить максимально сумму чисел.

    Можно еще немного порисовать тесты на бумажке и понять, что каждое число можно рассматривать как набор цифр. Каждая цифра отдельна. Ибо замена одной цифры увеличит сумму на (9-цифра)*10^(разряд цифры) независимо от остальных цифр. Т.е. задача еще преобразуется - есть куча цифр каждая с известным профитом, если ее заменить. Надо не более k из них взять, так что бы сумма изменения была максимальна.

    Теперь понятно, что задача решается сортировкой. Считатете для каждой цифры сумму профита, все это складываете в массив (длины максимум 10*n). Сортируете по убыванию и берете сумму первых k значений.

    Вотрая задача - опять же медленно читайте. Я не могу за вас понять. Объяснить как-то проще условие тоже не могу. Попробуйте порисовать тесты в виде пронумерованных точек, от которых стрелочки идут к значению a[i] - кому они дают подарки. Вам надо ровно одну стрелочку переместить так, что бы все стрелочки замкнулись в один круг.

    Для решения надо понять, а что будет, если не менять ни одно число? Путь из точки 1 будет или циклом или чем-то вроде цифры "6". Сначала какой-то хвост, который зацикливается где-то на середине.

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

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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Найдите первообразный корень по модулю p. Возведите его в степень (p-1) / q. Это и будет искомое число с порядком q.

    Есть вот такой алгоритм поиска первообразного корня: проверяйте все числа подряд. Разложите p-1 на множители и возводите проверяемое число в степень (p-1)/k, где k - простой делитель p-1. Если везде получили не 1, то текущее число - первообразный корень.
    Ответ написан
    Комментировать
  • Как определить зависимость между числами зная несколько начальных значений и конечное?

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

    В самом печальном для вас случае там используется криптография. Тогда не имея доступа к секретному ключу у производителя пароль никак не сгенерировать даже имея весь код генерации и проверки пароля.
    Ответ написан
    Комментировать
  • Может есть алгоритм равномерного распределения на основе хэша SHA256?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Если вам надо, чтобы после увеличения n, хеши выдавали те же позиции - то это невозможно сделать равномерно без запоминания. Потому что пусть n=10 изначально - тогда ЛЮБОЙ хеш должен выдать значение меньше 10. А потом при увеличении n любой хеш, все-равно должен выдать 0-9. Пусть даже n станет 100000 - нельзя использовать добавленные позиции, кроме 10 первых.

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

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

    Там по вашей ссылке в задаче есть подсказка: уравнение можно переписать в виде (x-2y)(x+2y)=n

    Отсюда получается решение: Перебирайте все делители n, не превосходащие корень. Пусть делитель d, тогда второй множитель будет n/d.

    Осталось решить систему линейных уравнений:

    x-2y=d
    x+2y=n/d


    Решается в уме - x=(d+n/d)/2, y=(n/d-d)/4

    Отслось только учесть диофантовость уравнения - ответ должен быть неотрицательные целые числа. Значит, надо чтобы оба делителя d, n/d давали одинаковый остаток от деления на 4 и 2. Ну и d<=n/d, но это учтется перебором делителя до корня.

    Вот и все решение - циклом переберите делитель до корня, убедитесь, что он и оставшийся множитель дают один и тот же остаток по модулю 4, вычислите x и y и выведите их.
    Ответ написан
    Комментировать
  • Как решить уравнение с параметром с помощью матана?

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

    Если экстремумов нет - будет возрастающая функция, с одним вещественным корнем всегда. Если экстремумы есть, то надо или чтобы они оба были меньше 0, или оба были больше.

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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    У вас ошибка: надо еще P30(0) прибавлять.

    Какой-то более простой формулы мне придумать не удалось, и она вряд ли есть. Если руками вывести формулы для маленького количества банков, то там все-равно получается полином n/2-ой степени, т.е. от 15 слагаемых никуда не уйти.

    Я думаю, в этой задаче у вас приняли бы просто символьную записть в виде суммы.

    Если нужно числа - можно написать программу, или считать на калькуляторе. Начинайте с 0.7^30. Делайте m+, домножайте на 3/7*30/1, потом на 3/7*29/2, и так далее (нажимая m+ каждый раз), пока 15 слагаемых всего не наберется.

    Или вбить в wolframalpha и получть 98.3%.
    Ответ написан
    Комментировать
  • Как быстро проверить, является ли некоторое огромное число (от 100 знаков) квадратом целого числа?

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

    Более простой в реализации, но менее быстрый метод вычисления корня - бинарный поиск. Храните l, r, l^2, r^2 и lr. По этим числам можно вычислить m=(l+r)/2, m^2, m*l, m*r без длинных умножений, а только складывая длинные числа и деля на 2. Вам надо поддерживать, чтобы l^2 <= n <= r^2. Изначально можно сделать l=1, r=10^51 (или больше - половина длины входного числа + немного, чтобы точно квадрат был больше n), потом делить отрезок пополам и отбрасывать ненужную половину.

    Еще есть вероятностный метод через символ Лежандра/Якоби. Это будет самым быстрым методом.

    Это как смотреть на последнюю цифру. Квадраты могут давать там 0, 1, 4, 9, 6, 5. Но нет ни одного квадрата, который оканчивался бы на 2. Т.е. если число заканчивается на 2, то можно сразу говорить, что это не квадрат. Это мы взяли остаток от деления на 10 (последняя цифра) и посмотрели, какие из них хорошие. Вот символ Лежандра - это такая проверка для модуля по любому простому числу (а не 10).

    Если брать некоторое простое число p, то n может быть квадратом, только если символ Лежандра (n/p) - равен 1 или 0 (По научному: n - должно быть квадратичным вычетом).

    Если брать небольшие (<64-битные) простые числа, то можно за линию считать n%p и потом вычислять символ Лежандра (n%p/p) по алгоритму через символ Якоби за O(log(p)^2). Когда подсчитали символ Лежандра и если он -1, то n - точно не корень.

    Тут проблема в том, что это необходимый, но недостаточный критерий - если для какого-то p вы получили -1 - то это точно не квадрат. Но возможно можно подобрать такое число, что все ваши тесты дадут 1, а оно не квадрат. Поэтому надо брать много простых чисел. Скажем, 20. Желательно еще числа брать достаточно большими. Но их не надо искать каждый раз, можно захардкодить. Грубая прикидка говорит, что вероятность ошибки такого алгоритма 2^(-количество простых чисел).

    Т.е. берете много простых чисел. Считаете для каждого n%p выполняя деление большого числа на короткое (один проход по массиву цифр). Потом считаете символ Лежандра. Если получили где-то -1 - то точно не квадрат. Иначе - скорее всего квадрат.

    Можно совместить вероятностный тест и вычисление корня. Сначала проверьте парочку простых чисел на символ Лежандра для отсечения точно не квадратов. Еще проверку последней цифры можно сделать, это очень дешево. Если не отсеклись, то считайте корень. Так будет всегда работать правильно но будет быстрее работать в некоторых случаях.
    Ответ написан
    Комментировать
  • Как найти угол для поворота вектора?

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

    Достаточно только иместь координаты обоих векторов (синего и фиолетового) в евклидовом пространстве.

    Делаете произведения, делите длину вектора или число на длины изначальных векотров и получаете синус и косинус. Этого уже достаточно для матрицы поворота. Но если вам нужен сам угол, то скормите эти значения функции atan. На знаю C#, но точно должна быть версия, которая получает значения синуса и косинуса.
    Ответ написан