2025.7.18 闲话

介于有人问 EI 的取模还原分数是什么道理,并且 EI 也没有解释 . 我通过逆向工程大概解释一下正确性,个中道理可能涉及深刻就不解释了(

问题:给定 \(p\in\mathbb P,q\),求尽可能小的 \(a,b\) 使得 \(\frac ab\equiv q\pmod p\) .

动态维护 \((x,y,a,b)\) 使得 \(\frac xa\equiv\frac yb\equiv q\pmod p\)(初始取 \((x,y,a,b)=(q,p,1,0)\)),每次迭代:

\[(x,y,a,b)\to\left(y\bmod x,x,b-\left\lfloor\frac yx\right\rfloor a,a\right) \]

\(x\) 足够小时停止 .

Remark.

考虑到:

\[x\equiv qa\pmod p\qquad y\equiv qb\pmod p \]

右边减 \(\left\lfloor\frac yx\right\rfloor\) 倍的左边:

\[y-\left\lfloor\frac yx\right\rfloor x\equiv qa-q\left\lfloor\frac yx\right\rfloor b\pmod p \]

也即

\[y\bmod x\equiv q\left(a-\left\lfloor\dfrac yx\right\rfloor b\right)\pmod p \]

这里 \(x,y\) 的降落速度由 Euclid 算法给出,由于有 \(x,y\) 可以立得唯一的 \(a,b\) 所以 \(a,b\) 的降落速度可以不用管 .

附带 EI 代码压行版:

pair<int, int> approx(int p, int q, int A) // x <= A
{
	int x = q, y = p, a = 1, b = 0;
	while (x > A) tie(x, y, a, b) = make_tuple(y % x, x, b - y / x * a, a);
	return make_pair(x, a);
}

upd. 请看 killer_joke 的解释 .

posted @ 2025-07-18 10:56  Jijidawang  阅读(149)  评论(0)    收藏  举报
😅​