我们在高中甚至初中,都有可能遇到这样的题目:

x,y,z是非负整数,问x+y+z=2014有多少组不同的解?(不同顺序视为不同的解)

难度稍高点,可以改为

x,y,z是非负整数,0xyz,问x+y+z=2014有多少组不同的解?

这些问题都属于整数的分拆问题(广为流传的哥德巴赫猜想也是一个整数分拆问题)。有很多不同的思路可以求解这两道题,然而,个人认为这些方法中最引人入胜的(可能也是最有力的)首推“生成函数法”。

关于生成函数,本节就不多作介绍了,如果缺乏相关基础的朋友,请先阅读相关资料了解该方法。不少数论的、离散数学的、计算机科学的书籍中,都介绍了生成函数法(也叫母函数法)。本质上讲,母函数法能有诸多应用,是因为xa×xb=xa+b这一性质的成立。

有序的分拆

我们首先来解决第一个问题,也就是把整数n分拆为k个整数和的拆分数,不同的顺序也视为不同的分拆方式。记n的有序分拆数记为α(n,k),不难推出
n=0α(n,k)xn=(1+x+x2+x3+x4+)k=(11x)k
生成函数的有效性和便捷性还在于诸如(11x)k这一类函数的泰勒展开式是很容易求得的:
(11x)k=1(k1)!(11x)(k1)=1(k1)!(1+x+x2+x3+x4+)(k1)=1(k1)!n=k1n!(nk+1)!xnk+1=n=0(n+k1k1)xn
也就是说,将n进行有序分拆为k个正整数之和的分拆数α(n,k)=(n+k1k1)。这跟从排列组合出发的解法是一样的。生成函数法的优点在于,方法本身是很美妙的,而计算未必简单,但都是可以按部就班计算下去的。事实上,用其他方法能够解决的问题,如果改用生成函数法,复杂程度并不会增加。

在本题中,对于n=2014,给出答案为(20162)=2031120

无序的分拆

第二个问题属于无序地分拆,也就是把整数n分拆为k个整数和的拆分数,不同的顺序也视为同一种分拆方式。如果不用生成函数法,则可以通过对称性的分析逐步求得答案,也可以通过小的数字逐步枚举归纳,但都是步骤较多,而且难以得到一般的公式。用生成函数法则显得更为直接。记n的无序分拆数为β(n,k),关于该分拆的生成函数稍微复杂一些:
n=0β(n,k)xn=kr=1(11xr)
我们把推导放到最后,首先来看这样的生成函数给我们带来什么样的结果。这里就k=3为例:
(11x)(11x2)(11x3)=1+x(1x2)2(1x3)=(1+x)(1+x2+x4)2(1x6)2(1x3)=(1+x)(1+x2+x4)2(1+x3)(1x6)2(1x6)=(1+x)(1+x2+x4)2(1+x3)(1x6)3
化简的要诀在于将分母变成(1xp)q的形式,因为这样形式的分式的泰勒展式是容易求出来的。下面,我们算得:
{(1+x)(1+x2+x4)2(1+x3)=1+x+2x2+3x3+4x4+5x5+4x6+5x7+4x8+3x9+2x10+x11+x121(1x6)3=n=0(n+22)x6n
相乘得
n=0[(n+22)+(n2)+4(n+12)]x6n+n=0[(n+22)+5(n+12)]x6n+1+n=0[2(n+22)+4(n+12)]x6n+2+n=0[3(n+22)+3(n+12)]x6n+3+n=0[4(n+22)+2(n+12)]x6n+4+n=0[5(n+22)+(n+12)]x6n+5
以上的计算表明,答案跟被分拆数模6的结果有关,比如β(6n,3)=(n+22)+(n2)+4(n+12)β(6n+1,3)=(n+22)+5(n+12),等等。倘若不通过生成函数法,则难以求得一般表达式出来。

在本题中,2014=6×335+4,所以给出答案4(3372)+2(3362)=339024

无序的分拆:推导

为什么无序分拆的生成函数会是上述的样子?我们先考虑n=x+y,xy的分拆数,显然,根据定义,它可以对应于生成函数:
1×(1+x+x2+x3+)+x×(x+x2+x3+x4+)+x2×(x2+x3+x4+x5)+x3×(x3+x4+x5+x6)+=11x+x21x+x41x+x61x+=1(1x)(1x2)
更一般地,可以归纳地证明,分拆为k个正整数之和时,其生成函数是
kr=1(11xr)
有兴趣的朋友可以亲自动手完成这一过程,相信会收获不少。

2014年11月20日更新:

关于无序的分拆,更方便的一个推导是这样的。比如说n=x+y+z,xyz,那么设y=x+a,z=y+b=x+a+b,那么n=x+y+z,xyz的自然数解,就相当于n=3x+2a+b的自然数解,显然3x,2a,b的生成函数分别是11x311x211x,相乘起来即可。

转载到请包括本文地址:https://spaces.ac.cn/archives/2942

更详细的转载事宜请参考:《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (Sep. 16, 2014). 《生成函数法与整数的分拆 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/2942

@online{kexuefm-2942,
        title={生成函数法与整数的分拆},
        author={苏剑林},
        year={2014},
        month={Sep},
        url={\url{https://spaces.ac.cn/archives/2942}},
}