对于一个多项式的指数函数必须泰勒展开才能求解。


概述

给定一个 $n - 1$ 次多项式 $A(x)$,你需要求出多项式 $B(x)$ 满足 $B(x) \equiv \exp(A(x)) \pmod{x ^ n}$。其中保证 $[x ^ 0]A(x) = 0$。


思路

按照套路先对两边同时取自然对数,得到:

$$ \ln B(x) \equiv A(x) \pmod{x ^ n} $$

变形得到:

$$ \ln B(x) - A(x) \equiv 0 \pmod{x ^ n} $$

定义函数 $G(F(x)) = \ln F(x) - A(x)$,参考「算法笔记」泰勒公式和牛顿迭代法 中的式子可以得到:

$$ F(x) \equiv F_0(x) - \frac{G(F_0(x))}{G'(F_0(x))} \pmod{x ^ n} $$

直接倍增计算,边界为 $n = 1$ 时 $F(x) = 1$。

时间复杂度:$\mathcal O(n \log n)$。


代码

Vec exp(Vec A) {
    assert(A[0] == 0);
    int n = A.size(), N = extend(n);
    A.resize(N);
    Vec E(N, 0);
    E[0] = 1;
    for (int l = 2; l <= N; l <<= 1) {
        Vec P = (-ln(fix(E, l)) + fix(A, l) + 1) * fix(E, l);
        std::copy(P.begin(), P.begin() + l, E.begin());
    }
    E.resize(n);
    return E;
}
最后修改:2019 年 08 月 05 日
如果觉得我的文章对你有用,请随意赞赏