也许会被一些奇怪的数据卡掉。
考虑解方程:
Hn(x1,…,xk)−Hn−1(x1,…,xk)=C(modp)
其中 Hn 是 n 次齐次多项式,Hn−1 是 n−1 次齐次多项式,p 是质数模数。
一个显然的性质是:对于任意标量 t,有 Hd(t⋅v)=tdHd(v)。
我们考虑随机选择一个方向向量 v=(v1,v2,…,vk)∈Fpk∖{0},然后令:
x1=t⋅v1,x2=t⋅v2,…,xk=t⋅vk
其中 t∈Fp 是未知的标量。
将 x=tv 代入原方程,方程变为:
tnHn(v)−tn−1Hn−1(v)=C(modp)
因为向量 v 是我们随机选定的,所以现在 Hn(v) 和 Hn−1(v) 是两个常数。
令 A=Hn(v)(modp),B=Hn−1(v)(modp)。
原问题转化为求解:
Atn−Btn−1−C=0(modp)
两边同除以 A,得到标准的三项式方程:
tn−utn−1−v=0(modp)
其中 u=B⋅A−1, v=C⋅A−1。
根据费马小定理,令 m=nmod(p−1),方程等价于求解(m>0):
f(t)=tm−utm−1−v=0(modp)
此时我们只需找出一个满足 f(t)≡0(modp) 的根 t。对于一个随机生成的 (u,v) 组合,该方程存在根的概率约为 1−e−1≈63.2%。如果无根就重新随机一组 v。
求根可以使用 Cantor-Zassenhaus 快速求解。
时间复杂度我不太清楚,但应该挺快的。