十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等于 7 加 9 加 11,4 的立方等于 13 加 15 加 17 加 19。每个等式右边都恰好是 m 个连续奇数,像是有个看不见的调度员在按项数分发货。这个性质不仅本身漂亮,背后还牵出等差数列、立方和公式、尼科马库斯定理一整条知识链。这篇就来把它彻底拆开,从现象到证明,从几何直观到代码验证,把我在实际推导和教学中踩过的坑也一并写出来。不管你是数学爱好者、算法初学者,还是想给中学生讲点趣味数学的同行,都能从里面拿到可以直接用的东西。
1. 现象:立方数里的连续奇数拼图
1.1 先动手硬算几个例子
研究任何结论,最好的方式就是先别信,自己算。我从 m=1 开始列了一张表,把每个等式右边展开,看着看着规律就藏不住了。
| m | m³ | 展开式 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 8 | 3 + 5 |
| 3 | 27 | 7 + 9 + 11 |
| 4 | 64 | 13 + 15 + 17 + 19 |
| 5 | 125 | 21 + 23 + 25 + 27 + 29 |
| 6 | 216 | 31 + 33 + 35 + 37 + 39 + 41 |
| 7 | 343 | 43 + 45 + 47 + 49 + 51 + 53 + 55 |
| 8 | 512 | 57 + 59 + 61 + 63 + 65 + 67 + 69 + 71 |
这张表打完,三个细节马上浮现:第一,项数确实严格等于 m,m=5 就是 5 个奇数,m=8 就是 8 个奇数,分毫不差;第二,每一项之间的差都是 2,完全是“连续奇数”的标准形态;第三,每一行的第一项分别是 1、3、7、13、21、31、43、57,也就是 1、3、7、13、21、31、43、57,这个序列并不陌生,它是 m² - m + 1。
第三点特别值得停下来琢磨。为什么首项不是随便冒出来的,而是精准落在 m² - m + 1 上?这说明“连续奇数之和等于立方”不是巧合,背后有一条统一的代数规则。既然规则统一,我们就能把它公式化,甚至反过来证明。
1.2 每行的骨架是固定结构
把上面的展开式稍微整理一下:每一项都是首项 a 加上若干个公差 2。例如 m=6 时,首项 31,第 6 项是 31 + 2×5 = 41,整行就是 31、33、35、37、39、41 六个奇数,首项和末项之间的跨度正好是 2×(m-1)。
于是结构非常清晰:右边是一组长度为 m、首项为 a、公差为 2 的等差数列。等差数列求和公式可以直接套:
S = m × a + [m×(m-1)×2] / 2 = m×a + m×(m-1)。
要让 S = m³,就得到 m×a + m×(m-1) = m³,两边同时除以 m(m 是正整数,可以放心除),得到 a = m² - m + 1。
这一步实际上已经把规则钉死了:只要让首项等于 m² - m + 1,后面每一项依次加 2,写够 m 项,总和必然是 m³。表格里的每一行都精确满足这个关系。此时我们对“现象”的信任已经有了一半的证据,剩下的一半要靠严格证明和几何图景去填。
2. 两条证明路线,把规则吃透
2.1 代数求和:老老实实推一遍
既然已经认定右侧是等差数列,那就用最基础的方式做一次完整推导。设 m 个连续奇数为:
a, a+2, a+4, …, a+2(m-1)。
把它们加起来,可以拆成两部分:m 个 a 相加得 m×a;后面的增量是 2×(0+1+2+…+(m-1)),括号里的和是 m×(m-1)/2,所以增量部分是 m×(m-1)。合在一起仍是:
S = m×a + m×(m-1)。
现在要求 S = m³,也就是:
m×a + m×(m-1) = m³
m×a = m³ - m×(m-1)
a = m² - m + 1。
反过来,把这个 a 代回到 S 的表达式里:
S = m×(m² - m + 1) + m×(m-1)
= m³ - m² + m + m² - m
= m³。
中间好几项漂亮地抵消了。到这里,结论已经完成代数层面的证明。细心的人会注意到,这个推导全程没有要求 a 必须是奇数,只是最后我们发现 m² - m + 1 必然是个奇数,才正好落在“连续奇数”的约束里。这个性质在下一节展开。
2.2 平均数视角:m³ 其实是 m 个 m²
除了硬算求和,还有一个更轻巧的视角,来自等差中项。m 个连续奇数构成等差数列,首项 m² - m + 1,末项 m² + m - 1。首末项的平均数是:
[(m² - m + 1) + (m² + m - 1)] / 2 = m²。
所以这一串奇数的平均数正好是 m²。等差数列的平均数等于中间项,于是整个和等于“平均数 × 项数”= m² × m = m³。这个解释只有两行,但信息量极大。
用这个视角再看表里的数据:m=5 时,5 个奇数以 25 为中心展开成 21、23、25、27、29,平均数 25,乘以 5 得到 125。m=4 时,4 个奇数 13、15、17、19 的平均数也是 16(首末平均 (13+19)/2=16),4×16=64。这就意味着,m³ 本质上可以理解成“m 份 m² 拼在一起”,只是我们不直接写 m 个 m²,而是把 m² 这个平均数往两侧对称展开,变成一串连续奇数。展开后的每一对“偏离”会在平均计算时互相抵消,和依然是 m 个 m²。
2.3 为什么首项一定是奇数
推导过程中唯一可能让人不安的是:凭什么说 m² - m + 1 一定是个奇数?答案在奇偶性分析里。m² 和 m 的奇偶性相同,所以 m² - m 一定是偶数;偶数加 1,自然是奇数。另一个等价写法是 m×(m-1)+1,m 和 m-1 是连续整数,其中必有一个偶数,所以乘积为偶数,再加 1 得到奇数。两个角度都能说明问题。
还要确认首项是正奇数。m=1 时,a=1;m=2 时,a=3;m≥3 时,m² - m + 1 = m(m-1)+1 ≥ 3×2+1=7。也就是说,对一切自然数 m,展开式里的每一行都是正奇数,出现负数的情况根本不需要担心。这也是我在教学时特别喜欢强调的一点:证明一个性质,不只是证明“等式成立”,还要顺手验证构成这个等式的元素满足所有定语条件,比如“连续”“奇数”“m 个”。
3. 更大的图景:奇数列、正方形与立方和公式
3.1 把散落的奇数拼成一张大图
前文每次只盯着一个立方数看,但如果把多个展开式纵向叠在一起,会看到一张更壮观的图景。把从 1 开始的每个立方都写成连续奇数之和,然后按顺序拼接右侧:
1³ = 1
2³ = 3 + 5
3³ = 7 + 9 + 11
4³ = 13 + 15 + 17 + 19
…
把所有等式右边连成一条线:1、3、5、7、9、11、13、15、17、19……恰好就是从 1 开始的所有奇数,一个也没有遗漏。这是因为第 m 行正好用了 m 个奇数,前面 m-1 行累计用了 1+2+…+(m-1) = m(m-1)/2 个奇数,所以第 m 行从第 m(m-1)/2 + 1 个奇数开始。这个位置对应的奇数恰好就是 m² - m + 1,和前面推出的首项公式完全吻合。连续奇数被各行无缝切分,没有重叠也没有空隙。
这个观察直接引出尼科马库斯定理:前 m 行左边加起来是 1³ + 2³ + … + m³;右边加起来是前 T 个奇数之和,其中 T = 1+2+…+m = m(m+1)/2。任意前 T 个奇数之和等于 T²,因此:
1³ + 2³ + 3³ + … + m³ = [m(m+1)/2]²。
而 m(m+1)/2 恰好是前 m 个自然数之和,所以又得到那个相传已久的漂亮等式:1 到 m 的立方和,等于 1 到 m 之和的平方。有人管它叫尼科马库斯定理,有人当作“雅可比恒等式”的简单版本讲,总之,它和我们标题里的性质是同一条知识链上的两颗明珠。
3.2 如何用正方形解释“奇数铺出平方数”
为什么前 T 个奇数之和等于 T²?这里需要一个几何直观。从 1 开始,每一次加下一个奇数,都像是在正方形的外围补一圈 L 形边框。1 就是一格正方形;1+3 等于在原来 1×1 的外侧补上 3 格,变成 2×2;再加上 5 格,变成 3×3;加第 k 个奇数 2k-1,就是边长从 k-1 变成 k 时新增的外框格数。于是前 k 个奇数的和总能拼成一个 k×k 的正方形。
但标题里的性质用的是从 m²-m+1 开始的“中间一段”奇数,而不是从 1 开始的前 m 个奇数。为什么截图也能成立?关键在于平均数恰好是 m²。拿正方形来说,这一串奇数虽然不从 1 开始,但它们的中心位于 m²,且左右对称分布,对称的两项之和总是 2m²,最终会把整体拉回“m 个 m²”的形态。所以几何上可以理解为:m³ 是一个 m×m×m 的立方体,我们把它拍扁成 m 排,每排 m² 个格子,再从 m² 往两头“摊开”成连续奇数。代数、几何、整数性质在这里完全对齐。
3.3 这个性质在课堂上的真正价值
我多次拿这个性质当数列求和的引子,效果比直接抛公式好得多。原因是学生可以先动手,不用依赖任何高级知识:随便挑一个 m,比如 6,试着找 6 个连续奇数让它们等于 216,很快会得到 31 到 41。紧接着换 m=8,又能得到 57 到 71。多算几个数之后,他们自己就会开始找首项的规律,发现第 m 行的首项是 m²-m+1,进而愿意主动学习等差数列求和的公式。整个过程有一种“我自己发现的”错觉,而这种错觉恰恰是最好的学习动力。
4. 写程序验证,顺便探索边界情况
4.1 几行代码把结论跑一遍
这种规律性极强的性质,非常适合用程序验证。我习惯这样写:直接用首项公式 m²-m+1 生成 m 个连续奇数,再断言它们的和等于 m³。
def cube_to_odd_sum(m: int): start = m * m - m + 1 odds = [start + 2 * k for k in range(m)] return odds, sum(odds), m ** 3 for m in range(1, 21): odds, total, cube = cube_to_odd_sum(m) assert total == cube, f"m={m} 时不成立" print(f"{m:>2}^3 = {' + '.join(map(str, odds))} = {cube}")这段代码输出的是从 m=1 到 m=20 的完整展开式,比如最后一行会打印 20^3 = 381 + 383 + … + 419 = 8000。程序写起来几乎不费脑子,因为核心逻辑不是枚举搜索,而是构造:先算出首项,再等差数列生成后面每一项。这也顺带回答了一个常见疑问:这类题目在算法竞赛里根本不需要穷举,直接用公式 O(m) 生成甚至 O(1) 验证即可。知道数学规律,代码可以高效很多。
4.2 边界情况:m=1、m=0 和负数
在写程序之前,要先想清楚自然数怎么界定。m=1 时,start=1,odds=[1],总和 1,等于 1³,性质成立,且只有一项,属于“连续奇数之和”的平凡情况。m=0 时,“0 个奇数”没有意义,等式 0³=0 也无法用空和来解释,所以通常把结论限定在 m 为正整数。
至于负数,如果坚持代公式,m=-2 时 start = 4 - (-2) + 1 = 7,生成的是 7、9,和是 16,那是 (-2)³ 吗?不是,16 不等于 -8。说明直接套 m=-2 并不正确,因为负数情况需要重新约定项数。如果把负号提到外面,比如 (-2)³ = -(2³) = -(3+5),也就是 -3 + (-5) 这两个连续负奇数之和,反倒是成立的。所以严格说法是:对任意非零整数 n,n³ 都可以表示为 |n| 个连续整数(同符号奇数)之和,但自然数的版本最干净,考试和教学里也最常用。
4.3 一个立方数还能拆成多少种连续奇数之和
标题给的是“m 个连续奇数之和”,用的是恰好 m 个。但同一个立方数有没有其他拆分方式?当然有。64 = 4³ 除了 13+15+17+19,还能拆成 31+33,因为 31+33=64;还能拆成 1+3+5+7+9+11+13+15=64,这是 8 个奇数。原因在于,拆成 k 个连续奇数时,首项公式变成 N/k - k + 1,其中 N 是目标数。要让首项是正奇数,必须满足 k 整除 N,且 N/k 与 k 的奇偶性合适。所以一个立方数能拆出几种形式,本质上取决于它的因数分解,这又为“因数个数”这个经典话题提供了一道很好的习题。我在讲数论时经常把这几个问题串在一起,学生普遍觉得比孤立的练习题有意思得多。
5. 常见误区与避坑记录
5.1 “连续奇数”不等于“前 m 个奇数”
最常出现的错误,是把这个性质理解成“m³ 等于前 m 个奇数之和”。前 m 个奇数之和是 m²,不是 m³。比如前 4 个奇数是 1、3、5、7,加起来才 16,而 4³=64。正确的展开必须从 m²-m+1 开始,m=4 时要取 13、15、17、19 这四个奇数。把这两组数放在一起对比,学生立刻能看出差异,也能更清楚地感受到“连续 m 个奇数”和“前 m 个奇数”完全是两个集合。
5.2 注意“连续奇数”的步长是 2
另一个容易出错的点是误把任意奇数组合当作连续奇数。27 = 7+9+11 是连续奇数;27 = 5+9+13 虽然也是三个奇数,但它们差分别是 4 和 4,不是连续。连续奇数的本质是公差为 2 的等差数列。如果学生在计算时随意挑选奇数,很可能凑出和正确但模式不对的展开式,这在程序验证时尤其明显,因为一旦步长不是 2,构造就失败了。所以在用代码或手工推导前,先检查每相邻两项之差是不是都等于 2。
5.3 首项公式要自己推一遍,不要死记
m² - m + 1 这个式子看起来简单,但实际写错的人不少,有人写成 m² + m - 1,有人写成 m² - m - 1。我的建议是不要背,每次用时花十秒推一遍:假设首项是 a,由等差数列求和直接得到 m×a + m×(m-1) = m³,解出 a = m² - m + 1。万一记不清,就用 m=2 验算:2 的展开式必须是 3+5,首项是 3,而 m²-m+1=3,如果记成其他式子,一验就露馅。验算是最便宜、最可靠的纠错手段,也适用于其他公式记忆场景。
5.4 别忽略“m 个”这个数量约束
性质里最关键的定语其实是“m 个”。如果没有数量约束,任何奇数立方都能以乱七八糟的方式拆成很多组连续奇数之和;但题目限定为 m 个后,展开就只剩唯一一种可能。唯一性也可以从公式看出来:首项 a 由 m 唯一决定,项数由 m 唯一决定,公差固定为 2,所以整个序列唯一。这种“数量与结构互相锁定”的感觉,是数学里很经典的美感,也是我在讲完这个性质后一定会强调的点。
6. 从证明到课堂:我的几点实操体会
6.1 先让学生“发现”,再讲公式
我试过两种讲法:一种是把首项公式直接写在黑板上,然后验证;另一种是先让学生随便挑 m,自己列出展开式并寻找规律。第二种虽然慢一点,但课堂反馈明显更好。当学生自己写下 7、9、11,又写下 21、23、25、27、29,再对比两组首项和 m 的关系时,那种“我好像看出点什么”的眼神是装不出来的。数学教育里最难得的瞬间,就是在学生心里种下一个问号,再让他亲手把它拉直。
6.2 用这个性质引出更大的结论
这个性质的“出口”很多。如果要讲等差数列,它是天然的引例;如果要讲数学归纳法,完全可以拿它做习题:假设 m 成立时,推出 m+1 的展开式也能成立;如果要讲数论,可以顺着“多个连续奇数之和”追问哪些正整数可以写成连续整数之和,这又是一套完整的理论。我在一节课里通常这样安排:前十五分钟做数字实验,中间十五分钟完成代数证明和几何解释,最后十五分钟把 1³+2³+…+m³=(1+2+…+m)² 作为课后挑战题抛给学生。一节 45 分钟的课,从动手到证明再到拓展,节奏刚好。
我自己的体会是,真正好的数学内容不需要花哨包装,只要它能在某个点上让人产生“原来如此”的惊讶,就已经完成了大半任务。m 的立方拆成 m 个连续奇数之和,恰好就是这样的点:它够小,小到小学生验算几项就能看懂;它又够大,大得能一路连接到等差数列、平方数、立方和公式这些核心概念。如果你也喜欢拿一两个小性质去做文章,这个题目值得放进你的素材库。