Добрый вечер.
Пару дней назад опубликовал статью на Хабре про БПФ. Постарался объяснить и доказать всё без матриц (как на e-maxx), потому что не умею с ними еще работать на интуитивном уровне. Там точно также есть код и оптимизации (кстати, одной очень важной - прекалк корней, на e-maxx нет).
Если кому-нибудь помогло разобраться - буду рад.
Среднее время выполнения: 0.58 секунды
Максимальное время выполнения: 1.484 секунды из 4 секунды, 37.1%
Использовано памяти: 6000 KB из 65536 KB, 9.2%
http://www.fftw.org/index.html
Там, конечно, народ мегашарит в FFT. Но разбираться было сильно влом.
А вообще есть следующая идея, как ускорить FFT в два раза. Так как массивы вещественные, то можно работать только с одной половиной массива а вторая восстанавливается однозначно и очень легко по первой. Можно даже совсем все делать в вещественных и числах, но код жуткий получается. Так делал Виталий Неспирный в своей задаче с зимней школы
http://pastie.org/1879332
Можно попробовать эту идею.
Погуглите преобразование Хартли. Я когда то давно писал - оно работает быстрее fft, во всяком случае, моего. Возможно, поможет.
FFT в комплексных числах (по идям Жукова с Зимней Школы 2011) зашло на SPOJ за 2.47 сек
P.S.: То же решение на e-olimp прошло за 750 ms
На spoj и ограничение по времени меньше и сами ограничения на входные данные больше, да плюс ещё и тесты - мультитестовые.
Значит нужно продолжать оптимизировать решение.
Я спросил в личку, но что-то ты не ответил :о)
Для длинного умножения зачем использовать комплексные числа, а не поле вычетов? В первом случае есть не нулевой шанс напороться на погрешность, правильно?
А какие еще оптимизации? Или просто код целиком по-другому написан?
Думаю, что посмотрю лекцию еще раз, когда приеду домой.
Скоро попробую на больших
а тоже самое, но в целых числах работает на 25-30 % быстрее
Но вообще говоря я перед собой ставил цель показать, что это достаточно просто.
Разгоняет в два раза.