描述
给定多项式 G(x,y),已知多项式 f(x) 满足:
G(x,f(x))≡0(modxn)
且存在数值 f1 使 G(x,y) 满足以下条件:
- G(0,f1)=0;
- ∂y∂G(0,f1)=0。
求出模 xn 意义下的 f(x)。
Newton’s Method
考虑倍增。
首先当 n=1 时,[x0]G(x,f(x))=0 的解需要单独求出,假设中的 f1 即为一个解。
假设现在已经得到了模 x⌈2n⌉ 意义下的解 f⌈2n⌉(x),要求模 xn 意义下的解 f(x)=fn(x)。
将 G(x,f(x)) 对 f(x) 在 f(x)=f⌈2n⌉(x) 处进行泰勒展开,有:
i=0∑+∞i!∂yi∂iG(x,f⌈2n⌉(x))(f(x)−f⌈2n⌉(x))i≡0(modxn)
因为 f(x)−f⌈2n⌉(x) 的最低非零项次数最低为 ⌈2n⌉,故有:
∀2⩽i:(f(x)−f⌈2n⌉(x))i≡0(modxn)
则:
i=0∑+∞i!∂yi∂iG(x,f⌈2n⌉(x))(f(x)−f⌈2n⌉(x))i≡G(x,f⌈2n⌉(x))+∂y∂G(x,f⌈2n⌉(x))[f(x)−f⌈2n⌉(x)]≡0(modxn)
fn(x)≡f⌈2n⌉(x)−∂y∂G(x,f⌈2n⌉(x))G(x,f⌈2n⌉(x))(modxn)
或者
f2n(x)≡fn(x)−∂y∂G(x,fn(x))G(x,fn(x))(modx2n)
例题
设给定函数为 h(x),有:
G(x,y)=y1−h(x)
应用 Newton’s Method 可得:
f2n(x)≡fn(x)−−1/fn2(x)1/fn(x)−h(x)≡2fn(x)−fn2(x)h(x)(modx2n)(modx2n)
时间复杂度
T(n)=T(2n)+O(nlogn)=O(nlogn)
设给定函数为 h(x),有:
G(x,y)=y2−h(x)≡0
应用 Newton’s Method 可得:
f2n(x)≡fn(x)−2fn(x)fn2(x)−h(x)≡2fn(x)fn2(x)+h(x)(modx2n)(modx2n)
时间复杂度
T(n)=T(2n)+O(nlogn)=O(nlogn)
设给定函数为 h(x),有:
G(x,y)=lny−h(x)
应用 Newton’s Method 可得:
f2n(x)≡fn(x)−1/fn(x)lnfn(x)−h(x)≡fn(x)(1−lnfn(x)+h(x))(modx2n)(modx2n)
时间复杂度
T(n)=T(2n)+O(nlogn)=O(nlogn)
手算演示
为了方便理解,这里举几个例子演示一下算法流程。
复数多项式模多项式的平方根
假设 h 是一个不被 x 整除(有常数项)的复数多项式,求它对模 xn 的平方根。
我们有方程:
G(f(x))=f2(x)−h(x)≡0(modxn)
Taylor 展开 G 得到下式。注意这里是对 f 的展开,所以导数都是对 f 的偏导数,x 在这里是当成常数算的。
G(f(x))=i=0∑+∞i!G(i)(f0(x))(f(x)−f0(x))i=G(f0(x))+2f0(x)(f(x)−f0(x))+(f(x)−f0(x))2
用倍增计算。假设倍增中的中间结果是 f0(x),f1(x),…,fj(x),或者数学严谨地说 fj(x) 是满足 G(fj(x))≡0(modx2j) 的一个复数多项式,且为了唯一性它同时满足以下两个条件:
- fj(x) 次数不超过 x2j;
- fj+k(x)−fj(x)≡0(modx2j),对所有 k。
把 fj+1(x) 和 fj(x) 代入上面的式子就有:
G(fj+1(x))=G(fj(x))+2fj(fj+1(x)−fj(x))+(fj+1(x)−fj(x))2≡0(modx2j+1)
显然 fj+1(x)−fj(x) 必然是 x2j 的倍数。于是得到
fj+1(x)≡fj(x)−2fj(x)fj2(x)−h(x)≡2fj(x)fj(x)2+h(x)(modx2j+1)
如果 fj(x) 存在,那么 2fj(x) 不被 x 整除(有常数项),所以必然有模 x2j+1 的逆元。因此数列 f0,f1…,fj 存在当且仅当 f0 存在。不被 x 整除的复数多项式 h(x) 模 x 的平方根是一定存在的,因为 h(x) 模掉 x 就是个普通非零复数,一定有两个平方根。所以可以对所有有常数项的 h(x) 用这个算法。
选 h(x)=x+1 举例计算如下:
- f0(x)=1,f1(x)=2×112+x+1modx2=21x+1,f2(x)=2×(21x+1)(21x+1)2+x+1modx4=161x3−81x2+21x+1,…
- f0(x)=−1,f1(x)=2×(−1)(−1)2+x+1modx2=−21x−1,…(等于前一个取负)
可以验证两个都是正确的模平方根多项式列。
整数模素数幂的平方根
牛顿迭代算法还可以迁移到整数模素数的幂的情况。
假设 h 是一个不被 3 整除的「方便的」整数。(「方便」指「必然有解」,具体条件后文再言)假设要算 h 在模 3n 意义下的平方根 f。有方程:
G(f)=f2−h≡0(mod3n)
Taylor 展开 G 得到:
G(f)=i=0∑+∞i!G(i)(f0)(f−f0)i=G(f0)+2f0(f−f0)+(f−f0)2
用倍增计算。假设倍增中得到的中间结果是 f0,f1,…,fj,或者严谨地说 fj 是满足 G(fj)≡0(mod32j) 的一个整数,且为了唯一性它同时满足以下两个条件:
- 0<fj<32j;
- fj+k−fj≡0(mod32j),对所有 k。
把 fj+1 和 fj 代入上面的式子就有:
G(fj+1)=G(fj)+2fj(fj+1−fj)+(fj+1−fj)2≡0(mod32j+1)
显然 fj+1−fj 必然是 32j 的倍数。于是得到
fj+1≡fj−2fjfj2−h≡2fjfj2+h(mod32j+1)
如果 fj 存在,那么 2fj 不被 3 整除,所以必然有模 32j+1 的逆元。因此数列 f0,f1…,fj 存在当且仅当 f0 存在。不被 3 整除的整数 h 模 3 的平方根要么不存在,要么有两个。所以 h 有模 3 平方根就是整个算法能跑的唯一条件。
这里选 h=46 实际计算示例。
- f0=1,f1=2×112+46mod9=1,f2=2×112+46mod81=64,f3=2×64642+46mod6561=955,…
- f0=2,f1=2×222+46mod9=8,f2=2×882+46mod81=17,f3=2×17172+46mod6561=5606,…(等于前一个取负)
可以验证一下两个都是正确的模平方根数列。
代数证明
这一节对前文进行引申,用抽象代数的语言证明只要 f 满足初始解条件,牛顿法对所有的 n 都能给出解,并且可以得到全部的解。
有解的证明
设 整环 R 有多项式或 形式幂级数 f(X)=∑i≥0aiXi 和 r,p∈R 使得 f(r)∈Rp(亦即 r 是 f(X) 在模 p 意义下的根)且 f′(r)∈R 在模 p 意义下是可逆的。这里 f′(X):=∑i≥0(i+1)ai+1Xi 是 f(X) 的 形式导数。那么 f(r−f′(r)f(r))≡0(modp2)。
对所有 s∈R,
f(r+sp)=i≥0∑ai(r+sp)i=i≥0∑airi+spi≥1∑iairi−1+s2p2(…)=f(r)+spf′(r)+s2p2(2!f′′(r)+⋯),
所以
f(r+sp)∈Rp2⟺f(r)+f′(r)sp∈Rp2
因为 f(r)∈Rp,且 f′(r) 可逆,所以取 sp=−f′(r)f(r) 即可,这里 f′(r)1 是模 p2 意义下的逆元。因为 f′(r) 在模 p 意义下可逆,所以它在模 p2 意义下也必定存在逆元:设有 a,b,c∈R 使 af′(r)=bp+1 和 f(r)=cp,那么 (a2f′(r)−2)f′(r)=b2p2+1,故可以取 s=c(2−a2f′(r))。
对于域 k 上的多项式环 k[X],设有 G(X,Y)∈k[X,Y] 和 fn∈k[X] 使 G(X,fn(X))∈k[X]Xn,那么应用引理 1 就可得到
G(X,fn(X)−∂Y∂G(X,fn(X))G(X,fn(X)))≡0(modX2n)
而倍增的初始条件只要有 f1∈k 使得 G(X,f1)≡0(modX) 和 ∂Y∂G(X,f1)≡0(modX)。后一个条件保证了 ∂Y∂G 有非零常数项,同时因为 X∂Y∂G(X,fn(X))G(X,fn(X)),故而对所有的 n,∂Y∂G(X,fn) 总是模 Xn 意义下可逆的,也就满足了下一次迭代的条件。
得到全部解的证明
若 R 为 UFD,f,r,p 定义同引理 1。则引理 1 给出的 r−f′(r)f(r) 是模 p2 意义下唯一满足以下两条件的 x 的值:
亦即
∀x∈R,p2∣f(x)∧p∣(x−r)⟹x≡r−f′(r)f(r)(modp2)
令 s=−f′(r)pf(r) 和 u=r+sp,引理 1 保证 u 满足两个条件,且 f(r)+f′(r)sp∈Rp2。
设 v 是满足上述条件的值,则有 v=r+tp 和 f(r)+f′(r)tp∈Rp2。
于是有 f′(r)(t−s)p∈Rp2 和 v−u∈Rp2。
牛顿法可以保证得到模 X2n 的全部解。假设 G(X,h)≡0(modX2n),那么令 h2i:=h(modX2i),然后取 f1=h1 并用牛顿法,根据引理 2 可得 f2i≡h2i(modX2i),所以一定有 f2n=h。
上面的论证也说明了,在 ∂y∂G(0,y) 永远可逆时,G(X,f)≡0(modXn) 的解的个数等于 G(0,f)≡0(modX) 的解的个数。这个结论并非平凡。请看下面的例子。
模 X 意义下 X2 的平方根只有 0,但是模 X4 意义下 X2 的平方根有 X,−X,X3+X,…。