杨辉三角形

✍ dations ◷ 2024-12-23 06:59:17 #组合数学,阶乘与二项式主题

杨辉三角形,又称帕斯卡三角形、贾宪三角形、海亚姆三角形、巴斯卡三角形,是二项式系数的一种写法,形似三角形,在中国首现于南宋杨辉的《详解九章算法》得名,书中杨辉说明是引自贾宪的《释锁算书》,故又名贾宪三角形。前 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 11 8 28 56 70 56 28 8 1

杨辉三角形第 n {\displaystyle n} (1655年)介绍了这个三角形。帕斯卡搜集了几个关于它的结果,并以此解决一些概率论上的问题,影响面广泛,Pierre Raymond de Montmort(1708年)和亚伯拉罕·棣莫弗(1730年)都用帕斯卡来称呼这个三角形。

历史上曾经独立绘制过这种图表的数学家:

中国贾宪是贾宪三角的发明人,贾宪/杨辉称之为“释锁求廉本源”,朱世杰称之为“古法七乘方图”(1303年),明代数学家吴敬《九章详注比类算法大全》称之为“开方作法本源”(1450年);明王文素《算学宝鉴》称之为“开方本源图”(1524年);明代程大位《算法统宗》称之为“开方求廉率作法本源图”(1592年)。清代梅文鼎《少广拾遗》称之为“七乘府算法”(1692年);清代孔广森《少广正负术》称之为“诸乘方乘率表”;焦循《加减乘除释》称之为“古开方本原图”;刘衡《筹表开诸乘方捷法》称之为“开方求廉率图”;项名达《象数一原》称之为“递加图”。伟烈亚力《数学启蒙》称之为“倍廉法表”;李善兰《垛积比类》称之为“三角垛表”。近代中算史家李俨称之为“巴斯噶三角形”,但根据《永乐大典》指出“巴斯噶三角形”最早由贾宪使用。。著名数学家华罗庚,在1956年写的一本通俗读物《从杨辉三角谈起》,将贾宪的《开方作法本源》称为“杨辉三角”,首次将“巴斯噶三角形”回归宋代数学家名下;此后的中学数学教科书和许多数学科普读物都跟随之。另一方面,专业的中国数学史著作,都用“贾宪三角”这个称呼。。

由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 package main 2  3 import "fmt" 4  5 //行数 6 const LINES int = 10 7  8 //杨辉三角 9 func ShowYangHuiTriangle() {10 	nums := int{}11 	for i := 0; i < LINES; i++ {12 		//补空白13 		for j := 0; j < (LINES - i); j++ {14 			fmt.Print(" ")15 		}16 17 		for j := 0; j < (i + 1); j++ {18 			var length = len(nums)19 			var value int20 21 			if j == 0 || j == i {22 				value = 123 			} else {24 				value = nums + nums25 			}26 			nums = append(nums, value)27 			//每个数字后面加空格以间隔数字.28 			fmt.Print(value, " ")29 		}30 		fmt.Println("")31 	}32 }33 func main() {34 	ShowYangHuiTriangle()35 }

Java

 1 public class TriangleArray 2 { 3    public static void main(String args) 4    { 5       final int NMAX = 10;  6   7       // allocate triangular array 8       int odds = new int; 9       for (int n = 0; n <= NMAX; n++)10          odds = new int;  11  12       // fill triangular array13       for (int n = 0; n < odds.length; n++)14          for (int k = 0; k < odds.length; k++)15          {16             /*17              * compute binomial coefficient n*(n-1)*(n-2)*...*(n-k+1)/(1*2*3*...*k)18              */19             int lotteryOdds = 1;20             for (int i = 1; i <= k; i++)21                lotteryOdds = lotteryOdds * (n - i + 1) / i;22  23             odds = lotteryOdds;24          }25  26       // print triangular array27       for (int row : odds)28       {29          for (int odd : row)30             System.out.printf("%4d", odd);31          System.out.println();32       }33    }34 }

Python

代码量较少的实现方式如下:

1 # -*- coding: utf-8 -*-2 #!/usr/bin/env python3 def triangles():4     L = 5     while True:6         yield L7         L = +L, L+)]

下面是另一种较易理解的方式:

相关