杨辉三角计算器
结果
三角形
- 最后一行
- 1, 6, 15, 20, 15, 6, 1
- 行和
- 64
杨辉三角是一个用加法铺出来的三角形:每一行的两端都是 1,中间每一个数都等于它上面相邻两个数之和。第一行只有 1;第二行是 1 和 1;第三行是 1、2、1,那个 2 就是上面两个 1 相加;再往下是 1、3、3、1 与 1、4、6、4、1。它在中文文献里的名字来自南宋杨辉 1261 年写的《详解九章算法》,书中把它记作「开方作法本源」图,并注明引自北宋贾宪的著作,比欧洲的帕斯卡早约四百年;同一张表在西方叫帕斯卡三角。三角形里的数就是二项式系数,也就是把 (x + y) 展开成 n 次方之后各项的系数,所以第 2 行是 1、2、1,展开出来正是 x² + 2xy + y²。另外两件事也从这个三角形里掉出来:任何一行的和都是 2 的幂——1、2、4、8、16——因为每一行都是把上一行错开一位再加一遍,等于把上一行的总和数了两次;而沿斜对角线读下去得到的是斐波那契数列。本页把整块三角按你要的行数印出来,再把最后一行单独印一遍,省得你在长长一串数字里找它,行和也单独给一格。行号从 0 起算,所以填 7 得到的是第 0 到第 6 行,末尾一行是 1、6、15、20、15、6、1。
前 7 行,旁边是每一行的和
| 行号 | 各项系数 | 行和 |
|---|---|---|
| 0 | 1 | 1 |
| 1 | 1, 1 | 2 |
| 2 | 1, 2, 1 | 4 |
| 3 | 1, 3, 3, 1 | 8 |
| 4 | 1, 4, 6, 4, 1 | 16 |
| 5 | 1, 5, 10, 10, 5, 1 | 32 |
| 6 | 1, 6, 15, 20, 15, 6, 1 | 64 |
先看行和那一列:1、2、4、8、16、32、64。每一行都是上一行的两倍,这件事值得弄明白而不是背下来。铺一行的做法是拿上一行、错开一位再加到它自己身上,于是上一行的总和被数了两次——一次从左边缘进、一次从右边缘进。两侧的边永远不变也是同一个道理:边缘那个数上面只有一个邻居,所以它只可能继承一个 1。再拿系数那一列自己对着读。第 3 行是 1、3、3、1,第 4 行是 1、4、6、4、1,每个数都是上面两个数之和;每一行都对称,因为「取哪些」与「留下哪些」是同一个选择的两种说法。表里最后一行是第 6 行,也正是默认输入印出来的末行,所以这张表与上面的结果面板指的是同一批数。
公式
C(n, k) = C(n-1, k-1) + C(n-1, k);C(n, 0) = C(n, n) = 1;行和 = 2^n
- n
- 要印多少行,最上面那个孤零零的 1 算第 0 行。所以填 n 得到的是第 0 到第 n − 1 行,最后印出来的那一行有 n 个数。输入范围是 1 到 53,而上界与屏幕放不放得下无关——真正先撑不住的是下面那条行和
- k
- 一行里的位置,最左边算第 0 位。第 n 行有 k 从 0 到 n 共 n + 1 个数。两端是特殊的:C(n, 0) 与 C(n, n) 都是 1,这就是三角形两条边上那一列 1 的来源;严格夹在两端之间的每一个数,都等于上一行的两个数之和
- C(n-1, k-1) + C(n-1, k)
- 铺出整张表的规则,也是页面实际在跑的那条。第 n 行第 k 个数等于它上方左右两个数之和——正因为如此,两条边只会看到一个数,于是永远停在 1。这里用加法而不是阶乘公式,所以每一个中间值都是精确的,屏幕上那块三角逐字就是页面做过的那串加法
- C(n, k) = n! / (k! (n-k)!)
- 同一个数的另一张脸:二项式系数,也就是从 n 个里取 k 个、不计顺序的取法数。它与加法规则给出同样的值,也是这些数在用来计数而不是用来展开时的含义。页面不用它来算,因为那样一来页面就同时存在两套算术,而两套是会漂移的
- 2^n
- 第 n 行的行和,也是输入停在那里的原因。把任意一行加起来总是 2 的幂:第 0 行是 1,第 1 行是 2,第 2 行是 4,第 6 行是 64。每行翻一倍,所以它比单个系数更早冲出「能精确表示」的范围——第 52 行的和是 4503599627370496,第 53 行是 9007199254740992,比双精度能精确表示的最后一个整数大一
- 1, 6, 15, 20, 15, 6, 1
- 第 6 行写出来的样子,也是默认七行里最后印出的那一行。把它对着上一行读,每个数都是两个邻居之和:6 来自 1 + 5,15 来自 5 + 10,20 来自 10 + 10,然后左右对称。每一行都关于中间对称,永远如此,因为「留下 k 个」与「丢掉 n − k 个」是同一个选择数了两遍
手算二项式展开是它最直接的用处。要把 (x + y) 的六次方乘开,直接把第 6 行照抄下来,写成 1x⁶ + 6x⁵y + 15x⁴y² + 20x³y³ + 15x²y⁴ + 6xy⁵ + 1y⁶,一次多项式乘法都不用做。只要其中一个系数的话,组合数计算器直接从 n 与 k 算出来,不必把中间那些行铺开。两个结果的概率题用的是同一批数:抛十次硬币恰好出现四次正面的概率是 C(10, 4) 除以 2 的十次方,而分母那个 1024 正是第 10 行的行和。三角形还回答一些看起来不相干的技术问题——网格上从一角走到对角、只能向右或向下时的路径条数,以及「给定大小的子集有多少个」。当问题要的是「这些数是什么」,留在这一页;当问题要的是「有多少种可能」,组合数那一页更短;而当你想追的是藏在斜对角线里的那串数,斐波那契计算器直接讲那个数列。
算例
七行,末行是 1、6、15、20、15、6、1
- 第 0 行是 1,第 1 行是 1、1——每一行的两端永远是 1
- 第 2 行:中间那个 1 + 1 = 2,得到 1、2、1
- 第 3 行:两次 1 + 2 = 3,得到 1、3、3、1;第 4 行:1 + 3 = 4、3 + 3 = 6,得到 1、4、6、4、1
- 第 5、6 行照同样的做法往下铺,末行是 1、6、15、20、15、6、1
- 把第 6 行加起来:1 + 6 + 15 + 20 + 15 + 6 + 1 = 64,正是 2 的六次方
默认输入。有两处值得对着屏幕核一遍。第一,每个数都是上面两个数之和:15 来自 5 + 10,20 来自 10 + 10,而这一行左右对称,因为七个数的正中间是 20,它两边成对。第二,行和每一次都翻倍——1、2、4、8、16、32、64——所以记得上一行是 32 的人不用加就能报出这一行。翻倍与两条边上的 1 是同一件事:上一行的总和被数了两次,一次从左半边进、一次从右半边进。
四行,最短的完整三角
- 第 0 行是 1;第 1 行是 1、1
- 第 2 行是 1、2、1,那个 2 来自 1 + 1
- 第 3 行是 1、3、3、1,两个 3 都来自 1 + 2
- 把末行加起来:1 + 3 + 3 + 1 = 8,是 2 的三次方
这里的末行是第 3 行,也正是三角形开始有意思的地方:1、3、3、1 就是 (x + y)³ 的系数,所以 x³ + 3x²y + 3xy² + y³ 可以直接照抄这一行写出来,一次乘法都不用做。它也是短到能在几秒内手工核对完的最后一行,长的那几行之前先看它一眼是值得的。注意填 4 得到的是第 0 到第 3 行——你填的是行数,不是最大那一行的行号。
一行,最短的情形
- 第 0 行只有一个 1,它上面没有可加的东西
- 要一行就印一行
- 行和是 1,也就是 2 的零次方
页面接受的最小输入,而它是被当成一个正常的三角形接受的,不是「空」。只有一行的三角形并不退化,它是后面每一行的出发点。看这一格还顺带确认了行号的起算方式:填 1 得到的是第 0 行而不是第 1 行,这一点等你把三角形对着二项式展开核的时候就会要紧。行和是 1 而不是 0,与「顶上那个数是 1」说的是同一件事。
局限
行数必须是 1 到 53 之间的整数。上界在那里是因为印出去的每个数都得是机器还能精确表示的整数,越过那条线之后相邻两个整数会塌成同一个值——印出来的数字看起来毫无异常,只是它已经不代表原来那个数了。先撑不住的是行和:第 52 行的和是 4503599627370496,第 53 行是 9007199254740992,比双精度能精确表示的最大整数大一。单个系数其实能撑到第 56 行——第一个越界的是第 57 行的 C(57, 28)——但三角是一行一行印的,所以由行和说了算。0 行会被拒绝:空三角什么都印不出来,没有答案可给。小数行数一律拒绝而不是四舍五入,因为没有「两行半」。每一行印成用逗号隔开的一串数,行与行之间用分号,数字之间不插千位分隔符,所以一个大的系数印成 184756 而不是 184,756;行数一多就是一长条需要横向滚动的数字。下面那张参考表固定印前 7 行,不跟着你的输入走,而且页面只能从顶上往下铺——没法只要求某一行。
常见问题
- 杨辉三角有什么用?
- 最主要的用处是展开二项式。第 n 行的数就是把 (x + y) 乘开 n 次之后各项的系数,所以第 6 行让你可以直接写出 (x + y)⁶ 的七项,中间一次多项式乘法都不用做。同一批数还用来数组合:C(n, k) 就是第 n 行第 k 个数,于是它们回答「从 10 个人里选 4 个有多少种选法」这类问题。概率里也常见,抛十次硬币恰好四次正面的概率是 C(10, 4) 除以 2¹⁰,而那个 1024 正是第 10 行的和。数网格路径也用它:从一个角走到对角、只能向右或向下时,路线条数就是三角里的某个数。
- 为什么行数最多只能填 53?
- 因为行和会先冲出「机器能精确表示的整数」这个范围。第 52 行的和是 4503599627370496,第 53 行是 9007199254740992,而后者比双精度能精确表示的最大整数大一。越过这条线之后相邻两个整数会变成同一个值,于是印出来的数字看着正常,却已经不代表它声称的那个数了。单个系数其实更耐用——第一个越界的是第 57 行里的 C(57, 28)——但三角是一行一行印的,所以由行和说了算。印出一行「总和是错的、单个数是对的」的数字,是没法发布的东西。
- 最后一行为什么要印两遍?
- 因为在大的三角上,绝大多数人只要最后那一行,而在一长串数字里把它找出来是件费劲的事。填 40 行,三角那一格就是一面数字墙,你要的那一行在最右边;末行那一格把同一行单独放在一处,大小读得下去。两格来自同一次计算,所以不可能对不上。行和印第三遍也是同一个理由——它是一个数,一眼就能回答那串数字一眼答不上来的问题。
- 行号是从 0 开始还是从 1 开始?
- 从 0 开始,这是二项式系数惯用的编号方式。C(n, k) 指的是第 n 行第 k 个数,所以最上面那个单独的 1 是第 0 行,填 7 得到的是第 0 到第 6 行,末行是 1、6、15、20、15、6、1——七个数,因为第 n 行永远有 n + 1 个数。这一点在你把三角形对着二项式展开核的时候很要紧:(x + y)⁶ 的系数那一行是第 6 行,不是第 7 行。你填的是行数,不是最大那一行的行号。
- 一行的和为什么永远是 2 的幂?
- 把任意一行加起来都等于 2 的行号次方:第 0 行是 1,第 6 行是 64,第 10 行是 1024。原因就在铺行的规则里。每一行都是上一行错开一位加到自己身上得到的,于是上一行的每一个数在这一行里都被数了两次——左边一次、右边一次。总和每次都翻倍,得到的自然就是 2 的幂。同一件事换一种读法:第 n 行的和数的是一个 n 元集合的全部子集,而 n 个元素的集合有 2ⁿ 个子集。抛十次硬币那个 1024 就是从第 10 行直接出来的。
- 斐波那契数列跟这个三角形有什么关系?
- 藏在对角线里。沿着一条向左上斜的线把数加起来——比如 1、再 4、再 3——累加的结果是 1、1、2、3、5、8、13,也就是斐波那契数列,每一项是前两项之和。原因在于斜线上的每个数本身也是上面两个数之和,而那两个数里有一个落在同一条斜线上、另一个落在旁边一条上,于是斜线直接继承了斐波那契的递推。想接着往下看那个数列,斐波那契计算器那一页专门讲它。
参考资料
- 杨辉三角——这张表在中文文献里的来历、杨辉《详解九章算法》中的记载,以及它与二项式系数的关系 — 维基百科(中文)
- Pascal's Triangle —— 二项式系数排成的阵列、它的加法规则,以及从它掉出来的那些恒等式 — Wolfram MathWorld(美国)
- Binomial Coefficient —— C(n, k) 数的是什么、阶乘公式,以及为什么加法规则给出同一批数 — Wolfram MathWorld(美国)
- 教育部关于印发义务教育课程方案和课程标准(2022 年版)的通知——附件清单第 5 项为《义务教育数学课程标准(2022 年版)》;杨辉三角与二项式系数在课程标准里属于数与代数领域,原文与学段要求以该附件为准 — 中华人民共和国教育部