实验七 数字填图问题.docx
《实验七 数字填图问题.docx》由会员分享,可在线阅读,更多相关《实验七 数字填图问题.docx(15页珍藏版)》请在冰豆网上搜索。
实验七数字填图问题
实验七 数字填图问题
一、问题背景和实验目的
数字填图问题是数学问题的一种趣味形式.早在19世纪后半期,一些数学家就在报刊中大量使用数字填图游戏和字谜游戏等,目的是使业余爱好者也能通过简单的形式去认识、理解和琢磨深奥的数学问题,这些问题中甚至包括困惑了世间智者350多年、于1994年才刚刚被证明了的“费马大定理”.100多年来,数字填图问题对数学界所起的作用是不言而喻的.
大家都知道,数学问题一般都经过严格的逻辑证明才得以解决.而逻辑证明是指从一些公理出发,经过逻辑推理来证明问题.但随着20世纪40年代以来计算机的诞生和发展,计算机改变了整个世界,计算机已在各个领域发挥作用,并取得了许多重大进展.于是,能否用计算机来证明数学问题便成了大家关心的话题.
所谓计算机证明是指充分发挥计算机计算速度快和会“推理”的特点,用计算机程序模拟解题或进行穷举检验,最后得到问题的解.几乎所有的数学家对计算机证明持保留态度,因为他们相信,只有逻辑证明才是真正可靠的.但“四色问题”的证明,又使他们感到困惑,因为“四色问题”的证明实际上是一个计算机证明.
能否用计算机来证明数学问题的争论可能会持续一个相当长的时间,本实验旨在通过生活中几个常见的数字填图问题的探究,谈谈这类问题的逻辑推理解法和计算机解法.
二、相关函数(命令)简介
1.cputime命令:
记录执行本命令时的Matlab时钟的时间(秒).
2.tic命令:
开始计时.
3.toc命令:
结束计时.
4.disp(x):
输出矩阵x.x的各项应为字符,所以在输出时要进行转化.
相关的命令有:
num2str():
把数值转化为字符;mat2str():
把矩阵转化为字符.
5.fopen(filename,mode):
用mode方式打开/建立filename文件,以备写入数据,使用方式:
fid=fopen(filename,mode).
6.fclose(fid):
关闭上述文件.
例如下列程序是把一个两行的矩阵y写入文件output.dat:
x=0:
0.1:
1;
y=[x;exp(x)];
fid=fopen(’output.dat’,’wt’);
fprintf(fid,’xexp(x)\n’);
fprintf(fid,’%6.2f%12.8f\n’,y);%实际得到的是矩阵y的转置矩阵
status=fclose(fid);
与C语言的文件操作方式相类似.
三、实验内容
让我们先从一个简单的问题出发来谈谈数字填图问题的两种解法.然后通过几个稍复杂问题的探究,从中展示逻辑推理的严谨以及计算机解法的魅力,启迪我们去解决更复杂的数学问题.
注:
在本实验中,将表达式abc理解为
,即100*a+10*b+c,其余类似,不另加说明.
(一)、一个简单的问题及其解答
问题一:
在图1的几个加法等式中,每个□表示一个非零数字,任意两个数字都不相同,问有多少个解?
图1
【逻辑解法】为简洁起见,将它的3个式子记作:
a+b=c,d+e=f,g+h=i0,若问题有解,则显然有i=1,且(a+b)+(d+e)+(g+h)=c+f+i10,故45=(a+b+c)+(d+e+f)+(g+h+i)=2(c+f)+i11,即c+f=17,故c=8,f=9或c=9,f=8.
考虑到a~i互不相同,当要求a
注:
本问题实际上仅有2个解是本质的,即表中的第2、3行,第4、5行所代表的解仅是位置不同而已.如不要求a
个.
【计算机解法】为验证此结果,可用Mathematica、Matlab、TurboC等软件进行模拟解题,充分利用计算机运算速度快的特点进行穷举法检验.实践表明本问题解的情况恰如上所述.用Matlab实现的程序清单可参见附录1,这一算法比较慢(一个更慢的算法参见附录1B,试分析其原因),而一个提速的程序清单可参见附录2,TurboC程序清单可参见附录3,而Mathematica程序清单可参见附录4.
【评论】这个问题的逻辑解法十分简单,或许根本不需要计算机解法,但所用程序有一定的代表性,稍加修改即可解决一系列问题,这点可从下面的问题中看到.
(二)、几个较复杂的问题及其解答
问题二:
在图2的4个算式中,每个□表示一个非零数字,任意两个数字都不相同,问(A)、(B)、(C)和(D)这4种情形分别有多少个解?
图2
讨论:
显然,情形(C)无解.情形(D)与情形(C)实际上是同一个问题,因此也无解.
情形(B)与情形(A)实际上也是同一个问题.我们先讨论情形(A)的解的个数.
【逻辑解法】为简洁起见,将此竖式记作:
abc+def=ghi,即
,其中a~i代表1~9这9个互不相同的非零数字.据九余数性质可知,两个“加数”中的六个数字之和被9除的余数应等于“和数”中的三个数字之和被9除的余数.又这两个“加数”与“和数”中共九个数字正好是1,2,,9,它们的和为45,被9除的余数是0,易见“和数”的三个数字之和被9除的余数必为0,也即:
“和数”是9的倍数.注意到题设可知,“和数”的三个数字之和必定为:
g+h+i=9或g+h+i=18.
<1>考虑g+h+i=9的情形.
(1)首先必定有g>3,否则{a,d}最小为{1,2},{b,e}最小为{4,5},{c,f}最小为{6,7},此时已有abc+def>400,与g3矛盾.故g4;另外,g6为显然;
(2)若g=4,由g+h+i=9,h+i=5,故{h,i}最小为{1,4}或{2,3};但已有g=4,故{h,i}为{2,3},而{a,d}最小为{1,4},从而g5,与g=4矛盾;
(3)若g=5,由g+h+i=9,h+i=4,故{h,i}为{1,3};而{a,d}最小为{2,4},从而g6,与g=5矛盾;
(4)若g=6,由g+h+i=9,h+i=3,故{h,i}为{1,2};而{a,d}最小为{3,4},从而g7,与g=6矛盾.
综上所述,g+h+i=9的情形下问题无解.
<2>考虑g+h+i=18的情形.由于g4(理由同上),以下按g=9,8,,4的顺序分类讨论:
(1)g=9,则h+i=9.由于a~i互不相同,于是g,h,i的可能的取值见下表:
对这些竖式有序地交换两个加数的百位数、十位数和个位数,可得到每个类型的8(=
)个不同竖式(解),小计有解128=96个.
注意:
表中的第2、5、6、9列为容易造成失解的地方,要特别留意.
完全类似地有如下一系列过程:
(2)g=8,则h+i=10.仿
(1),小计有解108=80个,解例见下表:
(3)g=7,则h+i=11.小计有解58=40个,解例见下表:
(4)g=6,则h+i=12.小计有解68=48个,解例见下表:
(5)g=5,则h+i=13.小计有解58=40个,解例见下表:
(6)g=4,则h+i=14.小计有解48=32个,解例见下表:
结论:
本问题的解的个数为:
(12+10+5+6+5+4)8=428=336.
注:
<1>如不考虑两个加数的上下位置关系,则总的解的个数为:
428/2=168.
<2>由于情形(B)与情形(A)是同一个问题,故解的个数也为:
428=336.
【计算机解法】为验证此结果,仍用Matlab、Mathematica、TurboC编程进行模拟解题,充分利用计算机运算速度快的特点进行穷举法检验.实践表明本问题有且只有336个不同竖式(解),而Matlab程序清单可参见附录5,你可发现它与附录1十分相似.
【评论】这个问题的逻辑解法较复杂,而计算机解法则是如此的简单快捷,运行整个程序不要1分钟.实际上非常复杂的“四色问题”的证明也是这样:
对1482种有代表性地图的分析,若依靠人工去做,可能要几十年甚至上百年的时间,而用计算机,只要1200小时即告完成.这还是70年计算机的计算水平,若用现在的计算机,计算时间应该不会超过一天!
问题三:
在图3的加法算式中,每个□表示一个非零数字,任意两个数字都不相同,问可有多少个解?
【逻辑解法】为简洁起见,将此竖式记作:
a+bc+def=ghi或
,其中a~i代表1~9这9个互不相同的非零数字.
据九余数性质并采用完全类似问题二的讨论可知,“和数”的三个数字之和必定为:
g+h+i=9或g+h+i=18.同时,g1,否则d=1;另外g>d,从而g=d+1.
由于9g2,以下按g=9,8,7,,2的顺序分类讨论:
(0)g=9,d=8.则h+i=9.由于a~i互不相同,于是g,h,i的可能的取值为(见下表):
图3
小计有解0个.
(1)g=8,d=7.则h+i=1(不可能,舍去)或h+i=10.由于a~i互不相同,于是g,h,i的可能的取值为(见下表):
对这些竖式有序地交换三个加数的个位数、两个加数的十位数,可得到每个类型的12个不同竖式(解),小计有解212=24个.
完全类似地有如下一系列过程:
(2)g=7,d=6.则h+i=2(不可能,舍去)或h+i=11.仿
(1),小计有解212=24个.
(3)g=6,d=5.则h+i=3或h+i=12.有解112=12个,解例见下表:
(4)g=5,d=4.则h+i=4或h+i=13.有解312=36个,解例见下表:
(5)g=4,d=3.则h+i=5或h+i=14.有解212=24个,解例见下表:
(6)g=3,d=2.则h+i=6或h+i=15.有解212=24个,解例见下表:
(7)g=2,d=1.则h+i=7或h+i=16.有解212=24个,解例见下表:
结论:
本问题的解的个数为:
(2+2+1+3+2+2+2)12=168.
【计算机解法】让我们再尝试计算机解法.仍用Matlab、Mathematica、TurboC编程进行穷举法验证,程序清单类似于附录1~附录5,不再另附.运行结果表明本问题的确有且只有168个不同竖式(解),要说明的是:
该程序在一般的计算机上运行一次也只需不到1分钟.
【评论】也许有人会说,你的问题还仅是一个有穷的问题,象“费马大定理”这样的无穷问题,你的计算机就无能为力了!
情况或许是这样.但应该注意到:
非常复杂的“四色问题”也是一个无穷问题,但妙就妙在有人能将它们缩小到1482种有代表性地图以内,从而成为一个有穷的问题!
至此,对于计算机解题的作用恐怕再不能视而不见了!
下面的两个问题也是成功地运用计算机解题的的一些典型例子,而至少到目前为止还没有看到它们的推理解法.
问题四:
图4的加法等式是:
两个真分数之和等于第三个真分数,每个□表示一个不为0的数字,任意两个数字都不相同.比如:
,试找出所有可能的解.
图4
【计算机解法】本问题利用计算机程序已找到解答,共有10个解.解答请参见:
《数学教学》(华东师范大学)1994年第5期.
【评论】程序如何编?
看起来问题似乎很简单,只要将附录1~附录5稍加修改即可.例如可利用附录6的Matlab程序进行计算.但实际情况让我们大吃一惊:
用Matlab程序居然只有6个解!
还有4个解到哪里去了?
用TurboC程序编写出的类似的程序居然只有7(或9)个解!
还有3(或1)个解到哪里去了?
还有人用TurboC程序编写出的类似的程序,却居然得到了11个“解”!
这个多出的1个“解”是哪里来的?
类似的问题还会发生在本实验的“四、自己动手”的第6题中,用不同的语言编写出的类似程序,其运行结果居然差距很大,你能明白其中的道理吗?
根据观察,可能是浮点问题,也可能是整数的上界问题,或别的什么原因.具体什么原因,留作思考题.
问题五:
图5的加法等式是:
两个假分数之和等于第三个假分数,每个□表示一个不为0的数字,任意两个数字都不相同.试找出所有可能的解.
图5
【计算机解法】本问题利用计算机程序也已找到解答,共有41个解.同样只要将附录1~5的程序稍加修改即可.
(三)、小结
数字填图问题是一种活泼的、变形的数学问题,逻辑推理是这类问题的一般解法.但也有若干数字填图问题要找到这样的逻辑推理解法是非常地困难,而采用计算机解法则轻而易举.问题一和问题二就是这样的例子.至于问题四和问题五则只能给出计算机解法.尽管数学家们很难接受计算机解法,因为他们担心计算机会出错(尽管这种出错的概率几乎为零!
),更重要的是他们坚信逻辑证明是解答这类问题的根本方法.但上述事实证明计算机解法也是十分有效的.另一个公认的例子是“四色问题”,它的证明实际上就是一个计算机证明.关于这个问题的争论可能会有一个相当长的时间.不管将来的结论如何,但计算机证明(解题)毕竟代表将来数学问题解决的一个方向.就象安德鲁·怀尔斯(AndrewWiles)突发灵感地把“伊娃沙娃理论”和“科利瓦金弗莱切方法”结合在一起可以完美地互相补足,以致最终证明了“费马大定理”一样,未来的数学家或许会让“逻辑证明”和“计算机证明”也完美结合,从而解决更多的数学问题.
注;西蒙·辛格[英],1998年.《费马大定理一个困惑了世间智者358年的谜》,薛密 译,上海译文出版社.
四、自己动手
1.一道竞赛题(以下称“原问题”)
1998年4月香港数理教育学会主办的初中数学竞赛有这样一道试题:
在下面的加法算式中,每个□表示一个数字,任意两个数字都不相同,那么A与B的乘积的最大值是多少?
解答:
最大值是15.你能给出逻辑推理解法并用计算机加以验证吗?
由上述问题引伸出的三个问题:
2.满足原问题题意的不同的加法算式(竖式)共有多少个?
本问题有60个不同竖式(解).试给出逻辑推理解法并用计算机加以验证.
原竞赛题是针对初中生而设计的,故问题的难度被大大降低了.本练习已有一定难度.不可否认,逻辑推理是解决问题的重要途径,而计算机模拟解题在其中所起的作用也是不言而喻的.我们可以将练习2一般化,你将发现计算机模拟解题的有效性和重要性.
3.如果在原问题中删除条件:
“任意两个数字都不相同”,则满足题意的不同的加法算式(竖式)共有多少个?
本问题实际上是一个有约束条件的全排列问题.本问题的答案是:
48195个!
这真是一个神奇的数值.要得到这个数值应该说是有一定难度的.试给出逻辑推理解法并用计算机加以验证.
注:
假如在本问题中允许三个“加数”与“和数”均可以由数字0作为开头,去掉“任意两个数字都不相同”这个条件限制,本问题则变成一个真正的全排列问题.在a+bc+def=ghij中,“和数”ghij是被动的.由a,b,c,d,e,f{0,1,2,3,4,5,6,7,8,9},此时本问题有解106个.
练习3是利用计算机模拟解题的真正代表,可以说计算机模拟解题能力在某些方面确已达到了逻辑推理解题的能力.而以下的练习4将把练习2的难度进一步加大.你将发现运用计算机模拟解题在某些方面甚至已超过运用逻辑推理解题.这个问题是:
4.假如违反常规,允许三个“加数”与“和数”均可以由数字0作为开头,保留条件:
“任意两个数字都不相同”,则满足原问题题意的不同的加法算式(竖式)共有多少个?
本问题共有228个解,即在练习2有60个不同竖式(解)的基础上再增加168个解.试给出逻辑推理解法并用计算机加以验证.
分析和观察:
练习4的结论与本实验中的“问题三”的结论是否有一定的联系?
有何联系?
5.验证本实验中的“问题四”、“问题五”的结论.能否给出相应的推理解法?
答案是:
非常困难!
不妨一试.你是否发现运用计算机模拟解决本问题,已超过运用逻辑推理解决本问题?
6.设A~J表示十个互不相同的数字,问:
方程(注意:
组成分数的四个数的第一位数字不能为0)
共有多少个解?
答案是110个?
是118个?
是其它的数字?
为什么?
7.前面所说的“用不同的语言编写出的类似程序,其运行结果居然差距很大”现象,你遇到过吗?
试结合附录6,分析产生漏(增)解的原因.
8.利用Matlab文件操作技术修改附录1,使得结果可以保存到一个文本文件中.类似地,用TurboC文件操作技术修改附录3,使得结果也可以保存到一个文本文件中.
五、附录
附录1(fulu1.m):
tic;
n=0;
fora=1:
9
forb=1:
9
if(b==a),continue;end
forc=1:
9
if(c==a|c==b),continue;end
ford=1:
9
if(d==a|d==b|d==c),continue;end
fore=1:
9
if(e==a|e==b|e==c|e==d),continue;end
forf=1:
9
if(f==a|f==b|f==c|f==d|f==e),continue;end
forg=1:
9
if(g==a|g==b|g==c|g==d|g==e|g==f),continue;end
forh=1:
9
if(h==a|h==b|h==c|h==d|h==e|h==f|h==g),continue;end
fori=1:
9
if(i==a|i==b|i==c|i==d|i==e|i==f|i==g|i==h)
continue;
end
if(an=n+1;
disp(['第',num2str(n),'个解:
',...
num2str(a),'/',num2str(b),num2str(c),'+',...
num2str(d),'/',num2str(e),num2str(f),'=',...
num2str(g),'/',num2str(h),num2str(i)])
end;end;end;end;end;end;end;end;end;end;%%共有10个end
t3=toc;
fprintf('\nTheelapsedtime(measuredbytic/toc)is:
%g',t3)
附录1B(fulu1B.m):
t=cputime;n=0;
fora=1:
9
forb=1:
9
ifb~=a
forc=1:
9
ifc~=a&c~=b
ford=1:
9
ifd~=a&d~=b&d~=c
fore=1:
9
ife~=a&e~=b&e~=c&e~=d
forf=1:
9
iff~=a&f~=b&f~=c&f~=d&f~=e
forg=1:
9
ifg~=a&g~=b&g~=c&g~=d&g~=e&g~=f
forh=1:
9
ifh~=a&h~=b&h~=c&h~=d&h~=e&h~=f&h~=g
fori=1:
9
ifi~=a&i~=b&i~=c&i~=d&i~=e&i~=f&i~=g&i~=h...
&a+b==c&d+e==f&g+h==i*10&a
n=n+1;
disp(['第',num2str(n),'个解:
',...
num2str(a),'+',num2str(b),'=',num2str(c),'',...
num2str(d),'+',num2str(e),'=',num2str(f),'',...
num2str(g),'+',num2str(h),'=',num2str(i),'0'])
end;end;end;end;end;end;end;end;end;end;end;end;end;end;end;end;end
%%共有17个end
time=cputime-t
附录2(fulu2.m,提速版):
t02=clock;
n=0;
A1=1:
9;
fori1=1:
9
a=A1(i1);A2=A1([1:
i1-1,i1+1:
9]);
fori2=1:
8
b=A2(i2);A3=A2([1:
i2-1,i2+1:
8]);
fori3=1:
7
c=A3(i3);A4=A3([1:
i3-1,i3+1:
7]);
fori4=1:
6
d=A4(i4);A5=A4([1:
i4-1,i4+1:
6]);
fori5=1:
5
e=A5(i5);A6=A5([1:
i5-1,i5+1:
5]);
fori6=1:
4
f=A6(i6);A7=A6([1:
i6-1,i6+1:
4]);
fori7=1:
3
g=A7(i7);A8=A7([1:
i7-1,i7+1:
3]);
fori8=1:
2
h=A8(i8);i=A8([1:
i8-1,i8+1:
2]);
if(an=n+1;
disp(['第',num2str(n),'个解:
',...
num2str(a),'/',num2str(b),num2str(c),'+',...
num2str(d),'/',num2str(e),num2str(f),'=',...
num2str(g),'/',num2str(h),n