天才的想法——Reed–Solomon编码的快速纠错
大致内容见 EI WC课件:组合计数中的递推问题
这里记录一下我对最后一步怎么归约到有理函数重建的的解读。
考虑把 \(g(x),p(x)\) 拿出来跑 exgcd ,\(g(x)\) 是那个点值插出来的多项式,\(p(x)=\prod (x-i)\) ,也就是预先约定好的所有点值对应的点、对这两个多项式跑 gcd,但是只跑到 \(\deg \le n-k\) 然后把 exgcd 过程中使得原始多项式多带的系数除掉即可。
具体来说,我们假定传输的信息充分多,损坏充分少,原有信息量充分少,这样方便理解,不需要关心对传输量卡常带来的无关紧要的部分。
那么我们可以这么理解这个算法,我们考虑先把正确的点值插入进去,那么我们会得到一个 \(a(x)\) ,\(\deg a\) 充分小。然后我们把错误的点值依次插入,那么我们会发现,由于前面的点值插入非常多(虽然信息少),那么我们新插的点值为了防止影响前面那些已经被硬控的部分,要在之前的所有已经插入的 pos 处为 \(0\) ,也就是要乘上之前所有的 \((x-pos)\) ,那我们不妨记录之前所有的正确的位置的pos的 \(\prod(x-pos)\) 为 \(b(x)\),则我们后面新增的错误点值对 \(a(x)\) 的影响显然为 \(a(x)\to a(x)+b(x)c(x)\) ,其中 \(\deg c\) 是错误点值数量,经过我们这样的分析,虽然我们不知道那些是正确的,哪些是错误的,但是我们大概了解的他的形式。
那么一个显然的事实是我们记录 \(p(x) = \prod (x-i)\) 则 \(p(x) = b(x)d(x)\),目前我们是知道 \(g(x) = a(x)+b(x)c(x),p(x) = b(x)d(x)\) 的,由于 \(a(x)\) 非常短,如果我们不考虑 \(a(x)\) 的影响,我们直接对 \(g(x),p(x)\) exgcd,则我们可以很容易的得到 \(b(x)\) ,但是有 \(a(x)\) 怎么办,\(\deg a\) 充分小诱导我们对这两个式子做一点点 exgcd ,让我们尝试一下。很显然,我们在充分少的次数之后,我们可以得到 \(k(x),t(x)\) 使得 \(k(x)(a(x)+b(x)c(x))+t(x)b(x)d(x)\) 中的 \(b(x)(k(x)c(x)+t(x)d(x))=0\),因为 \(\deg c,\deg d\) 是充分小的,这样我们就得到了 \(k(x)a(x)\) ,再把 \(k(x)\) 从中除掉就得到了 \(a(x)\)
感觉这个东西过于工业,但是如果出 \(n^2\) 的话也足够难了,没有深入学习过这个算法根本是写不出来的,但是学过的又有点板了。