万能欧几里得算法

2.6k 词

问题描述

给出一个幺半群 (S,)(S, \cdot) 和元素 u,rSu, r \in S,以及一条直线 y=ax+bcy = \frac{a x + b}{c}
画出平面中所有坐标为正整数的横线和竖线,维护一个 ff,初值为单位元 ee
从原点出发,先向 yy 轴正方向走直到到达直线与 yy 的交点,然后沿直线走一直走到与 x=nx = n 的交点为止。
每当经过一条横线时,执行 ffuf \gets fu,经过一条竖线时执行 ffrf \gets fr。特别地,在 yy 轴上行走时不考虑竖线,同时经过横线和竖线时先执行前者。
求最终的 ff。记为 euclid(a,b,c,n,u,r)\mathrm{euclid}(a, b, c, n, u, r)
其中 a,b0,n,c>0a, b \ge 0, n, c > 0

万能欧几里得算法

分情况考虑。

m=an+bcm = \lfloor\frac{an + b}{c}\rfloor

m=0m = 0 时,答案为 rnr ^ n

bcb \ge c,即 bc1\frac{b}{c} \ge 1 时,在 yy 轴上行走的贡献为 ubcu ^ {\lfloor\frac{b}{c}\rfloor},而剩余部分相当于 y=ax+(bmodc)cy = \frac{ax + (b \bmod c)}{c} 时的答案,因此答案为 ubceuclid(a,bmodc,c,n,u,r)u ^ {\lfloor\frac{b}{c}\rfloor} \mathrm{euclid}(a, b \bmod c, c, n, u, r)

(图片来源于同学课件)

aca \ge c,即 ac1\frac{a}{c} \ge 1 时,任意相邻两个 rr 之间至少有一个 uu 的贡献,考虑将这个贡献算到 rr 上,也就是 rurr \gets ur
此时我们需要改变直线使得相邻两个 rr 之间都恰好减少一个 uu 的贡献。
可以发现相邻两个 rr 之间 uu 的贡献的数量是由两个 rryy 坐标的差值决定的,因此相当于时相邻两个 rryy 坐标的差值都减少 11,相当于斜率减 11。因此直线变为 y=(ac)x+bcy = \frac{(a - c)x + b}{c}
重复这个过程即可得到答案为 euclid(amodc,b,c,n,u,uacr)\mathrm{euclid}(a \bmod c, b, c, n, u, u ^ {\lfloor\frac{a}{c}\rfloor} r)

剩余的最后一种情况就是 a<ca < cb<cb < c。考虑将平面沿 y=xy = x 对称。对于同时遇到 u,ru, r 的问题,可以将直线向右平移 1c\frac{1}{c}


可以把贡献拆成三部分,第一次 uu 及以前,中间部分和最后一次 uu 之后。
第一部分答案为 rcb1aur ^ {\lfloor\frac{c - b - 1}{a}\rfloor} u
第三部分考虑原直线最后一个 uu 的位置为 y=an+bc=my = \lfloor\frac{an + b}{c}\rfloor = m,对称后即为 x=mx = m,此时 y=cmb1ay = \frac{c m - b - 1}{a},因此有 ncmb1an - \lfloor\frac{c m - b - 1}{a}\rfloorrr 的贡献,答案为 rncmb1ar ^ {n - \lfloor\frac{c m - b - 1}{a}\rfloor}
对于第二部分,考虑截掉前两部分,也就是保留 x=mx = m 以前(包含)的部分,然后将直线左移 11,下移 cb1a\lfloor\frac{c - b - 1}{a}\rfloor


因此这部分答案为 euclid(c,(cb1)moda,a,m1,r,u)\mathrm{euclid}(c, (c - b - 1) \bmod a, a, m - 1, r, u)

综合一下即可得到:

euclid(a,b,c,n,u,r)={rnm=0ubceuclid(amodc,bmodc,c,n,u,uacr)acbcrcb1aueuclid(c,(cb1)moda,a,m1,r,u)rncmb1aotherwise\mathrm{euclid}(a, b, c, n, u, r) = \begin{cases} r ^ n & m = 0 \\ u ^ {\lfloor\frac{b}{c}\rfloor} \cdot \mathrm{euclid}(a \bmod c, b \bmod c, c, n, u, u ^ {\lfloor\frac{a}{c}\rfloor} r) & a \ge c \lor b \ge c \\ r ^ {\lfloor\frac{c - b - 1}{a}\rfloor} u \cdot \mathrm{euclid}(c, (c - b - 1) \bmod a, a, m - 1, r, u) \cdot r ^ {n - \lfloor\frac{c m - b - 1}{a}\rfloor} & \text{otherwise} \end{cases}

时间复杂度分析

设一次乘法的复杂度为 O(T)O(T),则复杂度为 O(Tlog(a+c)log(a+n+c))O(T \log(a + c) \log(a + n + c))

留言