Ответы пользователя по тегу Алгебра
  • Как решить задание без использования правила Лопиталя?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Раскройте sin(6x) по формуле синуса двойного и потом тройного углов. В итоге 2sinx - 1 и в числителе и в знаменателе сократится.
    Ответ написан
  • Как сгенеририовать СЛАУ (система линейных алгебраических уравнений) больших размеров?

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

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Смотрите на похожие слагаемые, Из первых трех можно вынести AB. В скобках остается что-то похожее на последнее слагаемое. Примените обратного Де Моргана и то, что мы раньше уже обсуждали, чтобы получить AB. Потом, четвертое и пятое слагаемое можно вынести за скобки AC, остается (D+E). Это же (D+E) остается в 7 и 8 слагаемом, если вынести за скобки !B!C. 6 слагаемое комбинируется с последними двумя, если вынести за скобки !D!E.
    Ответ написан
    4 комментария
  • Как упростить логическое выражение?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    X+!X Y = X + Y

    Не помню, как эта теорема называется.
    Ответ написан
    5 комментариев
  • Как минимизировать логическое уравнение?

    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 Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Во-первых, для таких больших коэффициентов вы в long long не влезаете, если в лоб считать.

    Можно проверить в 2 этапа. Подсчитать A=a*x+b, B=c*x+d. Потом проверить что A*x*x = -B. Но тут нужно заранее отсечь случаи, когда abs(A) > abs(B)/(x*x). Тогда переполнений не будет.

    Во-вторых, как же сложно у вас разбор случаев идет. Я не могу разобраться, что там происходит. Там наверняка опечатка, но я даже читать не хочу. Перепишите, пожалуйста. Вам надо найти самый старший ненулевой коэффициент и перебирать его делители. Плюс добавить корень 0, если этот коэффициент не d. Это делается сильно проще так:

    if (d != 0) {
      n = d;
    } else {
      s.push_back(0);
      if (c != 0) {
        n = c;
      } else if (b != 0) {
       n = b;
      } else {
       n = a;
      }
    }
    if (n == 0) {cout << "-1"; return}
    Ответ написан
    2 комментария
  • Найти третью точку правильного треугольника?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Логика у вас правильная - взять середину отрезка AB и отложить от него перпендикуляр длинной sqrt(3)/2*d.

    Но не надо искать углы, вектор перпендикуляр находится тривиально - это {y2-y1, x1-x2} (Можно доказать перпендикулярность через скалярное произведение, например). Более того, длина этого вектора будет уже d (это ведь повернутый на 90 градусов вектор по стороне треугольника). Значит его остается тупо домножить на sqrt(3)/2.

    Таким образом формула x3 = (x1+x2)/2 +sqrt(3)/2*(y2-y1).
    Ответ написан
    Комментировать
  • Где точка M(x,y) принадлежит заштрихованной области?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    x лежит от -2 до 2. y лежит от -4 до кривой f(x). У вас там похоже парабола f(x)=-x^2.
    Ответ написан
    Комментировать
  • Как делить выражение на выражение?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В столбик, как большие числа в школе делили.

    x^5 + 0x^4 + 0x^3 + 0x^2 + 0x - 1  | x^3 - 1
    x^5 + 0   +  0    - x^2           x^2
    0    0      0     +x^2  +  0 - 1


    Отсюда (x^5-1)/ (x^3 - 1) = x^2 + (x^2-1) / (x^3 - 1).
    Ответ написан
  • Какие существуют практические примеры применения арифметики колец и полей?

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

    Но мне нравится такой пазл: есть таблица из лампочек-кнопок n x m. Какие-то горят, какие-то - нет. Можно нажать на какую-то лампочку и она переключится. Но вместе с ней переключатся и 4 соседние лампы (если нажали на угловую кнопку - то только 2). Нужно погасить все лампы за минимальное количество нажатий. Как ее вообще решать без полного или частичного перебора? Важно заметить, что 2 раза нажимать на лампу бессмысленно, потому что эти 2 нажатия просто отменят друг друга. Еще не важно, в каком порядке нажимать на лампы. Конечный результат будет одинаковый.

    А дальше, подключается математика! Введем переменные x_ij - сколько раз мы нажимаем на лампочку в позиции i, j. Эти переменные - это элементы поля по модулю 2. Потому что 2 раза нажать на кнопку - то же самое, что и 0 раз нажать. Составляем линейные уравнения, что сумма нажатий на все кнопки, влияющие на данную лампу - дает 0 или 1 по модулю 2 (в зависимости от того, горит ли эта лампа изначально).

    А дальше эту систему уравнений можно просто решать методом гаусса. Почему? Ведь он работает с вещественными числами? Но нет! Гауссу по-фигу над каким полем работать. Делаем все вычисления по модулю 2 - и получим решение в виде 0 и 1 для всех переменных.

    Поля по модулю простых чисел еще можно, например, использовать для реализации быстрого преобразования фурье для быстрого умножения длинных чисел без использования операций с float, что требуется в стандартной реализации (она вообще с комплексными числами работает). И такая реализация быстрее и точнее.
    Ответ написан
    1 комментарий