闲话 24.6.18
闲话
闲话好久没更了。今天来点凑数的 /cy
最近在帮 jjdw 做[数据删除]。恶心死我了 /fn
还好搞出了点成果[数据删除]。
你聪明的,告诉我,我们的多项式科技为什么一去不复返呢?
看到 uq 有一个级数求和,尝试证明无果
把我的结果扔到闲话里给大家乐呵乐呵
构式
证明:
注意到令
答案即 \(\left(xF(x^6)\right)'\big\rvert_{x = 1/2}\)。扔进 mma 可以知道
其中 \(K(x)\) 为第一类完全椭圆积分。
呃……
快进到结果:
它和 \(3\ln 2-2\) 在前 300 位都是一样的 😃
今日推歌:中间灰 by 不鱼_p feat. 海伊
你会笑我吗?
所以为什么不使用 2log 多项式复合呢?
我们经常能遇到这样一类经典问题:
给定 \(f(x), g(x), n, m\),对每个 \(0\le k \le m\) 计算 \(a_k = [x^n] g(x) f(x)^k\)。
其中 \(f(x), g(x)\) 不一定具有简单的封闭形式。下面分情况整理一下做法。
已经知道了多项式复合(逆)可以在 \(O(\text M(n) \log n)\) 的复杂度内完成。
\(1.\) \(f(x), g(x)\) 为截断到 \(x^n\) 项的多项式。
最简单的一种情况。知道 \([x^n] g(x) f(x)^k\) 为多项式
的前 \(m + 1\) 项系数。应用 Bostan-Mori 方法即可在 \(O(\text M(n) \log n)\) 的复杂度内解决。
code
poly enum_kth(const poly& f, const poly& g, int n, int m) {
if (n < 0 or m <= 0) return poly();
poly P(n + 1), Q((n + 1) << 1);
copy_n(g.f.cbegin(), min(P.size(), g.size()), P.f.begin());
Q.f.front() = 1;
if (f.size()) for (int i = n + 1, j = 0; i < Q.size() and j < f.size();) Q[i ++] = (f[j] == 0 ? 0 : mod - f[j]), ++ j;
auto quad_nonres = [&](){ for(int i = 2; ; ++ i) if (qp(i, mod >> 1) == mod - 1) return i; };
auto sylow2_subgroup_gen = [&](){ return qp(quad_nonres(), mod >> __builtin_ctz(mod - 1)); };
auto get_root = [&](int m) {
vu32 root = {ginv(2)};
array<int, __builtin_ctz(mod - 1) - 1> irt;
irt.back() = qp(sylow2_subgroup_gen(), mod - 2);
for(int i = __builtin_ctz(mod - 1) - 3; i >= 0; -- i) irt[i] = 1ll * irt[i + 1] * irt[i + 1] % mod;
int s = (int)root.size();
if (s < m) {
root.resize(m);
for (int i = __builtin_ctz(s), j; (1 << i) < m; ++ i) {
root[j = (1 << i)] = irt[i];
for (int n = j + 1; n < (j << 1); ++ n)
root[n] = 1ll * root[n - j] * root[j] % mod;
root[j] = 1ll * root[j] * root.front() % mod;
}
} return root;
};
for (int d = 1; n != 0; d <<= 1, n >>= 1) {
const int lg_len = lg((2 * d + 1) * (2 * n + 2) - 1) + 1, len = 1 << lg_len;
poly P_(len), Q_(len), U(len / 2), V(len / 2);
for (int i = 0; i < d; ++ i) copy_n(P.f.cbegin() + i * (n + 1), n + 1, P_.f.begin() + i * (2 * n + 2));
for (int i = 0; i <= d; ++ i) copy_n(Q.f.cbegin() + i * (n + 1), n + 1, Q_.f.begin() + i * (2 * n + 2));
ntt(P_.data(), lg_len); ntt(Q_.data(), lg_len);
if (n & 1) {
auto root = get_root(len >> 1);
for (int i = 0; i < len; i += 2) {
U[i / 2] = 1ll * (1ll * P_[i] * Q_[i + 1] % mod - 1ll * P_[i + 1] * Q_[i] % mod + mod) * root[i / 2] % mod;
V[i / 2] = 1ll * Q_[i] * Q_[i + 1] % mod;
}
} else {
auto root = get_root(1);
for (int i = 0; i < len; i += 2) {
U[i / 2] = 1ll * (1ll * P_[i] * Q_[i + 1] + 1ll * P_[i + 1] * Q_[i]) % mod * root[0] % mod;
V[i / 2] = 1ll * Q_[i] * Q_[i + 1] % mod;
}
}
intt(U.data(), lg_len - 1), intt(V.data(), lg_len - 1);
P.f.assign((2 * d) * (n / 2 + 1), 0);
Q.f.assign((2 * d + 1) * (n / 2 + 1), 0);
for (int i = 0; i < (d << 1); ++ i) copy_n(U.f.cbegin() + i * (n + 1), n / 2 + 1, P.f.begin() + i * (n / 2 + 1));
for (int i = 0; i <= (d << 1); ++ i) copy_n(V.f.cbegin() + i * (n + 1), n / 2 + 1, Q.f.begin() + i * (n / 2 + 1));
} P.resize(m), Q.resize(m);
return (P / Q).resize(m);
};
\(2.\) \(f(x)\in F_p[[x]], \text{ord } f(x) = 1\)。
设 \(h(x) = f^{\langle -1 \rangle}(x)\),应用另类拉格朗日反演有
用 2log 多项式复合就有点脱裤子放屁
当然鰰的意思可能是当 \(f(x), g(x)\) 有封闭形式的时候,由于 \(f(x)\) 是 \(x\phi(x)\) 的形式,\(h(x)\) 也可以简单地牛迭出来,并且复合 \(g(x)\) 也不很困难。这样总复杂度可能是 \(O(n\log n)\)。
\(3.\) \(f(x)\in F_p[[x]], \text{ord } f(x) > 1\)。
只需要将 \(f(x)\) 转化成阶为 \(1\) 的情况即可。令 \(d = \text{ord } f(x), c = f[d]\),则 \(F(x) = \sqrt[d]{f(x)/c}\) 满足 \(2.\) 情况。此时
下同 \(2.\)。
\(4.\) \(f(x)\in F_p[[x]], \text{ord } f(x) = 0\)。
令 \(f(x) = F(x) + c\)。由 \(2., 3.\) 讨论,不妨令 \(\text{ord } F(x) = 1\)。此时令 \(h(x) = F^{\langle -1 \rangle}(x)\),有
这样就将 \(f(x)\) 归约到了 \(x + c\) 上。二项展开后卷积即可 \(O(\text M(n))\) 解决这一部分。
\(5.\) \(f(x)\) 为形式 laurent 级数。
若 \(f(x) = x^{-c} \phi(x)\)(\(c > 0\)),则 \(f(x)^{-1} = x^c \phi^{-1}(x)\) 为一个阶为 \(c\) 的形式幂级数。因此令形式幂级数 \(F(x) = f(x)^{-1}\),有
参照 \(2., 3.\) 解决即可。
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/-/chitchat240618。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。