Операции над многочленами (1-е апреля 2019)
- Действия над F2 (разминка)
- Умножение за O(nm/w)
- Деление за O((n-m)m/w)
- gcd за O(nm/w) // (n+m)min(n,m) = Θ(nm)
- Умножение многочленов
- Над F2 = O(nm/w)
- Над произвольным кольцом есть O(nm) и Карацуба O(nlog2(3))
- Над комплексными числами (а, значит, и R, и Z) есть FFT за O(nlogn)
- Деление многочленов
- Определение деления: хотим из A длины n и B длины n получить такой C длины n, что у A и BC совпадают n старших коэффициентов
- Основная лемма: старшие k С зависят только от старших k A и старших k B
- Деление за квадрат: cn-1 = an-1/bn-1, ci = (ai - cn-1bi - cn-2bi+1 - ...) / bn-1
- Разделяй и властвуй: Div(A,B,n): C1 = Div(A,B,n/2), C2 = Div(A-BC1,B,n/2), return concat(C1, C2)
- Время работы T(n) = 2T(n/2) + Mul(n) = или O(nlog2n), или O(nlog2(3)) в зависимости от реализации Mul
- Деление многочленов за O(nlogn)
- reverse(A) = AR, заметим, что (BC)R = BRCR
- Определение деления новыми словами. A, B → C: AR = (BC)R mod xn
- Обращение ряда: получаем n первых членов обратного к A, за O(Mul(n)) AA-1 = 1 mod xn
- Получаем CR = (BR)-1AR (обращение ряда)