首页 > 编程语言 >类欧几里得算法与万能欧几里得算法

类欧几里得算法与万能欧几里得算法

时间:2023-05-27 16:55:06浏览次数:42  
标签:lfloor right frac 欧几里得 rfloor 算法 sum 万能 left

类欧几里得算法与万能欧几里得算法

前置知识

\(\lfloor \frac{a}{b} \rfloor\) 表示 \(a\) 除以 \(b\) 向下取整的结果。

在一定情况下,我们希望将带有「向下取整」的不等式转化为不带有「向下取整」的不等式。方便起见,在下面列出其公式,其中 \(a, b, c, d\) 均为整数:

\[c \le \left \lfloor \frac{a}{b} \right \rfloor < d \iff bc \le a < bd \]

在转化的过程中,通过一些 \(\pm 1\) 可以规避掉一些是否能够整除时的细节。

类欧几里得算法

主要用于求解 floor sum 问题及其变体。即给定 \(n, a, b, c\) 的值,求下式的值:

\[f(n, a, b, c) = \sum_{i = 0}^{n} \left \lfloor \frac{a i + b}{c} \right \rfloor \]

为了便于讨论,钦定 \(a, b \in [0, c)\)。对于 \(a, b \notin [0, c)\) 的情况可以进行转化,具体方法如下:

\[\begin{aligned} f(n, a, b, c) =& \sum_{i = 0}^{n} \left \lfloor \frac{a i + b}{c} \right \rfloor \\ =& \sum_{i = 0}^{n} \left \lfloor \frac{(\left \lfloor \frac{a}{c} \right \rfloor c + a \bmod c) i + \left \lfloor \frac{b}{c} \right \rfloor + b \bmod c}{c} \right \rfloor \\ =& \sum_{i = 0}^{n} \left \lfloor \frac{a}{c} \right \rfloor i + \left \lfloor \frac{b}{c} \right \rfloor + \left \lfloor \frac{(a \bmod c) i + b \bmod c}{c} \right \rfloor \\ =& \frac{n(n + 1)}{2} \left \lfloor \frac{a}{c} \right \rfloor + (n + 1) \left \lfloor \frac{b}{c} \right \rfloor + f(n, a \bmod c, b \bmod c, c) \end{aligned} \]

之后的算法流程中,均确保 \(a, b \in [0, c)\)。

令 \(m = \lfloor \frac{an + b}{c} \rfloor\)。

\[\begin{aligned} f(n, a, b, c) =& \sum_{i = 0}^{n} \left \lfloor \frac{a i + b}{c} \right \rfloor \\ =& \sum_{i = 0}^{n} \sum_{j = 0}^{\left \lfloor \frac{a i + b}{c} \right \rfloor - 1} 1 \\ =& \sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left [j < \left \lfloor \frac{a i + b}{c} \right \rfloor \right ] \\ =& \sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left [j + 1 \le \left \lfloor \frac{a i + b}{c} \right \rfloor \right] \\ =& \sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left [cj + c - b \le a i \right ] \\ =& \sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left [cj + c - b - 1 < a i \right ] \\ =& \sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} \left [\left \lfloor \frac{cj + c - b - 1}{a} \right \rfloor < i \right ] \\ =& \sum_{j = 0}^{m - 1} n - \left \lfloor \frac{cj + c - b - 1}{a} \right \rfloor \\ =& nm - f(m - 1, c, c - b - 1, a) \end{aligned} \]

可以发现,最终 \(a\) 和 \(c\) 的位置将进行交换,也就类似于辗转相除的过程。因此,其复杂度为 \(\mathcal O(n \log n)\),与欧几里得算法相同。

计算 \(f(n, a, b, c)\) 的参考代码如下:

ll f(ll n, ll a, ll b, ll c) {
  ll ac = a / c, bc = b / c, m = (a * n + b) / c;
  if (!a) return (n + 1) * bc;
  if (a >= c || b >= c)
    return n * (n + 1) / 2 * ac + (n + 1) * bc + f(n, a % c, b % c, c);
  return n * m - f(m - 1, c, c - b - 1, a);
}

变体

观察标准 floor sum 的变体 \(g(n, a, b, c)\) 和 \(h(n, a, b, c)\),定义如下:

\[g(n, a, b, c) = \sum_{i = 0}^{n} \left \lfloor \frac{a i + b}{c} \right \rfloor ^2 \\ h(n, a, b, c) = \sum_{i = 0}^{n} i \left \lfloor \frac{a i + b}{c} \right \rfloor \]

g

类似求 \(f(n, a, b, c)\) 的过程,先将 \(a\) 和 \(b\) 对 \(c\) 取模。

