浅析数学和计算机技术的相互影响.docx
《浅析数学和计算机技术的相互影响.docx》由会员分享,可在线阅读,更多相关《浅析数学和计算机技术的相互影响.docx(12页珍藏版)》请在冰豆网上搜索。
浅析数学和计算机技术的相互影响
浅析数学和计算机技术的相互影响
中三
(2)班3号陈明悦
摘要
数学和计算机的关系非常密切。
一直到二三十年以前,计算机科学本身还是数学学科的一个分支,最早研究计算机的专家也都是数学家。
在计算机进行运算的基本原理中,处处渗透着数学的各种思想。
而现在,计算机科学已经深受人们的关注,成为了一个独立的学术领域,这之间离不开数学理论的推动;反之,从数学的发展来看,不仅可以利用计算机解决大量人工无法实现的巨量计算问题,很多难以证明的定理还可以通过计算机完成证明;程序,作为数学与计算机之间的一座重要桥梁,在数学的发展,计算机的应用方面起着双重的推动作用。
本文从数学原理与计算机技术的关系展开讨论。
[关键词]数学计算机相互促进发展
一、引言
从初中二年级开始,我就在老师的推荐下开始学习Pascal编程。
刚开始的时候,我并没有真正理解编程的价值,只是盲目地为了应付竞赛。
后来,由于我比较喜欢数学,渐渐地感到学习编程不只局限于程序本身,数学方法和数学思维方式对计算机程序设计很重要。
在查阅了一些资料后,了解到数学是计算机科学必不可少的基础,而且计算机技术的进步又促进了数学理论的创新和发展,于是,选定计算机和数学的关系作为本论文的讨论内容。
数学是一门基础理论学科,数学在科学研究中的作用众所周知,甚至被称为“科学的皇后”。
数学是所有学科的基础,统治着所有涉及到量的世界。
每个想要搞理科研究的学者都必须有良好的数学基础。
在计算机发明之前,数学的发展是靠无数科学家们代代相传的努力换来的。
有了计算机,数学的发展的确变得更快更好。
但是,具体地说,计算机技术是如何推动数学学科的发展的?
数学作为计算机技术的基础又体现在哪些方面,下面从两者之间的相互影响展开讨论。
二、数学是计算机技术的基础
1、数学家对计算机理论和技术的贡献
提到计算机,不能不提到二十世纪的两位伟大的数学家——阿兰•图灵和冯•诺伊曼。
阿兰•图灵是英国一位著名的数学家。
他通过仔细研究,提出了“所有的数学运算过程都可以抽象成数学模型”的观点,并于1936年开创性地提出了计算机的运算模型,奠定了现代计算机技术的理论基础,因此被誉为“计算机理论之父”。
冯•诺伊曼是美籍匈牙利数学家。
他的重要贡献是对由约翰·莫克利(JohnMauchly)和普雷斯伯·埃克特(PresperEckert)研制的世界上第一台数字式电子计算机进行了一次全新的改革。
这项改革从此彻底改变了计算机技术的命运。
原来,莫克利和埃克特发明的计算机虽然能大大提高运算速度,但它却存在着两个致命缺点:
(1)没有储存器,无法将数据或指令存储到计算机中;
(2)每次执行不同的任务,都要重新布置导线。
这样,它运算速度快的优点被布线所需花费的大量时间所抵消。
因此,他的应用也仅限于复杂的科学计算和军事应用。
冯·诺伊曼运用数学中的“二进制”思想将其改进,发明了“离散变量自动电子计算机”EDVAC(electronicdiscretevariableautomaticcomputer)。
这种计算机能够将数据或指令储存,更重要的是它由于采用了二进制的运算方式,大大方便了数据的传输。
这样,计算机的应用面立刻扩大了,它不仅被用在军事与尖端技术上,同时也应用在工程设计、数据处理、事务管理等方面。
可以说,我们现在使用的计算机还是建立在EDVAC基础之上的。
由于冯•诺伊曼对计算机技术的巨大贡献,他被称为“计算机之父”。
2、数学思想在计算机技术中的运用
现代计算机之所以能够如此智能化,在很大程度上是由于受了数学思想的启发。
数学逻辑结构的严谨,数学理论的严密,甚至许多数学方法本身,都直接被广泛地采用到计算机科学的众多领域。
比如,数学中的二进制思想已成为现代计算机技术发展的坚实基础。
广泛地说,只要进行数据的传输或整理时,就要用到这种思想。
具体做法是将每一个字节的数据用八位二进制数保存,这样在通过导线传输时只需用导线的通与断来分别表示0和1,就可以表示整个字节。
从一个文件的储存,到一幅千兆图片的存储,更甚网络中成千上万的各种格式的数据的运送,都是离不开二进制的。
回想一下,如果没有二进制的思想作为基础,或者说没有数学的发展作基础,何来冯·诺伊曼的伟大创举,乃至EDVAC和当今计算机的诞生呢?
从这个意义上说,没有数学原理的应用,就没有现代的计算机技术。
3、数学原理对计算机软件系统的支持
上述提到的是计算机硬件技术的发展对数学的依赖,除此之外,计算机软件设计也离不开数学原理的支持。
要掌握好计算机程序设计,数学功底非常重要。
从我个人的体会来看,要设计任何一个计算机算法,其实质都是先将问题转化为一个(更多的情况下是多个)需要解决的子问题,然后再想办法逐一解决这些问题,最后使得整个程序连贯为一体。
通俗的讲,就是先“审题”,然后考虑解决的方法,一步一步深入,直到整个问题解决。
这其中是一环紧扣一环,有着非常严密的逻辑性的。
少一个步骤,跳一个步骤,或者有一个环节出了差错,整个程序就会瘫痪。
另外,就从编程序的这个环节来说,利用任何一种语言编制程序都需要不断运用数学理论来帮助。
同时,仍然要保持程序逻辑的严密性。
一个具有数学修养的程序员在写代码时更有可能写出逻辑严密的最简化的高质量代码。
尤其是对大型复杂的软件系统,如果没有良好的数学思维的训练,是很难编制出高质量的程序的。
举例说,我们要操作或控制计算机,就必须有操作系统。
操作系统至今已经有了几百种,个人计算机中最常用的有windows98/me/2000/2003/xp等。
这些复杂的操作系统的产生,归根结底还是由不同的程序模块组合而成。
这样大型的程序系统,离不开一个又一个的子程序,以及它们之间严密的优化组合,这样才能让用户放心使用,不会出现意想不到的漏洞与问题。
有关研究表明,我们国家计算机软件水平的落后不是因为我们缺少程序员,而是因为缺乏懂数学的高质量的程序员。
又比如微软公司总裁比尔·盖茨,他之所以能够在计算机软件方面取得成功,很大程度上是由于年青时对数学的痴迷,具有的极强的数学思维能力。
归根结底,程序是计算机与数学之间最重要的一座连接的桥梁。
有关程序的讨论放在下文中。
三、计算机技术对数学发展的贡献
1、计算机的高速运算能力
计算机之所以在数学上被广泛应用的一个因素是由数学计算的特有需要和计算机具有的独特优点所决定的,那就是:
高速运算。
粗略地说,计算机在数学学科的应用价值主要体现在快速穷举方面。
我们知道,当面对一个很大的数据量时,靠人脑计算就十分困难了,不但进展很慢,而且计算的错误率很大。
这时,我们就经常用到计算机的穷举法。
既然计算机的运算速度可以达到每秒几千万次,靠这样的速度,即使算上编程序的时间(编穷举法程序比其它程序容易得多,程序员把大量的工作交给了计算机去完成,程序语言也比较简单),也会大大提高解决问题的效率。
而且,计算机的准确率相当高,用这样的方法解决问题,自然要比人工优越得多。
2、程序是连接计算机和数学运算的桥梁
有了计算机,很多数学问题可以通过编写适当的程序解决,每个数学模型都可以写出对应的计算机程序。
我们来看几个例子。
例1,“利用三角形三边长计算面积”,可以写出如下程序(用Pascal语言编写)。
Programsquare;
Var
a,b,c:
real;{变量a,b,c表示三边的长}
s,p:
real;{s表示面积,p表示半周长}
begin
readln(a,b,c);{从键盘读入a,b,c}
p:
=(a+b+c)/2;{计算半周长}
s:
=sqrt(p*(p-a)*(p-b)*(p-c)){用海伦公式计算s}
writeln(‘s=’,s);{输出s}
End.
(说明:
由用户输入一个已知三角形的三边长,程序会自动计算出其面积,遇到给定三边不能构成三角形时自动跳出程序并提示错误)
像这样一个程序是十分浅显易懂的,其中的重要步骤即海伦公式的运用。
可见如果没有海伦公式这样的数学原理的话,这个程序的编写变成了空谈。
需要说明的是,此程序能帮助运算的主要体现是使得运算速度大大提高。
例2:
可以写出如下判断一个自然数是否是素数的程序(用Pascal语言编写)。
我们知道,判断素数的主要方法是将他除以每一个小于等于他的算术平方根的自然数。
当数据很大时,一个一个地去试验是一种十分费时费力的方法,这时我们就可以让计算机帮我们去完成试验的工作。
程序如下。
programprime;
var
p:
longint;{要判断的自然数}
q:
longint;{每一个实验时用到的除数}
f:
Boolean;{是否是素数的标志}
begin
readln(p);{键盘读入p}
f:
=true;{假设p是素数}
forq:
=2totrunc(sqrt(p))do{将q分别赋值每一个小于等于p的算术平方根的自然数并重复执行如下语句:
}
ifpmodq=0thenbeginf:
=false;break;end;{进行试验,若p是q的倍数,就将f赋值false并结束循环}
iff=truethenwrite(‘Yes.’){根据情况打印出相应的判断}
elsewrite(‘No.’)
end.
(说明:
用户只需输入一个自然数,程序便能自动判断其是否素数)
在一眨眼间,上述程序就能对十亿级的数字进行判断。
此外,对于上面的程序,当p和q的变量类型都设定为longint(长整型)时,就可以表示十亿级的数字了,如果用一个一维数组来表示数的话(即假设有数列a,数列中的数分别为a[1],a[2],…a[n],那么用a[1]表示这个数字的第一位,a[2]表示第二位,依此类推),那么如果n仍以longint作为类型,这样就可以表示一个千兆位的数字了,可想而知他的“厉害”了。
例三:
用哈夫曼树原理编制哈夫曼编码:
programhuffman_tree;
type
node=record
w,llink,rlink,parent:
integer;
end;
element=record
symbol:
char;
code:
string;
end;
var
tree:
array[1..100]ofnode;
table:
array[1..100]ofelement;
n,i:
integer;
procedureputin;
var
ch:
char;
i:
integer;
begin
fori:
=1tondo
begin
read(ch);
table[i].symbol:
=ch;
end;
end;
procedureselect(s:
integer;varx1,x2:
integer);
var
i,min1,min2:
integer;
begin
min1:
=maxint;min2:
=min1;
x1:
=0;x2:
=0;
fori:
=1tosdo
begin
iftree[i].parent=0then
iftree[i].wx2:
=x1;x1:
=i;
min2:
=min1;min1:
=tree[i].w;
end
elseiftree[i].wx2:
=i;min2:
=tree[i].w;end;
end;
end;
proceduresettree;
var
i,x1,x2:
integer;
begin
fori:
=1tondo
begin
withtree[i]do
begin
read(w);
llink:
=0;rlink:
=0;
parent:
=0;
end;
end;
fori:
=n+1to2*n-1do
begin
select(i-1,tree[i].llink,tree[i].rlink);
tree[tree[i].llink].parent:
=i;
tree[tree[i].rlink].parent:
=i;
end;
end;
proceduregetcode;
var
i,i1,s:
integer;
begin
fori:
=1tondo
begin
i1:
=i;
table[i1].code:
='';
repeat
s:
=tree[i1].parent;
iftree[s].llink=i1thentable[i].code:
='0'+table[i].code
elsetable[i].code:
='1'+table[i].code;
i1:
=s;
untiltree[s].parent=0;
end;
end;
proceduretranslate_into;
var
ch:
char;
i:
integer;
begin
read(ch);
whilech<>'#'do
begin
i:
=1;
whiletable[i].symbol<>chdoi:
=i+1;
write(table[i].code);
read(ch);
end;
end;
proceduretranslate_oufo;
var
st:
string;
ch:
char;
i:
integer;
begin
st:
='';
read(ch);
whilech<>'#'do
begin
i:
=1;
while(table[i].code<>st)and(i<=10)doi:
=i+1;
iftable[i].code=stthenbeginwrite(table[i].symbol);st:
='';end;
st:
=st+ch;
read(ch);
end;
i:
=1;
while(table[i].code<>st)and(i<=10)doi:
=i+1;
write(table[i].symbol);
end;
begin
readln(n);
settree;
readln;
putin;
readln;
getcode;
fori:
=1tondo
writeln(table[i].symbol:
4,table[i].code);
readln;
translate_into;
readln;readln;
translate_oufo;
readln;
end.
(使用说明:
哈夫曼编码主要运用于数据加密与方便传输,用哈夫曼树可以方便地根据数据串中每种字符出现的频率(由用户输入,即每种字符的权重)来合理编排编码。
具体原理复杂,在此不详细介绍。
使用方法:
1、输入字符种数并换行;依次输入各种字符的权重,换行;
2、依上述顺序输入各种字符,换行;
3、屏幕上自动打印出所编排好的每种字符的编码,需用户手动换行,并输入要进行翻译的字符串,以#结束并换行;
4、屏幕自动打印出所转换而来的编码串;
若要继续进行编码串到字符串的转换,则
5、换行,并输入所要进行转换得编码串,以#结束并换行)
上述程序融入了较多的数学逻辑思维方式以及数学方法,故可以完成的任务也更加复杂,有一定的应用价值。
程序中不难看到许多个子模块,这正是为了帮助设计者进行结构化程序设计。
计算机技术的发展让数学科学变得更加实用,计算机出现之前,很多现实问题所要求的计算难以被解决,有了计算机,数值计算不再是障碍,只要问题能被描述成数学模型,就能通过计算机进行求解。
实际上,单纯就数学计算而言,现代的微型计算器已经可以解决从小学到大学的几乎所有运算问题。
这种进步能减少从事数学学习和研究的人们花费在数值计算上的时间和精力,使他们有更多的时间进行数学推理和数学证明过程,促进数学科学的发展。
但是,这里再提到一点:
计算机的“穷举法”只限于在有限的数据量中进行,当把范围扩大到全体自然数(或实数)并要求进行证明时,计算机也无能为力。
不过,不管怎样,计算机还是能够给人们提供一些思路或规律,帮助人们解答遇到的难题。
3、计算机技术推动数学机器证明的发展
计算机对数学科学发展的另一个重要贡献在于自动推理,这个在科学史上曾经被众多数学家研究、猜想、苦苦思索的研究方向,由于计算机技术的发展和数学家的不懈努力,已经取得重大突破。
其中,关于几何定理的机器证明的研究,属于数学机械化领域的研究范畴。
比如:
著名的四色猜想就是用计算机成功证明的。
我国著名数学家吴文俊教授在此领域也进行了创造性的突破,为该研究领域的发展带来勃勃生机。
数学机械化的实质就是利用计算机程序证明数学问题,这不仅需要计算机软硬件技术的支持,还需要建立适当的数学理论来适应计算机运算模式。
这个过程,又为数学科学提出了更高的发展要求。
四、总结
总结上面的论述,其中数学是计算机的基础重点表现在以下几个方面:
1、许多计算机研究者都是从数学家中脱颖而出;
2、数学思想在计算机中的应用——具体实例:
“二进制”思想;
3、数学原理、方法及思维方式的应用——具体实例:
程序。
而计算机对于数学的推动在于:
1、计算机的高速运算能力以及大量数据范围;
2、程序的帮助及数学定理机器证明。
数学理论以及数学思维方式在现代计算机科技中的应用举足轻重,无论是计算机工作原理的设计还是计算机系统与软件的不断完善都与数学家的贡献密不可分。
没有数学作为基础,就不会有现代的计算机技术。
建立在数学原理之上的计算机技术又反过来促进了数学科学本身的发展,数学也得到了更多的应用。
现在,科学家们正在努力研究供理论研究和定理证明使用的F.P.语言。
随着数学理论的不断进步,计算机的技术也会不断更新,两者的结合也会更加密切。
参考文献
1、《全国信息学奥林匹克联赛培训教程
(一)(普及本)》
2、
3、(《计算机之数学奇才——冯诺伊曼的故事》)