杨辉三角形

本页使用了标题或全文手工转换,现处于中国大陆简体模式
求闻百科,共笔求闻
永乐大典》一页:杨辉引用贾宪《释锁算书》中的贾宪三角形

杨辉三角形,又称帕斯卡三角形贾宪三角形海亚姆三角形巴斯卡三角形,是二项式系数的一种写法,形似三角形,在中国首现于南宋杨辉的《详解九章算法》得名,其在书中说明是引自贾宪的《释锁算书》,故又名贾宪三角形。前 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开始逐渐变大,然后变小,回到1。
  2. 杨辉三角形每一行的平方和在杨辉三角出现奇数次。
  3. 杨辉三角形第2的幂行所有数都是奇数。
  4. 行的数字个数为 个。
  5. 行的第 个数字为组合数
  6. 行数字和为
  7. 除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第 行第 个数字等于第 行的第 个数字与第 个数字的和)。这是因为有组合恒等式:。可用此性质写出整个杨辉三角形。

历史

朱世杰《四元玉鉴》中的“古法七乘方图”

波斯数学家Al-Karaji和天文学家兼诗人欧玛尔·海亚姆(عمر خیام,Omar Khayyám)在10世纪都发现了这个三角形,而且还知道可以借助这个三角形找次根,和它跟二项式的关系。但他们的著作已不存。[1]

11世纪北宋数学家贾宪发明了贾宪三角,并发明了增乘方造表法,可以求任意高次方的展开式系数。贾宪还对贾宪三角表(古代称数字表为“立成”)的构造进行描述。[2]贾宪的三角表图和文字描写,仍保存在大英博物馆所藏《永乐大典》卷一万六千三百四十四。

13世纪中国南宋数学家杨辉在《详解九章算术》里解释这种形式的数表,并说明此表引自11世纪前半贾宪的《释锁算术》[3]

1303年元朝数学家朱世杰在《四元玉鉴》卷首绘制《古法七乘方图》[4]

意大利人称之为“塔塔利亚三角形”(Triangolo 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
    • 因为丢番图方程

      有无穷个解[10],所以出现至少六次的数有无穷多个。
    • 其解答,是

    • 其中表示第个斐波那契数()。
  • 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++

//以下只有列出14行

#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;
	}
}

参考文献

  1. Victor J. Katz, editor, The Mathematics of Egypt, Mesopotamia, China, India, and Islam, A Sourcebook. Page 518, Princeton University Press 2007.
  2. 郭书春著 《中国科学技术史·数学卷》第十五章 《唐中叶至元中叶熟悉概论》第357页 (贾宪)创造《开发作法本源》即贾宪三角 科学出版社 2010
  3. 永乐大典》卷一万六千三百四十四
  4. 朱世杰 原著 李兆华校证 《四元玉鉴校证》卷首《古法七乘方图》 第58页 科学出版社 2007 ISBN 978-7-03-020112-6
  5. 李俨 《中算家的巴斯噶三角形研究》《李俨.钱宝琮科学史全集》卷6,215-230页
  6. 华罗庚著 《从杨辉三角谈起》 《数学通报丛书》科学出版社 1956年10月
  7. 郭书春 《中国科学技术史·数学卷》422页 第十八章第二节 《贾宪三角》,科学出版社 2010
  8. 吴文俊主编 《中国数学史大系》第五卷 704页
  9. 郭书春 《中国科学技术史·数学卷》 第十八章第二节 《贾宪三角》,科学出版社 2010
  10. Singmaster, David, "Repeated Binomial Coefficients and Fibonacci numbers", Fibonacci Quarterly, volume 13, number 4, pages 296—298, 1975.

外部链接

参见