\[\begin{aligned} g(n, a, b, c) =& \sum_{i = 0}^{n} \left \lfloor \frac{a i + b}{c} \right \rfloor ^2 \\ =& \sum_{i = 0}^{n} \left \lfloor \frac{(\left \lfloor \frac{a}{c} \right \rfloor c + a \bmod c) i + \left \lfloor \frac{b}{c} \right \rfloor + b \bmod c}{c} \right \rfloor ^2 \\ =& \sum_{i = 0}^{n} \left ( \left \lfloor \frac{a}{c} \right \rfloor i + \left \lfloor \frac{b}{c} \right \rfloor + \left \lfloor \frac{(a \bmod c) i + b \bmod c}{c} \right \rfloor \right ) ^2 \\ =& \frac{n(n + 1)(2n + 1)}{6} \left \lfloor \frac{a}{c} \right \rfloor ^2 + (n + 1) \left \lfloor \frac{b}{c} \right \rfloor ^2 + g(n, a \bmod c, b \bmod c, c) \\ +& \ n(n + 1) \left \lfloor \frac{a}{c} \right \rfloor \left \lfloor \frac{b}{c} \right \rfloor + 2 \left \lfloor \frac{a}{c} \right \rfloor h(n, a \bmod c, b \bmod c, c) + 2 \left \lfloor \frac{b}{c} \right \rfloor f(n, a \bmod c, b \bmod c, c) \end{aligned} \]

再考虑将 \(a\) 和 \(c\) 的位置进行交换。部分过程同 \(f\) 的推导,故省略。

\[\begin{aligned} g(n, a, b, c) =& \sum_{i = 0}^{n} \left \lfloor \frac{a i + b}{c} \right \rfloor ^2 \\ =& \sum_{i = 0}^{n} \sum_{j = 0}^{\left \lfloor \frac{a i + b}{c} \right \rfloor - 1} 2j + 1 \\ =& \sum_{j = 0}^{m - 1} \left (n - \left \lfloor \frac{cj + c - b - 1}{a} \right \rfloor \right ) (2j + 1) \\ =& nm^2 - 2h(m - 1, c, c - b - 1, a) - f(m - 1, c, c - b - 1, a) \end{aligned} \]

跟其他人推出来式子的不太一样,但本质上是相同的。

h

\[\begin{aligned} h(n, a, b, c) =& \sum_{i = 0}^{n} i \left \lfloor \frac{a i + b}{c} \right \rfloor \\ =& \frac{n(n + 1)(2n + 1)}{6} \left \lfloor \frac{a}{c} \right \rfloor + \frac{n(n + 1)}{2} \left \lfloor \frac{b}{c} \right \rfloor + h(n, a \bmod c, b \bmod c, c) \end{aligned} \]

方便起见,令 \(t = \left \lfloor \frac{cj + c - b - 1}{a} \right \rfloor\)。

\[\begin{aligned} h(n, a, b, c) =& \sum_{i = 0}^{n} i \left \lfloor \frac{a i + b}{c} \right \rfloor \\ =& \sum_{j = 0}^{m - 1} \sum_{i = 0}^{n} [i > t] \cdot i \\ =& \sum_{j = 0}^{m - 1} \frac{1}{2} (n - t) (n + t + 1) \\ =& \frac{1}{2} \left [ nm(n + 1) - g(m - 1, c, c - b - 1, a) - f(m - 1, c, c - b - 1, a) \right ] \end{aligned} \]

注意到计算 \(f, g, h\) 的过程中,递归调用的方式都是相同的,因此可以将其打包进行计算。

struct dat {
  ll f, g, h;
  dat() : f(0), g(0), h(0) {}
  dat(ll f, ll g, ll h) : f(f), g(g), h(h) {}
};
inline int sum0(ll n) {
  return n %= mod, (n + 1) % mod;
}
inline int sum1(ll n) {
  return n %= mod, n * (n + 1) % mod * inv2 % mod;
}
inline int sum2(ll n) {
  return n %= mod, n * (n + 1) % mod * (n + n + 1) % mod * inv6 % mod;
}
dat solve(ll n, ll a, ll b, ll c) {
  ll s0 = sum0(n), s1 = sum1(n), s2 = sum2(n);
  ll ac = a / c, bc = b / c, m = (a * n + b) / c;
  if (!a) {
    ll f = s0 * bc % mod;
    ll g = s0 * bc % mod * bc % mod;
    ll h = s1 * bc % mod;
    return dat(f, g, h);
  }
  if (a >= c || b >= c) {
    dat t = solve(n, a % c, b % c, c);
    ll f = (s1 * ac + s0 * bc + t.f) % mod;
    ll g = (s2 * ac % mod * ac + s0 * bc % mod * bc + t.g +
            2 * s1 * ac % mod * bc + 2 * ac * t.h + 2 * bc * t.f) %
           mod;
    ll h = (s2 * ac + s1 * bc + t.h) % mod;
    return dat(f, g, h);
  }
  dat t = solve(m - 1, c, c - b - 1, a);
  ll f = (n * m - t.f) % mod;
  ll g = (n * m % mod * m - 2 * t.h - t.f) % mod;
  ll h = (n * m % mod * (n + 1) - t.g - t.f) % mod * inv2 % mod;
  return dat((f + mod) % mod, (g + mod) % mod, (h + mod) % mod);
}

