数学发展史
- 16世纪的初等数学
- 以高等数学和线性代数为代表的分析数学
- 数论集合论出现后的现代数学
组合数学概述
定义
广义的组合数学(英语:Combinatorics)就是离散数学,狭义的组合数学是组合计数、图论、代数结构、数理逻辑等的总称。但这只是不同学者在叫法上的区别。总之,组合数学是一门研究离散对象的科学。
三大问题
存在性,计数,优化
重点思维
组合数学教给我们的更多的是一种思维,无重复无遗漏地计数的思维以及分析问题解决问题的能力。
组合数学的历史
东方_幻方
定义
是一种数字安排在正方形格中,使每行、列和对角线数字和相等的方法。 在汉朝时,也是一种游戏!
构造
分为奇数情况、单偶数、双偶数情况。
奇数情况可以采用楼梯法和杨辉三角法。
计数
n=1,…,5时,如果不考虑旋转和反射,n阶幻方的数目分别是1,0,1,880,275305224.
三阶普通幻方只有一个,无完美幻方。同构有8种,旋转4个角度,翻转2个角度。
西方_阿基米德手稿
14巧板组合,一共17152种。 计算机学家和数学家争论。
组合数学的应用
手机密码问题
安卓的屏幕解锁和苹果的4数字解锁方式。
思路如下 首先9个圆圈每个有已使用和未使用两种状态,共有2^9=512种,可用9个2进制位表示,接着再添加一维:一个密码序列最后的圆圈为哪个(9种) dp数组的含义 dp[9个圆圈的使用状态][密码序列最末圆圈的序号]=方案数 这样便可转移 为了编程方便使用0~8做每个圆圈的序号。 注意到若两个圆圈连线上有另一个圆圈,则两个圆圈必同时处在角落,或同时处在上下边的中间,或同时处在左右边的中间,两圆圈中间圆圈的序号即为(a b)/2。 (只是个小trick,作用不大) 转移的顺序必然以使用过圆圈的数目大小为顺序,即只有使用过a个圆圈的序列的方案数取得后才能计算使用了a 1个圆圈的方案数。 在得到某个状态的方案数后,枚举下一个可行的圆圈,将方案数加给对应序列的对应状态上。 这个算法的时间复杂度是O((2^n)×(n^3))。
代码语言:javascript复制// AndroidLock.cpp
// Created by 赵宏祝 on 10/16/14.
#include <iostream>
<pre><code> using namespace std;
//============================
//the keys starts from 0 and end at 8
int dp[512][9]; //dp[i][j]:the answers when keys that i&k == true are used and end at j
int type[9] = {1, 2, 1, 3, 0, 3, 1, 2, 1}; //at corner : 1, up/low mid : 2, l/r mid : 3
int ans[10]; //the answers with i points
//============================
int usedKeys(int a) { //return how many keys a state have used
int ret = 0;
for (int i = 0; i < 9; i ) {
if (a & (1 << i)) {
ret ;
}
}
return ret;
}
bool haveUsed(int a, int k) {//return if k is used in state a
return a & (1 << k);
}
int calcMid(int a, int b) {//return the mid number of i, j.return 0 if they don't have a number between them
return type[a] == type[b] ? (a b) / 2 : 0;
}
int main(){
for (int i = 0; i < 9; i ) {//initialize
dp[1 << i][i] = 1;
}
for (int num = 1; num <= 9; num ){//calc states with num number used
for (int k = 1; k < (1 << 9); k ) {//enum all states
if (usedKeys(k) != num) continue;
for (int i = 0; i < 9; i ) {//enum the end key
if (!haveUsed(k, i)) continue;
for (int j = 0; j < 9; j ) {//enum the new end key
if (haveUsed(k, j)) continue;
int mid;
if ((mid = calcMid(i, j)) && !haveUsed(k, mid)) continue;
dp[k | (1 << j)][j] = dp[k][i];
}
}
}
}
for (int k = 1; k < (1 << 9); k ) {
for (int i = 0; i < 9; i ) {
ans[usedKeys(k)] = dp[k][i];
}
}
for (int i = 1; i <= 9; i ) {
cout << "The " << i << "-point gesture has " << ans[i] << " solutions." << endl;
}
return 0;
}
单淘汰赛场次问题
16-1=15
七桥问题
1 提出时间
七桥问题
18世纪著名古典数学问题之一。在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来(如图)。问是否可能从这四块陆地中任一块出发,恰好通过每座桥一次,再回到起点?欧拉于1736年研究并解决了此问题,他把问题归结为如左图的“一笔画”问题,证明上述走法是不可能的。
有关图论研究的热点问题。18世纪初普鲁士的哥尼斯堡,有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系起来(如右上图)。有个人提出一个问题:一个步行者怎样才能不重复、不遗漏地一次走完七座桥,最后回到出发点。后来大数学家欧拉把它转化成一个几何问题(如左图下)——一笔画问题。他不仅解决了此问题,且给出了连通图可以一笔画的充要条件是:奇点的数目不是0 个就是2 个(连到一点的数目如是奇数条,就称为奇点,如果是偶数条就称为偶点,要想一笔画成,必须中间点均是偶点,也就是有来路必有另一条去路,奇点只可能在两端,因此任何图能一笔画成,奇点要么没有要么在两端。
推断方法
当Euler在1736年访问Konigsberg, Prussia(now Kaliningrad Russia)时,他发现当地的市民正从事一项非常有趣的消遣活动。Konigsberg城中有一条名叫Pregel的河流横经其中,这项有趣的消遣活动是在星期六作一次走过所有七座桥的散步,每座桥只能经过一次而且起点与终点必须是同一地点。
Euler把每一块陆地考虑成一个点,连接两块陆地的桥以线表示。
后来推论出此种走法是不可能的。他的论点是这样的,除了起点以外,每一次当一个人由一座桥进入一块陆地(或点)时,他(或她)同时也由另一座桥离开此点。所以每行经一点时,计算两座桥(或线),从起点离开的线与最后回到始点的线亦计算两座桥,因此每一个陆地与其他陆地连接的桥数必为偶数。
存在问题
七桥所成之图形中,没有一点含有偶数条数,因此上述的任务无法完成。
欧拉的这个考虑非常重要,也非常巧妙,它正表明了数学家处理实际问题的独特之处——把一个实际问题抽象成合适的“数学模型”。这种研究方法就是“数学模型方法”。这并不需要运用多么深奥的理论,但想到这一点,却是解决难题的关键。
接下来,欧拉运用图中的一笔画定理为判断准则,很快地就判断出要一次不重复走遍哥尼斯堡的7座桥是不可能的。也就是说,多少年来,人们费脑费力寻找的那种不重复的路线,根本就不存在。一个曾难住了那么多人的问题,竟是这么一个出人意料的答案!
2 最终成果
问题初期
问题提出后,很多人对此很感兴趣,纷纷进行试验,但在相当长的时间里,始终未能解决。而利用普通数学知识,每座桥均走一次,那这七座桥所有的走法一共有5040种,而这么多情况,要一一试验,这将会是很大的工作量。但怎么才能找到成功走过每座桥而不重复的路线呢?因而形成了著名的“哥尼斯堡七桥问题”。
问题后期进展
1735年,有几名大学生写信给当时正在俄罗斯的彼得斯堡科学院任职的天才数学家欧拉,请他帮忙解决这一问题。欧拉在亲自观察了哥尼斯堡七桥后,认真思考走法,但始终没能成功,于是他怀疑七桥问题是不是原本就无解呢?
1736年,在经过一年的研究之后,29岁的欧拉提交了《哥尼斯堡七桥》的论文,圆满解决了这一问题,同时开创了数学新一分支—图论。
在论文中,欧拉将七桥问题抽象出来,把每一块陆地考虑成一个点,连接两块陆地的桥以线表示。并由此得到了如图一样的几何图形。 若我们分别用A、B、C、D四个点表示为哥尼斯堡的四个区域。这样著名的“七桥问题”便转化为是否能够用一笔不重复的画出过此七条线的问题了。若可以画出来,则图形中必有终点和起点,并且起点和终点应该是同一点,由于对称性可知由B或C为起点得到的效果是一样的,若假设以A为起点和终点,则必有一离开线和对应的进入线,若我们定义进入A的线的条数为入度,离开线的条数为出度,与A有关的线的条数为A的度,则A的出度和入度是相等的,即A的度应该为偶数。即要使得从A出发有解则A的度数应该为偶数,而实际上A的度数是5为奇数,于是可知从A出发是无解的。同时若从B或D出发,由于B、D的度数分别是3、3,都是奇数,即以之为起点都是无解的。
七桥问题
有上述理由可知,对于所抽象出的数学问题是无解的,即“七桥问题”也是无解的。
由此我们得到:欧拉回路关系
由此我们可知要使得一个图形可以一笔画,必须满足如下两个条件:
- 图形必须是连通的。
- 图中的“奇点”个数是0或2。
我们也可以依此来检验图形是不是可一笔画出。回头也可以由此来判断“七桥问题”,4个点全是奇点,可知图不能“一笔画出”,也就是不存在不重复地通过所有七桥。
1736年,欧拉在交给彼得堡科学院的《哥尼斯堡7座桥》的论文报告中,阐述了他的解题方法。他的巧解,为后来的数学新分支——拓扑学的建立奠定了基础。
七桥问题和欧拉定理
欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡居民提出的问题,而且得到并证明了更为广泛的有关一笔画的三条结论,人们通常称之为 欧拉定理。对于一个连通图,通常把从某结点出发一笔画成所经过的路线叫做欧拉路。人们又通常把一笔画成回到出发点的欧拉路叫做欧拉回路。具有欧拉回路的图叫做欧拉图。
一笔画
- 凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为终点画完此图。
- 凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另一个奇点为终点。
- 其他情况的图都不能一笔画出。(奇点数除以二便可算出此图需几笔画成。)