数学与程序设计.docx

上传人:b****6 文档编号:6270839 上传时间:2023-01-05 格式:DOCX 页数:36 大小:77.92KB
下载 相关 举报
数学与程序设计.docx_第1页
第1页 / 共36页
数学与程序设计.docx_第2页
第2页 / 共36页
数学与程序设计.docx_第3页
第3页 / 共36页
数学与程序设计.docx_第4页
第4页 / 共36页
数学与程序设计.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

数学与程序设计.docx

《数学与程序设计.docx》由会员分享,可在线阅读,更多相关《数学与程序设计.docx(36页珍藏版)》请在冰豆网上搜索。

数学与程序设计.docx

数学与程序设计

数学与程序设计

数学是研究现实世界的空间形式和数量关系的科学,是处理客观问题的强有力的工具,几乎在一切自然科学领域中都起着基础性的作用。

数学的特点不仅在于概念的抽象性、逻辑的严密性、结论的明确性,还在于它应用的广泛性。

数学方法在程序设计中的运用包括两个方面:

化简题目和直接解决问题。

应用数学方法化简题目是解决问题必不可少的重要步骤,也是分析题目的基本方法。

应用数学方法化简题目,发掘题目中的隐含条件,寻求更多的“已知”条件,从而为建立数学模型提供依据。

而用数学方法直接解题,其效率更是一般算法所不可及的。

下面以具体的问题为例,介绍有关的数学知识和数学方法,体会利用数学方法解决问题时的乐趣。

一.数论基础

1.欧几里德转辗相除法利用gcd(a,b)=gcd(b,amodb)求a,b的最大公约数:

functiongcd(a,b:

longint):

longint;

 begin

 ifb=0thengcdd:

=a

 elsegcd:

=gcd(b,amodb);

 end;

思考:

如何把上述算法写成迭代形式?

2.扩展的欧几里德算法如果gcd(a,b)=d,一定存在整数x和y满足gcd(a,b)=ax+by。

求d及满足gcd(a,b)=ax+by的整数对(x,y)的算法如下:

functionexgcd(a,b:

longint;varx,y:

longint):

longint;

var

t:

longint;

begin

ifb=0then 

 begin

 exgcd:

=a;

 x:

=1;

 y:

=0;

 end

else

 begin

 exgcd:

=exgcd(b,amodb,x,y);

 t:

=x;

 x:

=y;

 y:

=t-(adivb)*y;

 end;

end;

注释1

思考:

1)如何把上述算法写成迭代形式?

2)满足gcd(a,b)=ax+by的整数对(x,y)是否是唯一的?

3.求解二元一次不定方程ax+by=c整数解

我们的任务是解二元一次不定方程

ax+by=c①

其中a,b,c都是整数,所求的解(x,y)也是整数

关于方程①的可解性,有下面的两个重要的结论:

(1)设gcd(a,b)表示整数a,b的最大公约数。

方程①有解的充分必要条件是gcd(a,b)|c。

(记号“x|y”表示x能整除y,即存在整数k,使y=kx)。

(2)如果(x0,y0)是方程①的一组解,则对任何整数t,(x0+bt,y0-at)也都是方程①的解。

下面我们讨论具体求解的方法。

为了避免计算中对负数和0的讨论,我们假定a>0,b>0,并且a>=b。

假定方程①有解,即系数满足:

gcd(a,b)|c,这时,c’=c/gcd(a,b)一定是个整数。

我们先讨论下面的方程:

ax+by=gcd(a,b)②

根据上述扩展的欧几里德算法,一定存在整数x0和y0满足ax+by=gcd(a,b)。

显然,如果(x0,y0)是方程②的一组解,则(c’x0,c’y0)也是方程①的一组解,即

a(c’x0)+b(c’y0)=(c’f)=c。

下面给出求二元一次不定方程ax+by=c一组整数解(x0,y0)的算法:

procedureequation(a,b,c:

longint;varx0,y0:

longint);

vard,x,y:

