[译] 输入两个数确定一个多项式

原文Polynomial determined by two inputs,因为本人水平较弱所以翻译有可能不是很正确(有错误谢谢指出)… 另外也就是说最好还是去看原文吧嗯。。。

假设 \(p(x)\) 是一个系数均为整数的多项式,并且所有的系数都是非负数,那么只要你能告诉我 \(p(x)\) 图像上的两个点的值,我便可以告诉你这个多项式是什么。

这听起来一定很难以置信,你一定会疑问难道不是需要 \(n+1\) 个点才能确认 \(n\) 次多项式么?这对我来说不需要,技巧就是我第一次询问 \(p(1)\) 的值,假设你给了我答案 \(q\),那么接下来我再问你 \(p(q)\) 的值。这就给了我足够的信息来找出所有的系数。

我在回答 Math Overflow 上的一个问题 时偶然发现了这个技巧。Aeryk 说道“如果你知道所有的系数都是非负整数,那么这个多项式可以被 \(p(1)\)\(p(p(1))\) 的值完全确定。”

我以为这是个众所周知的结论,但我从来没见过它。

ARupinksi 补充了如下的解释:“\(q=p(1)\) 给出了所有系数的和。现在考虑 \(p(p(1))=p(q)\)\(q\) 进制下表示,可以看出这些数位上的数就是 \(p\) 的系数。而唯一有可能不确定的情况就是对于某些 \(n\)\(p(q)=q^{n}\) 的时候,但是因为所有系数之和等于 \(q\),因此可以看出该情况下 \(p=qx^{n-1}\)。”

这解释是正确的,但比较简洁,所以我这里做了一点扩展。首先我们从两个例子说起。

假设你告诉我 \(p(1)=9\) 并且 \(p(9)=1497\)。我将 \(1497\)\(9\) 进制表示,可得 \(1497=2*9^3+4*9+3\)。这表示了 \(p(x)=2x^3+4x+3\)

第二个例子你告诉我 \(p(1)=5\) 并且 \(p(5)=625\)。因为 \(625=5^4\),所以 \(p(x)=5x^3\)

这儿有一个更规范一点的解释。假定 \(p(x)=a_{0}+a_{1}x+a_{2}x^{2}+...+a_{n}x^{n}\)

我们可以通过不断重复找出最大的 \(q\) 的幂来依次从高到低地恢复 \(p(x)\) 的系数。首先我们找到了最大的比 \(p(x)\) 小的 \(q\) 的幂,即 \(q^{m}<p(q)\leq q^{m+1}\)

那么 \(p(q)\) 除以 \(q^{m}\) 的商就是系数 \(a_{m}\)。如果 \(p(q)=q^{m+1}\),那么 \(a_{m}=q\) 并且算完了,否则 \(p(q)=a_{m}q^{m}+r,0<r<q^{m}\)。我们重复这个过程,通过能选择的 \(r\)\(q\) 的最高次幂来找出下一个系数。因为所有系数之和为 \(q\) 并且我们找到的第一个 \(a_{m}\geq 1\),所以之后的所有系数必定是小于 \(q\) 的。