杨辉三角形
杨辉三角形,又称帕斯卡三角形、賈憲三角形、海亚姆三角形、巴斯卡三角形,是二项式系數的一种写法,形似三角形,在中国首现于南宋杨辉的《詳解九章算法》得名,书中杨辉说明是引自贾宪的《释锁算书》,故又名贾宪三角形。前 9 行写出来如下:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1
杨辉三角形第 层(顶层称第 0 层,第 1 行,第 层即第 行,此处 为包含 0 在内的自然数)正好对应于二项式 展开的系数。例如第二层 1 2 1 是幂指数为 2 的二项式 展开形式 的系数。
性質
- 巴斯卡三角以正整數構成,數字左右对称,每行由1开始逐渐变大,然后变小,回到1。
- 巴斯卡三角每一行的平方和在楊輝三角出現奇數次。
- 巴斯卡三角第2的冪行所有數都是奇數。
- 巴斯卡三角每一行的和是2的冪。
- 第 行的数字个数为 个。
- 第 行的第 個數字為組合數 。
- 第 行数字和为 。
- 除每行最左側與最右側的數字以外,每个数字等于它的左上方與右上方两个数字之和(也就是說,第 行第 個數字等於第 行的第 個數字與第 個數字的和)。這是因为有組合恒等式:。可用此性质写出整个楊輝三角形。
歷史
波斯數學家Al-Karaji和天文學家兼詩人欧玛尔·海亚姆(عمر خیام,Omar Khayyám)在10世紀都發現了這個三角形,而且還知道可以借助這個三角形找次根,和它跟二项式的關係。但他们的著作已不存。[1]
11世纪北宋数学家贾宪发明了贾宪三角,并发明了增乘方造表法,可以求任意高次方的展开式系数。贾宪还对贾宪三角表(古代称数字表为“立成”)的构造进行描述。[2]贾宪的三角表图和文字描写,仍保存在大英博物馆所藏《永乐大典》卷一万六千三百四十四。
13世纪中国南宋数学家杨辉在《详解九章算术》里解释这种形式的数表,并说明此表引自11世纪前半贾宪的《释锁算术》[3]。
1303年元代数学家朱世杰在《四元玉鉴》卷首绘制《古法七乘方图》[4]。
意大利人稱之為「塔塔利亞三角形」(lolis Lolisl LolislTriangolo di Tartaglia)以紀念在16世紀發現一元三次方程解的塔塔利亞。
布萊士·帕斯卡的著作Traité du triangle arithmétique(1655年)介紹了這個三角形。帕斯卡搜集了幾個關於它的結果,並以此解決一些概率論上的問題,影响面广泛,Pierre Raymond de Montmort(1708年)和亞伯拉罕·棣莫弗(1730年)都用帕斯卡來稱呼這個三角形。
历史上曾经独立绘制过这种图表的数学家:
- Karaji 和 Omar Khayyám 波斯 10世紀(图文无存)
- 賈憲 中國北宋 11世纪 《释锁算术》 (图文现存大英博物馆所藏《永乐大典》)
- 杨辉 中國南宋 1261《详解九章算法》记载之功(图文现存大英博物馆所藏《永乐大典》)
- 朱世杰 中國元代 1299《四元玉鉴》级数求和公式
- 阿尔·卡西 阿拉伯 1427《算术的钥匙》(现存图文)
- 阿皮亚纳斯 德国 1527
- 施蒂费尔 德国 1544《综合算术》二项式展开式系数
- 薛贝尔 法国 1545
- B·帕斯卡 法国 1654《论算术三角形》
中国数学家的研究
中国贾宪是贾宪三角的发明人,贾宪/杨辉称之为“释锁求廉本源”,朱世杰称之为“古法七乘方图”(1303年),明代数学家吴敬《九章详注比类算法大全》称之为“开方作法本源”(1450年);明王文素《算学宝鉴》称之为“开方本源图”(1524年);明代程大位《算法统宗》称之为“开方求廉率作法本源图”(1592年)。 清代梅文鼎《少广拾遗》称之为“七乘府算法”(1692年);清代孔广森《少广正负术》称之为“诸乘方乘率表”;焦循《加减乘除释》称之为“古开方本原图”;刘衡《筹表开诸乘方捷法》称之为“开方求廉率图”;项名达《象数一原》称之为“递加图”。伟烈亚力《数学启蒙》称之为“倍廉法表”;李善兰《垛积比类》称之为“三角垛表”。近代中算史家李俨称之为“巴斯噶三角形”,但根据《永乐大典》指出“巴斯噶三角形”最早由贾宪使用。[5]。著名数学家华罗庚,在1956年写的一本通俗读物《从杨辉三角谈起》[6],将贾宪的《开方作法本源》称为“杨辉三角”,首次将“巴斯噶三角形”回归宋代数学家名下;此后的中学数学教科书和许多数学科普读物都跟随之[7]。另一方面,专业的中国数学史著作,都用“贾宪三角”这个称呼。[8][9]。
一個數在杨辉三角出現的次數
由1開始,正整數在楊輝三角形出現的次數為:∞,1, 2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 2, 4, ... (OEIS:A003016)。最小而又大於1的數在賈憲三角形至少出現n次的數為2, 3, 6, 10, 120, 120, 3003, 3003, ... (OEIS:A062527)
- 除了1之外,所有正整數都出現有限次。
- 只有2出現剛好一次。
- 6,20,70等出現三次。
- 出現兩次和四次的數很多。
- 還未能找到出現剛好五次或七次的數。
- 120,210,1540等出現剛好六次。(OEIS:A098565)
- 其中表示第個斐波那契數()。
- 3003是第一個出現八次的數。
编程语言实现
Go
package main
import "fmt"
//行数
const LINES int = 10
//杨辉三角
func ShowYangHuiTriangle() {
nums := []int{}
for i := 0; i < LINES; i++ {
//补空白
for j := 0; j < (LINES - i); j++ {
fmt.Print(" ")
}
for j := 0; j < (i + 1); j++ {
var length = len(nums)
var value int
if j == 0 || j == i {
value = 1
} else {
value = nums[length-i] + nums[length-i-1]
}
nums = append(nums, value)
//每个数字后面加空格以间隔数字.
fmt.Print(value, " ")
}
fmt.Println("")
}
}
func main() {
ShowYangHuiTriangle()
}
Java
public class TriangleArray
{
public static void main(String[] args)
{
final int NMAX = 10;
// allocate triangular array
int[][] odds = new int[NMAX + 1][];
for (int n = 0; n <= NMAX; n++)
odds[n] = new int[n + 1];
// fill triangular array
for (int n = 0; n < odds.length; n++)
for (int k = 0; k < odds[n].length; k++)
{
/*
* compute binomial coefficient n*(n-1)*(n-2)*...*(n-k+1)/(1*2*3*...*k)
*/
int lotteryOdds = 1;
for (int i = 1; i <= k; i++)
lotteryOdds = lotteryOdds * (n - i + 1) / i;
odds[n][k] = lotteryOdds;
}
// print triangular array
for (int[] row : odds)
{
for (int odd : row)
System.out.printf("%4d", odd);
System.out.println();
}
}
}
Python
代码量较少的实现方式如下:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
def triangles():
L = [1]
while True:
yield L
L = [sum(i) for i in zip([0]+L, L+[0])]
下面是另一种较易理解的方式:
def triangles():
L = [1]
S = []
while True:
yield L
L = [1] + S + [1]
S = []
for i in range(len(L)-1):
S.append(L[i] + L[i+1])
Visual Basic
Private Sub Form_Click()
N = InputBox("", "", 5)
ReDim a(N + 1, N + 1), b(N + 1, N + 1)
Cls
k = 8
For I = 1 To N
Print String((N - I) * k / 2 + 1, " ");
For J = 1 To I
a(I, 1) = 1
a(I, I) = 1
a(I + 1, J + 1) = a(I, J) + a(I, J + 1)
b(I, J) = Trim(Str(a(I, J)))
Print b(I, J); String(k - Len(b(I, J)), " ");
Next J
Print
Next I
End Sub
C++
#include<iostream>
using namespace std;
int P(int n){
int a=1,i=1;
while(i<=n){
a*=i;
i++;
}
return a;
}
int C(int a,int b){
return P(a)/(P(b)*P(a-b));
}
int main(){
for(int i=1;i<14;i++){
for(int j=1;j<=i;j++){
cout << C(i-1,j-1) << " ";
}
cout << endl;
}
}
参考文献
- Victor J. Katz, editor, The Mathematics of Egypt, Mesopotamia, China, India, and Islam, A Sourcebook. Page 518, Princeton University Press 2007.
- 郭书春著 《中国科学技术史·数学卷》第十五章 《唐中叶至元中叶熟悉概论》第357页 (贾宪)创造《开发作法本源》即贾宪三角 科学出版社 2010
- 《永乐大典》卷一万六千三百四十四
- 朱世杰 原著 李兆华校证 《四元玉鉴校证》卷首《古法七乘方图》 第58页 科学出版社 2007 ISBN 978-7-03-020112-6
- 李俨 《中算家的巴斯噶三角形研究》《李俨.钱宝琮科学史全集》卷6,215-230页
- 华罗庚著 《从杨辉三角谈起》 《数学通报丛书》科学出版社 1956年10月
- 郭书春 《中国科学技术史·数学卷》422页 第十八章第二节 《贾宪三角》,科学出版社 2010
- 吴文俊主编 《中国数学史大系》第五卷 704页
- 郭书春 《中国科学技术史·数学卷》 第十八章第二节 《贾宪三角》,科学出版社 2010
- Singmaster, David, "Repeated Binomial Coefficients and Fibonacci numbers", Fibonacci Quarterly, volume 13, number 4, pages 296—298, 1975.