longint;

begin

 d:

=exgcd(a,b,x,y);{参见扩展的欧几里德算法}

 ifcmodd<>0then

 begin

 writeln('noanswer');

 halt;

 endelse

 begin

 x0:

=x*(cdivd);

 y0:

=y*(cdivd);

 end;

end;

说明:

(1)如果a,b中有一个小于0,例如a<0,可以令x’=-x,解方程

ax’+by=c。

求解后,再令x=-x’就可以了。

(2)利用前面讲过的性质:

“如果(x0,y0)是方程①的一组解,则对任何整数t,(x0+bt,y0-at)也都是方程①的解”。

可以通过任何整数t得到方程①的其余解。

方程ax+by=c整数解的应用

例1:

有三个分别装有a升水、b升水和c升水的量筒(c>b>a>0),现c筒装满水,

问能否在c筒中量出d升水(a+b+d>=c>d>0)。

若能,请列出一种方案。

算法分析:

 量水过程实际上就是倒来倒去,每次倒的时候总有如下几个持点:

 1.总有一个筒中的水没有变动;

 2.不是一个筒被倒满就是另一个筒被倒光;

 3.c筒仅起中转作用,而本身容积除了必须足够装下a筒和b筒的全部水外,别无其它限制。

因此,问题的实质是水总是按a筒或b筒的容积倒来倒去,最后量出d升水来。

即通过c筒的中转作用,把倒满a筒一次记为a+1次,从a筒中倒出a升记为a-1次;对b筒同样如此定义。

若a筒累计x次,b筒累计y次,使得ax+by=c-d,则c中量出d升水。

于是,能否在c筒中量出d升水,取决于方程ax+by=c-d是否存在整数解。

参考程序如下:

programmw;

type

node=array[0..1]oflongint;

var

a,b,c:

node;

d,step,x,y:

longint;

functionexgcd(a,b:

longint;varx,y:

longint):

longint;

vart:

longint;

begin

 ifb=0then

 begin

  exgcd:

=a;;x:

=1;y:

=0;

 end

 else

 begin

  exgcd:

=exgcd(b,amodb,x,y);

  t:

=x;x:

=y;y:

=t-(adivb)*y

 end;

end;

procedureequation(a,b,c:

longint;varx0,y0:

longint);

vard,x,y:

longint;

begin

 d:

=exgcd(a,b,x,y);

 ifcmodd>0then

 begin

 writeln('noanswer');

 halt;

 endelse

 begin

 x0:

=x*(cdivd);

 y0:

=y*(cdivd);

 end;

end;

procedurefill(vara,b:

node);{a筒向b筒倒}

vart:

longint;

begin

 ifa[1]

=a[1]

                  elset:

=b[0]-b[1];

 a[1]:

=a[1]-t;

 b[1]:

=b[1]+t

end;

begin

 write('a,b,c,d=');

 readln(a[0],b[0],c[0],d);

 equation(a[0],b[0],c-d,x,y);

 step:

=0;

 a[1]:

=0;b[1]:

=0;c[1]:

=c[0];

 writeln(step:

5,':

',a[1]:

5,b[1]:

5,c[1]:

5);

 ifx>0then

 repeat

  ifa[1]=0thenfill(c,a)else

               ifb[1]=b[0]thenfill(b,c)elsefill(a,b);

  inc(step);

  writeln(step:

5,':

',a[1]:

5,b[1]:

5,c[1]:

5);

 untilc[1]=d

 else

  repeat

   ifb[1]=0thenfill(c,b)else

             ifa[1]=a[0]thenfill(a,c)elsefill(b,a);

   inc(step);

  writeln(step:

5,':

',a[1]:

5,b[1]:

5,c[1]:

5);

  untilc[1]=d;

end.

 

4.素数的快速测试----Miller-Rabbin算法

同余若amodc=bmodc,称a和b关于模c同余,记作a≡b(modc).

伪素数对正整数n,如果an-1≡1(modn),则称n是基于a的伪素数。

