Фурье (4 апреля 2014)
- Ускоряем Фурье
- a * b * c : 3 Фурье + O(n) + 1 обратное Фурье
- Два вещественных в одном: zi = xi + iyi, fxi = (fzi + fzn-i)/2
- Для длинных чисел выбираем систему счисления
- base * len2 < 1018, len = 220 > 106 ⇒ base < 106 &rArr base = 104 или 105
- Поскольку все равно длина округляется до степени двойки, то base = 104 и 220 ⇒ 218
- Итого: для подсчета a * b * c чисел длины до 220/3 в десятичной системе счисления
- Раньше нужно было 2 * 3 Фурье над числами длины 220 (т.к. длина произведения двух длины 220/3, округленная вверх до степени двойки = 220)
- Теперь нужно 2 + 1 Фурье над многочленом длины 218 (в 2 раза меньше преобразований над числами длины в 4 раза меньше)
- Т.е. быстрее стало в 2 * 4 = 8 раз. При этом код собственно преобразования Фурье мы не трогали.
- Длинная арифметика
- Если есть умножение, и деление и извлечение корня проще всего написать через бинпоиск.
- Веществвенное число = челое + храним сдвиг (сколько знаков после запятой).
- Деление многочленов за O(nlog2n) через разделяй и властвуй
- Деление длинных чисел за O(nlogn) с помощью метода Ньютона
- Извлечение корня из длинного числа за O(nlogn) с помощью метода Ньютона
- Задачи на Фурье
- Посчитать скалярный сдвиг, минимизирующий скалярное произведение
- Поиск циклического сдвига, максимизирующего количество совпавших символов (алфавит = ACGT)
- Поиск подстроки в строке, если в обоих есть "?" -- символ, равный любому
- Поиск подматрицы в матрице, минимизируюем среднеквадратичное отклонение
- Динамика
- В дереве найти количество поддеревьев размера s
- В дереве найти количество независимых множеств размера s