专栏文章

一种经典树哈希算法的正确性证明

算法·理论参与者 12已保存评论 14

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
14 条
当前快照
2 份
快照标识符
@mk8k7xiz
此快照首次捕获于
2026/01/11 01:09
上个月
此快照最后确认于
2026/02/19 01:29
14 小时前
查看原文
我们有一个经典的有根树哈希算法:f(T)=x(f(Ti)+y)f(T)=x\prod(f(T_i)+y)TiT_i 表示 TT 的一个子树,这个算法一直以来被认为是不正确的,然而我们发现在随机 x,yx,y 的情况下,这个算法判断两棵树是否同构的错误率只有 O(nmod)O(\frac n{\text{mod}}),也就意味着只要不对着卡就是对的。
我们发现对于一棵确定的有根树 TTf(T)f(T) 的值是一个关于 x,yx,y 的二元多项式,只需证 f(S)=f(T)f(S)=f(T) 时必有 SS 同构于 TT 即可。然后我们进行归纳,因此只需要证明 f(S)=f(T)f(S)=f(T) 时必有 {f(Si)}={f(Ti)}\{f(S_i)\}=\{f(T_i)\}
如果 f(Si)+yf(S_i)+y 在有理数域内是不可约的,那么上一条显然成立,因为我们有任意元整系数多项式的唯一分解定理。
假设 f(Si)+y=A×Bf(S_i)+y=A\times B,考察 [x0]A[x^0]A[x0]B[x^0]B,显然 [x0]A×[x0]B=y[x^0]A\times[x^0]B=y。然后我们考察 [y0]A[y^0]A[y0]B[y^0]B,显然 [y0]A×[y0]B=xSi[y^0]A\times[y^0]B=x^{|S_i|}Si|S_i|SiS_i 的大小),但是我们注意到 [x0y0]A=1[x^0y^0]A=1,所以 [y0]A=1,[y0]B=xSi[y^0]A=1,[y^0]B=x^{|S_i|},注意到 f(Si)+yf(S_i)+yxx 的次数大于等于 Si|S_i| 时只有一项 xSix^{|S_i|},因此 A=1A=1f(Si)+yf(S_i)+y 其实不可约。
于是我们证明了两棵有根树不同时,对应的二元多项式也不同(以上证明也可以直接被搬到 Fp\mathbb F_p,所以对于 modp\bmod p 的情况这一点也成立),根据 schwartz zippel lemma,我们随机取 x,yx,y,错误率就是 O(nmod)O(\frac n{\text{mod}}) 的。

评论

14 条评论,欢迎与作者交流。

正在加载评论...