如果一个数是伪素数,它几乎肯定是素数。

另一方面,如果一个数不是伪素数,它一定不是素数。

计算abmodc

(1)直接迭代法求abmodn根据模算术的基本知识(a*b)modc=((amodc)*b)modc得到abmodn的迭代式

算法描述如下:

functionf1(a,b,n:

longint):

longint;

vard,i:

longint;

begin

 d:

=a;

 fori:

=2tobdod:

=dmodn*a;

 d:

=dmodn;

 f1:

=d;

end;

(2)加速叠代法求abmodn

把b化为二进制(btbt-1.···b1b0),这样有:

b=bt2t+bt-12t-1+···+b121+b020(其中bi=0或1)

bt2t+bt-12t-1+···+b121+b020

于是abmodn=(a)modn

=((

 

算法描述:

functionf2(a,b,n:

longint):

longint;

vard,t:

longint;

begin

 d:

=1;t:

=a;

 whileb>0do

 begin

ift=1thenbegin

f:

=d;exitend  ;

ifbmod2=1thend:

=d*tmodn;

  b:

=bdiv2; 

  t:

=t*tmodn;

 end;

 f2:

=d

end;

Miller-Rabbin算法是基于概率论的素数测试算法,对于an-1≡1(modn),随机选取s个基a,若an-1≡1(modn)都成立,则n为素数,否则为合数。

下面给出的Miller-Rabbin算法采用计算an-1modn的函数f2(a,n-1,n),对于随机选取s个基a,f2(a,n-1,n)都等于1,则认为n为素数。

FunctionMiller_Rabbin(n:

longint):

boolean;

VarI,a:

longint;

Bl:

Boolean;

functionf2(a,b,n:

longint):

longint;

vard,t:

longint;

begin

 d:

=1;t:

=a;

 whileb>0do

 begin

ift=1thenbegin

f:

=d;exitend  ;

ifbmod2=1thend:

=d*tmodn;

  b:

=bdiv2; 

  t:

=t*tmodn;

 end;

 f2:

=d

end;

begin

i:

=0;

bl:

=tuue;

while(i

begin

int(i);

a:

=random(n-2)+2;

iff2(a,n-1,n)<>1thenbl:

=false;

end;

miller_rabbin:

=bl

end;

二组合数学基础

1.加法原理与乘法原理

1.1加法原理:

做一件事情,完成它可以有n类办法,在第一类办法中有m1种不同的方法,在第二类办法中有m2种不同的方法,……,在第n类办法中有mn种不同的方法。

那么完成这件事共有N=m1+m2+...+mn种不同的方法。

1.2乘法原理:

做一件事情,完成它需要分成n个步骤,做第一步有m1种不同的方法,做第二步有m2种不同的方法,……,做第n步有种mn不同的方法,那么完成这件事有N=m1*m2*...*mn种不同的方法。

1.3两个原理的区别:

一个与分类有关,一个与分步有关;加法原理是“分类完成”,乘法原理是“分步完成”。

2.排列与组合的概念与计算公式

2.1排列及计算公式

从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号p(n,m)表示.

p(n,m)=n(n-1)(n-2)……(n-m+1)=n!

/(n-m)!

(规定0!

=1).

2.2组合及计算公式

从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号c(n,m)表示.

c(n,m)=p(n,m)/m!

=n!

/((n-m)!

*m!

);c(n,m)=c(n,n-m);

2.3n个元素中取出r个元素的循环排列数=p(n,r)/r=n!

/r(n-r)!

.

2.4n个元素被分成k类,每类的个数分别是n1,n2,...nk这n个元素的全排列数为

n!

/(n1!

*n2!

*...*nk!

).

2.5可重复组合

如果上述组合定义中每一个元素可重复选取,则称为n元集中的可重复r-组合。

n元集中的可重复r-组合的总数为C(n+r-1,r)。

证明:

从n元集中可重复地选取r个元素,设第一个元素选x1个,第二个元素选x2个,……,第n个元素选xn个,则议程x1+x2+……+xn=r的非负整数解的个数就是n元集中的可重复r-组合的总数。

将r个1排成一排,插入n-1个分隔符,把r个1分成n段,n段中的1的个数即是方程的一个解。

插入n-1个分隔符的过程实际上就是从n+r-1个位置中选择n-1个位置放分隔符,其余r个位置放1,共有C(n+r-1,n-1)=C(n+r-1,r)。

可重复组合也可解释为:

有n类元素,每类的个数无限,从中取出r个元素的组合。

3.排列与组合的产生算法

3.1排列的产生

方法1:

(递归,深度优先产生)

程序如下:

programpailei;

constm=4;

vara:

array[1..m]ofinteger;

   b:

array[1..m]ofboolean;

procedureprint;

vari:

integer;

begin

 fori:

=1tomdo

 write(a[i]);

 writeln;

end;

proceduretry(dep:

integer);

vari:

integer;

begin

 fori:

=1tomdo

 if b[i]then

  begin

  a[dep]:

=i;b[i]:

=false;

  ifdep=mthenprintelsetry(dep+1);

  b[i]:

=true;

  end;

end;

begin

fillchar(b,sizeof(b),true);

try

(1);

end.

方法2.根据上一个排列产生下一个排列.

程序如下:

programpailei;

constm=5;

vara:

array[1..m]ofinteger;

i,j,temp,k,l:

integer;

procedureprint;

vari:

integer;

begin

 fori:

=1tomdo

 write(a[i]);

 writeln;

end;

begin

fori:

=1tomdoa[i]:

=i;

repeat

 print;

 i:

=m-1;

 while(i>0)and(a[i]>a[i+1])doi:

=i-1;

 ifi>0then

 begin

 j:

=m;

 while a[j]

=j-1;

 temp:

=a[i];a[i]:

=a[j];a[j]:

=temp;

 k:

=i+1;l:

=m;

 whilek

   begin

   temp:

=a[k];a[k]:

=a[l];a[l]:

=temp;

    k:

=k+1;l:

=l-1

   end;

 end;

untili=0;

end.

3.2组合的产生算法

算法1:

(递归,深度优先产生)

程序如下:

programzuhe;

constn=6;m=4;

vara:

array[0..m]ofinteger;

 i,j:

integer;

procedureprint;

vari:

integer;

begin

 fori:

=1tomdowrite(a[i]);

 writeln;

end;

proceduretry(dep:

integer);

vari:

integer;

begin

 fori:

=a[dep-1]+1 ton-(m-dep)do

 begin

 a[dep]:

=i;

 ifdep=mthenprintelsetry(dep+1);

 end

end;

begin

a[0]:

=0;

try

(1);

end.

算法2:

根据前一个组合产生下一个组合

程序如下:

programzuhe;

constn=6;m=4;

vara:

array[1..m]ofinteger;

 i,j:

integer;

procedureprint;

vari:

integer;

begin

 fori:

=1tomdowrite(a[i]);

 writeln;

end;

begin

 fori:

=1tomdo

 a[i]:

=i;

 repeat

 print;

 i:

=m;

 while(i>0)and(a[i]=n-(m-i))dodec(i);

 ifi>0then

  begin

   a[i]:

=a[i]+1;

   forj:

=i+1tomdoa[j]:

=a[j-1]+1;

 end;

 untili=0;

end.

 

4.二项式定理

C(n,0)+C(n,1)+…+C(n,n-1)+C(n,n)=2n

证明:

等式左边包含了n元集的从零个元素到n个元素的全部组合,每一种组合与一个n位二进制数一一对应,对应方式为:

n位二进制数共有n位,每一位对应n元集的一个元素,如果n位二进制数某一位上为1,则表示选中该位对应的元素,否则表示未选中该位对应的元素,这样一个n位二进制数就对应一种组合;反过来每一种组合同样对应一个n位二进制数,而n位二进制数的总数为2n。

杨辉三角

11112113311464115101051

1615201561

172135352171

18285670562881

193684126126843691

……

杨辉三角的每一行中的第一个数和最后一个数均为1,其余位置上的数可利用其上一行中的数递推计算出来,其值为上一行中位于同一列和前一列的两个数之和。

5.鸽巢原理

5.1简单形式

如果n+1个物体被放进n个盒子,那么至少有一个盒子包含两个或更多的物体。

例2:

在13个人中必存在两个人,他们的生日在同一月份里。

例3:

设有n对已婚夫妇。

为保证有一对夫妇被选出,至少要从这2n个人中选出多少人?

(n+1)

5.2加强形式

令q1,q2,...qn为正整数。

如果将

 q1+q2+...+qn-n+1个物体放入n个盒子内,那么或者第一个盒子至少含有q1个物体,或者第二个盒子

至少含有q2个物体,...,或者第n个盒子含有qn个物体.

例4:

一篮子水果装有苹果、香蕉、和橘子。

为了保证篮子内或者至少8个苹果或者至少6个香蕉或者至少9

个橘子,则放入篮子中的水果的最小件数是多少?

(21件)

6.容斥原理及应用  

设S为有穷集,P1,P2,……,Pn是n条性质。

S中的任一元素x对于这n条性质可能具有其中的一种、二种、……、n种,也可能任何性质都没有。

设Ai(i=1,2,……,n)表示S中具有Pi的元素构成的子集。

这时容斥原理可叙述为:

定理:

S中不具有性质P1,P2,……,Pn的元素数是:

如:

m=3,时上式为:

=|S|-(|A1|+|A2|+|A3|)+(|A1∩A2|+|A1∩A3|+|A2∩A3|)-|A1∩A2∩A3|

推论:

至少具有性质P1,P2,...Pm之一的集合S的物体的个数有:

|A1∪A2∪....∪Am|=|S|—|A1∩A2∩...∩Am|=

∑|Ai|-∑|Ai∩Aj|+∑|Ai∩Aj∩Ak|+...+(-1)m+1|A1∩A2∩...∩Am|

例4:

求从1到1000不能被5,6,和8整除的整数的个数?

 (1000-(200+166+125)+(33+25+41)-8=600)

7.常见递推关系及应用

7.1算术序列

每一项比前一项大一个常数d;

若初始项为h0:

则递推关系为hn=hn-1+d=h0+nd;

对应的各项为:

h0,h0+d,h0+2d,....,h0+nd;

前n项的和为(n+1)h0+dn(n+1)/2

例5:

1,2,3,...

例6:

1,3,5,7...等都是算术序列。

7.2几何序列

每一项是前面一项的常数q倍

若初始项为h0:

则递推关系为hn=h0qn-1q=h0qn;

对应的各项为:

h0,h0q1,h0q2,....,h0qn

例7:

1,2,4,8,16,...

例8:

5,15,45,135,...等都是几何序列;

前n项和为((qn+1-1)/(q-1))h0

7.3Fibonacci序列

除第一、第二项外每一项是它前两项的和;

若首项为f0为0,则序列为0,1,1,2,3,5,8...递推关系为(n>=2)fn=fn-1+fn-2   

前n项的和Sn=f0+f1+f2+...+fn=fn+2-1

例9:

以下是Fibonacci的示例:

     

(1)楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法?

     

(2)有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子?

     (3)有n*2的一个长方形方格,用一个1*2的骨牌铺满方格。

求铺法总数?

7.4错位排列

首先看例题:

例10:

在书架上放有编号为1,2,....n的n本书。

现将n本书全部取下然后再放回去,当放回去时要求每本书都不能

放在原来的位置上。

例如:

n=3时:

原来位置为:

123

放回去时只能为:

312或231这两种

问题:

求当n=5时满足以上条件的放法共有多少种?

(不用列出每种放法)(44)

{1,2,3,....,n}错位排列是{1,2,3,..

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1