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

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

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

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

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

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

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

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

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

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

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

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

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