簡(jiǎn)介
楊輝三角,是二項(xiàng)式系數(shù)在三角形中的一種幾何排列。在歐洲,這個(gè)表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年發(fā)現(xiàn)這一規(guī)律的,比楊輝要遲393年,比賈憲遲600年。楊輝三角是中國(guó)古代數(shù)學(xué)的杰出研究成果之一,它把二項(xiàng)式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來(lái),是一種離散型的數(shù)與形的優(yōu)美結(jié)合1。
概述前提:每行端點(diǎn)與結(jié)尾的數(shù)為1.
每個(gè)數(shù)等于它上方兩數(shù)之和。
每行數(shù)字左右對(duì)稱,由1開(kāi)始逐漸變大。
第n行的數(shù)字有n項(xiàng)。
第n行數(shù)字和為2n-1。
第n行的m個(gè)數(shù)可表示為 C(n-1,m-1),即為從n-1個(gè)不同元素中取m-1個(gè)元素的組合數(shù)。
第n行的第m個(gè)數(shù)和第n-m+1個(gè)數(shù)相等 ,為組合數(shù)性質(zhì)之一。
每個(gè)數(shù)字等于上一行的左右兩個(gè)數(shù)字之和。可用此性質(zhì)寫(xiě)出整個(gè)楊輝三角。即第n+1行的第i個(gè)數(shù)等于第n行的第i-1個(gè)數(shù)和第i個(gè)數(shù)之和,這也是組合數(shù)的性質(zhì)之一。即 C(n+1,i)=C(n,i)+C(n,i-1)。
(a+b)n的展開(kāi)式中的各項(xiàng)系數(shù)依次對(duì)應(yīng)楊輝三角的第(n+1)行中的每一項(xiàng)。
將第2n+1行第1個(gè)數(shù),跟第2n+2行第3個(gè)數(shù)、第2n+3行第5個(gè)數(shù)……連成一線,這些數(shù)的和是第4n+1個(gè)斐波那契數(shù);將第2n行第2個(gè)數(shù)(n>1),跟第2n-1行第4個(gè)數(shù)、第2n-2行第6個(gè)數(shù)……這些數(shù)之和是第4n-2個(gè)斐波那契數(shù)。
將各行數(shù)字相排列,可得11的n-1(n為行數(shù))次方:1=11^0; 11=11^1; 121=11^2……當(dāng)n>5時(shí)會(huì)不符合這一條性質(zhì),此時(shí)應(yīng)把第n行的最右面的數(shù)字"1"放在個(gè)位,然后把左面的一個(gè)數(shù)字的個(gè)位對(duì)齊到十位... ...,以此類推,把空位用“0”補(bǔ)齊,然后把所有的數(shù)加起來(lái),得到的數(shù)正好是11的n-1次方。以n=11為例,第十一行的數(shù)為:1,10,45,120,210,252,210,120,45,10,1,結(jié)果為 25937424601=1110。
應(yīng)用性質(zhì)5和性質(zhì)7是楊輝三角的基本性質(zhì),是研究楊輝三角其他規(guī)律的基礎(chǔ)。
與楊輝三角聯(lián)系最緊密的是二項(xiàng)式乘方展開(kāi)式的系數(shù)規(guī)律,即二項(xiàng)式定理。例如在楊輝三角中,第3行的三個(gè)數(shù)恰好對(duì)應(yīng)著兩數(shù)和的平方的展開(kāi)式的每一項(xiàng)的系數(shù)(性質(zhì) 8),第4行的四個(gè)數(shù)恰好依次對(duì)應(yīng)兩數(shù)和的立方的展開(kāi)式的每一項(xiàng)的系數(shù),即 ,以此類推。
又因?yàn)樾再|(zhì)5:第n行的m個(gè)數(shù)可表示為C(n-1,m-1),即為從n-1個(gè)不同元素中取m-1個(gè)元素的組合數(shù)。因此可得出二項(xiàng)式定理的公式為:
因此,二項(xiàng)式定理與楊輝三角形是一對(duì)天然的數(shù)形趣遇,它把數(shù)形結(jié)合帶進(jìn)了計(jì)算數(shù)學(xué)。求二項(xiàng)式展開(kāi)式系數(shù)的問(wèn)題,實(shí)際上是一種組合數(shù)的計(jì)算問(wèn)題。用系數(shù)通項(xiàng)公式來(lái)計(jì)算,稱為“式算”;用楊輝三角形來(lái)計(jì)算,稱作“圖算”2。
數(shù)在楊輝三角中的出現(xiàn)次數(shù)由1開(kāi)始,正整數(shù)在楊輝三角形出現(xiàn)的次數(shù)為∞,1, 2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 2, 4, ... (OEIS:A003016)。最小而又大于1的數(shù)在賈憲三角形至少出現(xiàn)n次的數(shù)為2, 3, 6, 10, 120, 120, 3003, 3003, ... (OEIS:A062527)
除了1之外,所有正整數(shù)都出現(xiàn)有限次,只有2出現(xiàn)剛好一次,6,20,70等出現(xiàn)三次;出現(xiàn)兩次和四次的數(shù)很多,還未能找到出現(xiàn)剛好五次的數(shù)。120,210,1540等出現(xiàn)剛好六次。(OEIS:A098565)
因?yàn)閬G番圖方程 有無(wú)窮個(gè)解,所以出現(xiàn)至少六次的數(shù)有無(wú)窮個(gè)多。解為
,其中Fn表示第n個(gè)斐波那契數(shù)(F1=F2=1)。
3003是第一個(gè)出現(xiàn)八次的數(shù)。
歷史沿革北宋人賈憲約1050年首先使用“賈憲三角”進(jìn)行高次開(kāi)方運(yùn)算。
楊輝,字謙光,南宋時(shí)期杭州人。在他1261年所著的《詳解九章算法》一書(shū)中,輯錄了如上所示的三角形數(shù)表,稱之為“開(kāi)方作法本源”圖,并說(shuō)明此表引自11世紀(jì)中葉(約公元1050年)賈憲的《釋鎖算術(shù)》,并繪畫(huà)了“古法七乘方圖”。故此,楊輝三角又被稱為“賈憲三角”。
元朝數(shù)學(xué)家朱世杰在《四元玉鑒》(1303年)擴(kuò)充了“賈憲三角”成“古法七乘方圖”。
意大利人稱之為“塔塔利亞三角形”(Triangolo di Tartaglia)以紀(jì)念在16世紀(jì)發(fā)現(xiàn)一元三次方程解的塔塔利亞。
在歐洲直到1623年以后,法國(guó)數(shù)學(xué)家帕斯卡在13歲時(shí)發(fā)現(xiàn)了“帕斯卡三角”。
布萊士·帕斯卡的著作Traité du triangle arithmétique(1655年)介紹了這個(gè)三角形。帕斯卡搜集了幾個(gè)關(guān)于它的結(jié)果,并以此解決一些概率論上的問(wèn)題,影響面廣泛,Pierre Raymond de Montmort(1708年)和亞伯拉罕·棣·美弗(1730年)都用帕斯卡來(lái)稱呼這個(gè)三角形。
21世紀(jì)以來(lái)國(guó)外也逐漸承認(rèn)這項(xiàng)成果屬于中國(guó),所以有些書(shū)上稱這是“中國(guó)三角形”(Chinese triangle)
歷史上曾經(jīng)獨(dú)立繪制過(guò)這種圖表的數(shù)學(xué)家有:
賈憲 中國(guó)北宋 11世紀(jì) 《釋鎖算術(shù)》
楊輝 中國(guó)南宋1261《詳解九章算法》記載之功
朱世杰 中國(guó)元代 1299《四元玉鑒》級(jí)數(shù)求和公式
阿爾·卡西 阿拉伯 1427《算術(shù)的鑰匙》
阿皮亞納斯 德國(guó) 1527
米歇爾.斯蒂費(fèi)爾 德國(guó) 1544《綜合算術(shù)》二項(xiàng)式展開(kāi)式系數(shù)
薛貝爾 法國(guó) 1545
B·帕斯卡 法國(guó) 1654《論算術(shù)三角形》
其實(shí),中國(guó)古代數(shù)學(xué)家在數(shù)學(xué)的許多重要領(lǐng)域中處于遙遙領(lǐng)先的地位。中國(guó)古代數(shù)學(xué)史曾經(jīng)有自己光輝燦爛的篇章,而楊輝三角的發(fā)現(xiàn)就是十分精彩的一頁(yè)。
在編程中實(shí)現(xiàn)楊輝三角在編程實(shí)現(xiàn)中較為容易。最常見(jiàn)的算法便是用上一行遞推計(jì)算;也有運(yùn)用和組合的對(duì)應(yīng)關(guān)系而使用階乘計(jì)算的,然而后者速度較慢且階乘容易溢出。編程的輸出大多相類,此處并不過(guò)多添加截圖。
C、C++、C#、Java 語(yǔ)言之間的語(yǔ)法也大多相類,因此這里也不會(huì)將每一種算法都在這些語(yǔ)言中各實(shí)現(xiàn)一遍。要在這些語(yǔ)言的版本間修改,實(shí)際上只需注意一些簡(jiǎn)單的語(yǔ)法和函數(shù)名稱的改變,如 C 的 int yh[M][M] 應(yīng)改寫(xiě)為 Java 的 int[][] yh = new int[M][M]、C# 的 int[,] yh=new int[M,M];C printf 應(yīng)使用 Java 的 System.out.print、C# 的 Console.Write 、C++ 中更智能的 cout 來(lái)替換。
C++#include#includeusing namespace std;int main(){ const int n = 15; const int m = 2 * n-1; int arr[n + 1][m] = { 0 }; for (int i = 0; i Python較為便捷,代碼量較少的實(shí)現(xiàn)方式如下:
# -*- coding: utf-8 -*-#!/usr/bin/env pythondef triangles(): L = [1] while True: yield L L.append(0) L = [L[i - 1] + L[i] for i in range(len(L))]該方式用到了列表生成式,理解起來(lái)較困難,下面是另一種方式:
def triangles(): ret = [1] while True: yield ret for i in range(1, len(ret)): ret[i] = pre[i] + pre[i - 1] ret.append(1) pre = ret[:]另一個(gè)不用生成器的版本:
def YangHui (num = 10): LL = [[1]] for i in range(1,num): LL.append([(0 if j== 0 else LL[i-1][j-1])+ (0 if j ==len(LL[i-1]) else LL[i-1][j]) for j in range(i+1)]) return LL