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

    @Sumor
    В каждой шутке, есть небольшая доля шутки:
    var testNumber = 123457;
    var testNumberStr = testNumber.ToString();
    if(testNumberStr == string.Join("", testNumberStr.AsEnumerable().OrderBy(c => c)))
    	Console.WriteLine("mono");
    else
    	Console.WriteLine("not mono");
    Ответ написан
  • Можно ли быстрее чем за O(N) подсчитать сумму S(N,K,M) = sum i=0..N K*i%M?

    @Sumor
    Если я правильно понимаю, то это просто арифметическая прогрессия на кольце вычетов по модулю M.
    Так что нужно рассчитать сумму членов арифметической прогрессии по формуле:
    ((K + K*N)/2 * N) % M
    Ответ написан
    1 комментарий
  • Как запрограммировать построение мультипликативной группы по неприводимому многочлену?

    @Sumor
    Биты в мультипликативных группах означают коэффициенты при соответствующих членах многочлена.
    Судя по всему 1001 означает неприводимый многочлен: 1*x^4+0*x^3+0*x^2+1*x^1+1 = x^4+x+1
    По свойствам таких групп достаточно взять любой элемент, кроме единицы и нуля, и его степени дадут вам все элементы.
    Проще всего взять элемент x, который соответствует числу 0010. Перебираем все его степени - получаем все элементы и таблицу умножения. Помним что у нас 1+1 = 0 и плюс равен минусу.
    x^0 = 1 = 0001
    x^1 = x = 0010
    x^2 = 0100
    x^3 = 1000
    x^4 - этот элемент больше нашего многочлена - нужно найти остаток от деления:
    x^4 : (x^4+x+1) = 1 * (x^4+x+1) + x+1 - остаток x+1 = 0011
    x^5 = x^4 * x = (x+1)*x= x^2 + x = 0110
    x^6 = x^5 * x = (x^2 + x)*x = x^3 + x^2 = 1100
    x^7 = x^6 * x = (x^3 + x^2)*x= x^4+x^3 - опять получили больше нашего многочлена - находим остаток от деления
    (x^4+x^3): (x^4+x+1) = 1 * (x^4+x+1) + x^3+x+1 = 1011
    и продолжаем до x^14
    Ответ написан
  • Как из заданного ряда целых чисел найти квадраты (например, 4, 16, 25 и т.д.)?

    @Sumor
    Сравнивая числа ряда со списком квадратов.
    Список квадратов можно последовательно получить складывая нечётные числа:
    1=1
    1+3=4
    1+3+5=9
    1+3+5+7=16
    и т.д.
    Ответ написан
    Комментировать
  • Простая производная?

    @Sumor
    Производная относительно w равна -2*x*w
    Ответ написан
  • Как перебрать все элементы множества в псевдо-произвольном порядке?

    @Sumor
    Небольшой код для перемешивания с помощью порождающего элемента.
    Математическое обоснование основано на теории групп.
    Кратко:
    В конечном поле, мощностью равному простому числу p есть мультипликативная группа, которая включает в себя все элементы кроме нуля.
    В этой мультипликативной группе обязательно есть порождающий элемент.
    Что такое порождающий элемент? Это элемент (a), который можно последовательно возводить в степень и получить все элементы мультипликативной группы, то есть все элементы нашего поля, кроме нуля. Причём единица получится всегда последней. a^(p-1) = 1 (mod p)
    На том, что степени порождающего элемента проходят все элементы ровно по одному разу и построен предложенный алгоритм генерации перестановок. Он не годится для реальных дел, но в некоторых научных или ненаучных целях его можно использовать.
    Нужно взять простое число большее как минимум на 2 максимальной длины строки.
    0 в результате умножения не получается, а 1 будем считать признаком завершения подсчётов, элементы больше длины строки + 2 будем пропускать.
    Для поиска порождающих элементов нужно разложить число (p-1) на множители. Если элемент a является порождающим, то возведение его в степени полученных множителей не должно равняться 1 по модулю p.
    Как только один порождающий элемент найден, то порождающими будут его степени, взаимно простые с (p-1).

    Для примера взял число 19. (19-1)=18=2*3*3
    Проверяем число 2: 2^2 = 4≢1(mod p) 2^3 = 8≢1(mod p) - значит 2 - порождающий элемент.
    Числа 1, 5, 7, 11, 13, 17 - взаимно простые с 18, поэтому 2^1, 2^5, 2^7, 2^11, 2^13, 2^17 - порождающие элементы
    Это числа 2, 3, 10, 13, 14, 15. В данном случае у нас получится 6 вариантов перемешивания.
    И теперь код:
    public static void Main()
      {
        var str = "abcdefghijklmnop";
        Console.WriteLine(str);
        Console.WriteLine(string.Concat(Shuffle(str)));
      }
      private static Random Rnd = new Random((int)DateTime.Now.Ticks);
      public static IEnumerable<char> Shuffle(string str)
      {
        var prime = 19;	
        var makers = new [] {2, 3, 10, 13, 14, 15};
        var maker = makers[Rnd.Next(makers.Length)];
        if(prime < str.Length + 2) throw new Exception("Слишком длинная строка");
        var current = maker;
        while(current != 1)
        {		
          if(current < str.Length + 2)
            yield return str[current - 2];
          current *= maker;
          current %= prime;			
        }
      }
    Ответ написан
    1 комментарий
  • Три игральные кости подбрасывают по одному разу. которая вероятность того, что при этом все числа на трех гранях будут разными?

    @Sumor
    var cntAll = 0;
    var cntCase = 0;
    for(int i = 0; i < 6; i ++)
      for(int j = 0; j < 6; j++)
        for(int k = 0; k < 6; k++)
        {
          cntAll++;
          if(i == j || i == k || j == k)
            continue;
          cntCase++;
        }
    Console.WriteLine((double)cntCase/(double)cntAll);
    Ответ написан
    Комментировать
  • Как найти максимальную площадь?

    @Sumor
    Подозреваю, что максимальная площадь получится, если AB=AC. Это даже можно доказать, взяв равнобедренный треугольник со стороной a и провести рядом другую сторону равную a. Можно показать, что треугольник "выше" всегда больше треугольника "снизу". Т.е. от площади больше отнимается, чем прибавляется.
    Что касается функции, то нужно взять формулу вычисления площади по стороне и двум углам (второй угол будет оптимизирующим аргументом).
    S = 1/2*a^2*sin (180 - α - β)* sin β/sin α
    Ответ написан
    Комментировать
  • Редактор формул?

    @Sumor
    Посмотрите редактор формул от Libre/Open office. Вставка -> Объект -> Формула
    Там можно и мышкой потыкать, и текстом забить формулу (LaTeX).
    Ответ написан
    Комментировать
  • Как проверить в данной задаче можно ли делить чисто на 3 последнюю цифру?

    @Sumor
    Формулировка задания, я бы сказал очень неточная, но отвечаю так как я её понял.
    "Нужно найти разбиение стоимости на пяти- и трёхкопеечные монеты без остатка"
    Для стоимости более 15 копеек такое разбиение всегда можно найти. Для цены до 15 копеек возможность разбиения находится перебором.
    Для определения минимального количества трёхкопеечных монет смотрим на остаток деления на 5:
    остаток 0 - 0 (или 5) трёхкопеечных монет
    остаток 1 - 2 трёхкопеечных монеты
    остаток 2 - 4 трёхкопеечные монеты
    остаток 3 - 1 трёхкопеечная монета
    остаток 4 - 3 трёхкопеечные монеты
    Количество пятикопеечных монет считаем исходя из количества трёхкопеечных.

    NB: трёхкопеечные, а также пятикопеечные монеты пишутся вместе. Если вы пишите количество монет и не хотите склонять их названия, пишите количество после наименования: трёхкопеечных монет - 5.
    Ответ написан
    Комментировать
  • Как сравнить произвольные фигуры?

    @Sumor
    Прежде чем сравнивать нарисованные круги с эталонным, нужно определиться с мерой по которой вы будете сравнивать. Возможные варианты мер:
    1. Радиус.
    2. Площадь.
    3. Расположение центра
    Про расположение центра вам уже написали.
    Площадь можно посчитать в точках, расположенных внутри нарисованной фигуры (Цикл по x и y - проверяете принадлежность точки нарисованной фигуре).
    Для подсчёта радиуса нужно выбрать количество разбиений круга - 360, 100, 50 и подсчитать отклонение (линейное, квадратичное или любое подходящее) радиуса по указанным направлениям. В простейшем случае можно просто подсчитать максимальный и минимальный радиус нарисованного круга и сравнивать их.
    Ответ написан
    Комментировать
  • Какая точность должна быть, чтобы избежать погрешности при пересчёте?

    @Sumor
    Ну для начала если у вас слагаемые amount имеют точность 0,01, то сумма (в предельном случае) будет иметь точность до 0,01*N, где N - количество слагаемых. У нас конечно есть центральная предельная теорема, которая говорит, что в среднем худшего случая не будет и матожидание суммы будет сумма слагаемых, но всё равно точность суммы будет хуже (больше), чем 0,01.

    Производя операцию
    percent[i] = amount[i] * 100 / Sum
    amount[i] имеет точность 0,01, Sum - 0,01*N
    Считаем точность вычислений percent: она получается от 0,01*100/(Sum + 0,01*N) до 0,01*100/(Sum - 0,01*N)
    Если пренебречь точностью Sum, и сумма у вас меньше 100, то погрешность будет точно больше 0,01 - отсюда несовпадение обратных преобразований.

    Методика тут указана примерная, насколько я помню математическое образование :)
    Точность в данном случае немного неверный термин. Ищите по словосочетанию "расчёт погрешности"
    Ответ написан
  • Можно ли при ассимметричном шифровании использовать две пары ключей?

    @Sumor
    Нужно понимать, что преподаватель даёт вам материал последовательно, от простого к сложному. Поэтому примеры даны с некоторыми упрощениями. В реальной жизни всё посложнее.
    В примере, предложенном преподавателем предполагается, что генератором ключей для первого и второго пользователя используются одни значения p и q. Например, они генерируют ключи в одном месте, в специальной комнате на специальном компьютере.
    Каждый получил свою пару ключей - e1 и d1 первый, e2 и d2 второй. И разъехались по разным офисам - один на Аляску, другой в Майями.
    Ключи e1 и e2 считаются открытыми и могут быть свободно обменены по любым каналам связи. Открытые ключи вообще могут хранится на какой-либо открытой площадке.
    Поэтому когда первому нужно связаться со вторым, он берёт свой открытый ключ второго из открытых источников. Шифрует сообщение открытым ключом второго - после этого только второй может его прочитать, так как для этого необходим закрытый ключ второго.
    Но второй не будет уверен в личности написавшего. Поэтому зашифрованное сообщение подписывается закрытым ключом первого.
    Сообщение отсылается второму. Второй берёт открытый ключ первого, доступный в открытом доступе и "снимает" подпись. Затем, используя свой закрытый ключ, расшифровывает сообщение. Если после этих процедур он получил осмысленный текст - значит текст был действительно отправлен первым.
    Ответ написан
  • Есть ли простой в реализации алгоритм нахождения простых чисел?

    @Sumor
    Для больших чисел поиск решетом Эратросфена долгий, поэтому используется тест Ферма
    Подробнее и с реализацией
    Ответ написан