万能欧几里得算法

类欧几里得算法较为麻烦的地方,在于其对于不同的 floor sum 变体,都需要重新推一遍式子,容易出错。

而万能欧几里得算法则对各类 floor sum 问题的变体,给出了一种更为通用的方法,而代价是常数更大,尽管在大多数情况下并不会被特意去卡。

其实先学了万欧再学的类欧的,笔记先咕咕咕了。

标签:lfloor,right,frac,欧几里得,rfloor,算法,sum,万能,left
From: https://www.cnblogs.com/yaoxi-std/p/17436980.html

相关文章

  • m基于SPA和积译码算法的LDPC误码率matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下: 2.算法涉及理论知识概要       LDPC(Low-densityParity-check,低密度奇偶校验)码是由Gallager在1963年提出的一类具有稀疏校验矩阵的线性分组码(linearblockcodes),然而在接下来的30年来由于计算能力的不足,它一直被人......
  • JVM垃圾收集算法
    JVM垃圾收集算法当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(GenerationalCollection)的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,分代收集理论建立在两个分代假说之上:弱分代假说(WeakGenerationalHypothesis):绝大多数对象都是朝生......
  • m基于负价环N算法的无线传感器网络性能matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要负环的定义:负环是指权值和为负数的环。负环会使图的最短路径计算陷入死循环,因此,存在负环的图不存在最短路。 负环的计算方法:负环有两种计算方法,都是基于Bellman-Ford算法或者SPFA算法。第......
  • 基于QPSK调制和CoSaMP算法的信道估计均衡算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要 均衡器的分类    •均衡处理方法       时域均衡器:单载波数字通信中多采用时域均衡器,从时域的冲激响应考虑       正交频分复用OFDM调制:采用频域均衡    •是否......
  • 操作系统(3.4.2)--实时调度算法的分类
    按调度方式分类:非抢占式调度算法、抢占式调度算法1.非抢占式调度算法1)非抢占式轮转调度算法调度程序每次选择队列中的第一个任务投入运行。当时间片结束后,便把它挂在轮转队列的末尾,等待下次调度运行,而调度程序再选择下一个(队首)任务运行。这种调度算法可获得数秒至数十秒的响应时......
  • m基于FPGA的LDPC最小和译码算法verilog实现,包括testbench和matlab辅助验证程序
    1.算法仿真效果matlab2022a/vivado2019.2仿真结果如下:matlab仿真:0.5码率,H是4608×9216的矩阵。FPGA仿真:对比如下:2.算法涉及理论知识概要LDPC译码分为硬判决译码和软判决译码。硬判决译码又称代数译码,主要代表是比特翻转(BF)译码算法,它的实现比较简单,但是译码性能很差......
  • m基于负价环N算法的无线传感器网络性能matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要负环的定义:负环是指权值和为负数的环。负环会使图的最短路径计算陷入死循环,因此,存在负环的图不存在最短路。负环的计算方法:负环有两种计算方法,都是基于Bellman-Ford算法或者SPFA算法。第一种算法是:统计每个点的......
  • m基于FPGA的LDPC最小和译码算法verilog实现,包括testbench和matlab辅助验证程序
    1.算法仿真效果matlab2022a/vivado2019.2仿真结果如下: matlab仿真: 0.5码率,H是4608×9216的矩阵。   FPGA仿真:    对比如下:   2.算法涉及理论知识概要         LDPC译码分为硬判决译码和软判决译码。         硬判决译码又称......
  • 【无人机任务分配】基于合同网协议(CNP算法)实现多无人机具有时间窗口和优先级约束任务
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 2.3Tucker分解HOSVD、HOOI算法推导和python实现
    HOSVD参考论文:AMULTILINEARSINGULARVALUEDECOMPOSITIONHOSVD虽然不能保证给Tucker分解给出最优拟合,但是可以提供一个好的初始化的解这些矩阵都是正交的。之所以求前R最大特征值,可以在下文的HOOI看到,目的是最大化目标函数UWHOSVD的最后一行证明如下:HOOI:黄色之所以可以化过去,......