Блог пользователя knock-knock

Автор knock-knock, 13 лет назад, По-русски
В Харьковской ЗКШ 2011 была задача http://pastebin.com/cZbTuvbg
Вот мой код по ней, который я оптимизировал как только мог http://pastebin.com/X9ah6Ee4
И это решение получает ТЛ.
Я предподсчитал корни из 1, все операции со степенями двойки заменил на битовые.

Если использовать тип float то WA из-за точности, но в тайм вкладывается.
На практике Фурье в модульной арифметике работает дольше, так что пишу в комплексных числах.

Что еще можно оптимизировать в коде? Может что-то кардинально поменять?
Может я делаю какие-то лишние операции?
  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Сейчас, Вы, делаете 12 fft, можно сделать через 9, а можно еще меньше, ищите, эта задача уже разбиралась здесь.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Написал версию, где делается 9 fft.
    Все-равно таймит :(
    Попытаюсь сегодня разобраться в способе, где делается 5 fft..
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Да, и еще там указывалось, что преобразование Фурье можно делать раза в 4 быстрее (при желании). 
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Интересно увидеть версию fft быстрее моего.
    Я просто уже  ничего ускорить не могу)
    • 13 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      Вряд ли вы напишете его на соревновании :)

      Схема Кули-Тьюки порядка 2 не является оптимальной, разумеется. 

      Кстати (в симметричной нормировке) дважды примененное прямое преобразование дает ту же самую последовательность, развернутую в обратную сторону ( F(F(X))[i] = X[-i], понимая последовательность как циклическую по модулю N, индексы с 0, т.е. 0 на месте).

      Кстати 2. Если входной сигнал вещественный, можно ускорить преобразование Фурье в 2 раза.

      Кстати 3. Если результат вещественный, можно ускорить преобразование Фурье в 2 раза (что-то вроде разности между вещественной и мнимой частью преобразования Фурье, взятого от последовательности (сумма вещественной и мнимой части начальной) ).

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
про комплексные числа и модульную арифметику спорное утверждение, ищите по кодфорсес, я уже выкладывал исходник фурье с модульной арифметикой.
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Вы умножаете два многочлена степени  M = 2N, для этого берется 2(N + 1) коэфициентов. А что будет если взять всего 2N ? Вроде бы соответствующие коэфициенты должны сложиться парами. Разве это не то что нам надо? Я вроде это доказывал, но сейчас третий час ночи и вспоминать неохота.
Надо просто уменьшить число коэфициентов в два раза, до 2N
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Да, это действительно будет так :)
    Cпасибо! С этой оптимизацией и с 9-ми вызовами fft получил OK.

    Кому интересно почему 9 вызовов:
    обратное fft я использую только один раз в конце, а не на каждую букву отдельно. То есть, я суммирую значения четырех многочленов в точках-корнях из 1, а потом один раз делаю обратное быстрое преобразование Фурье, получаю массив-результат.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Оно, вроде, и с 2N+1 проходило, если 9 вызовов делать.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        С 2N+1 у меня не проходило, если 9 вызовов..Функция fft такая же как в коде, ссылка на какой в посте.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    можно поточнее описать что мы получим если возмем 2^n коэффициентов вместо 2^(n+1) ?
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Вот здесь в "разборе" задача А.
      Нашел бы раньше этот разбор, поста бы не было :)
      • 13 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

        Хороший пост, не про "жену программиста". если бы небыло поста я бы не узнал этой фичи. И я бы не сдал эту задачу. кстати у меня зашло на e-olimp, с++ Максимальное время выполнения: 1.562 секунды из 2 секунды, 78.1%

        9 fft на 2^m в целых числах 

  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    сдал решение с 5тьма вызовами fft.
    Если кому-то интересно, выложу код, спрашивайте.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А попробуйте написать свой класс коплексных чисел, у нас вроде со своим гораздо быстрее работало.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
а где можно сабмитить данную задачу?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Она вроде на ГП Харькова на ОпенКапе была
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Здесь, кстати, не проходит ни одно из моих решений, даже то, что на оффсайте получает ОК.
      • 13 лет назад, # ^ |
          Проголосовать: нравится +4 Проголосовать: не нравится
        Значит есть повод оптимизировать свою реализацию fft.
        Мы стараемся ставить ограничения по времени и памяти пожёстче. Одно дело - реальный 5-ти часовой контест, и другое - возможность посидеть, подумать сколько душе угодно и заняться оптимизацией алгоритма.
        Сделано это исключительно в учебно-тренировочных целях.
        • 13 лет назад, # ^ |
          Rev. 3   Проголосовать: нравится +13 Проголосовать: не нравится

          Это не вы стараетесь ставить ограничения пожестче. Это ваш сервер медленный (да еще и глючный). Я ради интереса открыл сборник с Зимней школы, лимиты на "ДНК роботов" те же (и на другие задачи тоже).


          UPD. Ссылка на сборник с ЗКШ (для желающих поставить мне минус). Скорость скачивания ужасная, но ничего не поделаешь...