「学习笔记」类欧几里得算法

· · 算法·理论

类欧几里得算法是用于在 \mathcal O(\log n) 的复杂度内求解下式的算法:

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

首先考虑 a \ge cb \ge c 的情况:

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

接下来考虑 a \lt cb \lt c 的情况:

\begin{aligned} f(a,b,c,n)&=\sum_{i=0}^n\left\lfloor\dfrac {ai+b} c\right\rfloor\\ &=\sum_{i=0}^n \sum_{j=0}^{\left\lfloor\frac {ai+b} c\right\rfloor-1} 1 \end{aligned}

m=\left\lfloor\dfrac {an+b} c\right\rfloor,继续推式子:

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

容易发现,在函数 f 中,a,c 是在不断交换和取模的,是辗转相除的过程,和欧几里得算法十分类似,时间复杂度即为 \mathcal O(\log n)

类欧几里得算法也有许多拓展,例如下面的两个求和式:

g(a,b,c,n)=\sum_{i=0}^ni\left\lfloor\dfrac {ai+b} c\right\rfloor\\ h(a,b,c,n)=\sum_{i=0}^n\left\lfloor\dfrac {ai+b} c\right\rfloor^2

我们分别考虑如何求值。

对于函数 g,首先考虑 a \ge cb \ge c 的情况:

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

接下来考虑 a \lt cb \lt c 的情况:

\begin{aligned} f(a,b,c,n)&=\sum_{i=0}^n i\left\lfloor\dfrac {ai+b} c\right\rfloor\\ &=\sum_{i=0}^n \sum_{j=0}^{\left\lfloor\frac {ai+b} c\right\rfloor-1} i \end{aligned}

m=\left\lfloor\dfrac {an+b} c\right\rfloor

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

k=\left\lfloor\dfrac {cj+c-b-1} a\right\rfloor

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

对于函数 h,我们首先考虑下面的等式:

n^2=\left(\sum_{i=1}^n i\right)-n

我们可以利用这个等式,避免出现两个求和式的乘积。

接下来考虑 a \ge cb \ge c 的情况:

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

最后考虑 a \lt cb \lt c 的情况:

\begin{aligned} h(a,b,c,n)&=\sum_{i=0}^n\left\lfloor\dfrac {ai+b} c\right\rfloor^2\\ &=\sum_{i=0}^n \left(\left(2\sum_{j=1}^{\left\lfloor\frac {ai+b} c\right\rfloor} j\right)-\left\lfloor\dfrac {ai+b} c\right\rfloor\right)\\ &= \left(2\sum_{i=0}^n\sum_{j=1}^{\left\lfloor\frac {ai+b} c\right\rfloor} j\right)-\sum_{i=0}^n \left\lfloor\dfrac {ai+b} c\right\rfloor\\ &= \left(2\sum_{i=0}^n\sum_{j=0}^{\left\lfloor\frac {ai+b} c\right\rfloor-1} (j+1)\right)-f(a,b,c,n) \end{aligned}

m=\left\lfloor\dfrac {an+b} c\right\rfloor

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

k=\left\lfloor\dfrac {cj+c-b-1} a\right\rfloor

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

同时计算 f,g,h 即可,时间复杂度同样为 \mathcal O(\log n)