这里有一个有趣的问题:在集合{1, 2, …, n}中选取尽可能多的子集,使得任意两个子集的交集有且仅有一个元素。例如,当n=7时,选取{1,2,3,4}、{4,5,6,7}、{1,7}这3个集合可以满足条件。子集数还可以更大一点吗?最大是多少?给出一种构造,然后证明这个数目不可能更大了。
当n=7时,仅仅取3个子集实在是太弱了。一种最简单的办法就可以让子集数达到6,只需取{1,2}、{1,3}、{1,4}、{1,5}、{1,6}、{1,7}即可。再仔细观察,我们发现这个结果还可以进一步改进:我们还可以再往里面添加进一个子集{1},使得这7个子集两两间仍然恰有一个公共元素。这下我们似乎不能再往里面添加任何新子集了。我们还可以做得更好吗?一个新的思路是在{1,2}、{1,3}、{1,4}、{1,5}、{1,6}、{1,7}里面加上{2,3,4,5,6,7},这同样可以让子集数达到7个,可惜我们仍然无法再往里面添加新的子集了。经过若干次尝试后,我们逐渐开始确信,在集合{1, 2, …, n}里面最多只能选出n个两两恰有一个公共元素的子集,并且构造方法无外乎上面两种。这一猜想不但与直觉相符,而且貌似也很好证明。你或许会从一些看似很直观的结论出发开始证明:“显然不可能有两个大小为1的子集”,“选取多个元素个数大于2的子集显然不划算”……但牛B就牛B在,偏偏就有这样一种子集数为n的取法,每个子集里都有不止两个元素,但仍然保证任意两个子集间恰有一个公共元素:
{1,2,3}、{1,4,5}、{1,6,7}、{2,4,7}、{3,4,6}、{3,5,7}、{2,5,6}
这一个例子对我们的猜想足以构成威胁:子集数为n真的已经到极限了吗?证明结论有那么容易吗?看来,情况貌似比我们想象中的要复杂得多。
事实上,子集数最大为n,这个数目不可能再大了。其证明出人意料的简单。考虑每个子集所对应的n维01向量,例如n=7时集合{1,2,3}就对应向量{1,1,1,0,0,0,0},而子集{1,4,5}则可以表示成{1,0,0,1,1,0,0}。可以看出,两个子集的交集的元素个数就等于它们的向量的点积。下面我们证明,满足要求的一组子集其对应的向量一定是线性无关的,从而直接得到向量个数不超过n的结论。
记m个向量分别为v_1, v_2, …, v_m,令s=Σa_i v_i,考虑点积<s,s>=Σ Σ a_i · a_j · <v_i, v_j>。注意对每一对不同的i和j都有<v_i, v_j>=1,而<v_i, v_i>就等于子集A_i的元素个数|A_i|。于是,<s,s>就等于(a_1 + a_2 + … + a_m)^2 + Σ(a_i)^2·(|A_i|-1)。当s=Σa_i v_i=0时,<s,s>也应该为0;而上面<s,s>表达式中的每一项都是非负整数,要让<s,s>为0只可能是所有a_i都取0,这就说明这m个向量是线性无关的。
这就是著名的de Bruijn-Erdős定理。
线性代数理论不止一次帮助我们证明了看似与线性代数毫无关系的问题。如果你喜欢这个证明,千万不要错过这个经典的图论问题。