Операции над многочленами (1-е апреля 2019)

  1. Действия над F2 (разминка)
    1. Умножение за O(nm/w)
    2. Деление за O((n-m)m/w)
    3. gcd за O(nm/w) // (n+m)min(n,m) = Θ(nm)

  2. Умножение многочленов
    1. Над F2 = O(nm/w)
    2. Над произвольным кольцом есть O(nm) и Карацуба O(nlog2(3))
    3. Над комплексными числами (а, значит, и R, и Z) есть FFT за O(nlogn)

  3. Деление многочленов
    1. Определение деления: хотим из A длины n и B длины n получить такой C длины n, что у A и BC совпадают n старших коэффициентов
    2. Основная лемма: старшие k С зависят только от старших k A и старших k B
    3. Деление за квадрат: cn-1 = an-1/bn-1, ci = (ai - cn-1bi - cn-2bi+1 - ...) / bn-1
    4. Разделяй и властвуй: Div(A,B,n): C1 = Div(A,B,n/2), C2 = Div(A-BC1,B,n/2), return concat(C1, C2)
    5. Время работы T(n) = 2T(n/2) + Mul(n) = или O(nlog2n), или O(nlog2(3)) в зависимости от реализации Mul

  4. Деление многочленов за O(nlogn)
    1. reverse(A) = AR, заметим, что (BC)R = BRCR
    2. Определение деления новыми словами. A, B → C: AR = (BC)R mod xn
    3. Обращение ряда: получаем n первых членов обратного к A, за O(Mul(n)) AA-1 = 1 mod xn
    4. Получаем CR = (BR)-1AR (обращение ряда)