数学与程序设计Word文档下载推荐.docx

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

数学与程序设计Word文档下载推荐.docx

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

数学与程序设计Word文档下载推荐.docx

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:

varx0,y0:

longint);

vard,x,y:

d:

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

{参见扩展的欧几里德算法}

ifcmodd<

>

0then

writeln('

noanswer'

);

halt;

endelse

x0:

=x*(cdivd);

y0:

=y*(cdivd);

说明:

(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;

a,b,c:

node;

d,step,x,y:

vart:

ifb=0then

begin

;

end

else

t:

=t-(adivb)*y

end;

ifcmodd>

procedurefill(vara,b:

node);

{a筒向b筒倒}

ifa[1]<

b[0]-b[1]thent:

=a[1]

elset:

=b[0]-b[1];

a[1]:

=a[1]-t;

b[1]:

=b[1]+t

write('

a,b,c,d='

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

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

step:

c[1]:

=c[0];

writeln(step:

5,'

:

'

a[1]:

5,b[1]:

5,c[1]:

5);

ifx>

repeat

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

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

inc(step);

writeln(step:

untilc[1]=d

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

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

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;

vard,i:

begin

fori:

=2tobdod:

=dmodn*a;

=dmodn;

f1:

=d;

(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:

vard,t:

whileb>

0do

begin

ift=1thenbegin

f:

exitend 

;

ifbmod2=1thend:

=d*tmodn;

b:

=bdiv2;

=t*tmodn;

f2:

=d

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:

boolean;

VarI,a:

Bl:

Boolean;

i:

bl:

=tuue;

while(i<

s)andbldo

int(i);

a:

=random(n-2)+2;

iff2(a,n-1,n)<

1thenbl:

=false;

miller_rabbin:

=bl

二组合数学基础

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;

array[1..m]ofboolean;

procedureprint;

vari:

integer;

=1tomdo

write(a[i]);

writeln;

proceduretry(dep:

integer);

if 

b[i]then

a[dep]:

=i;

b[i]:

ifdep=mthenprintelsetry(dep+1);

=true;

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

try

(1);

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

constm=5;

i,j,temp,k,l:

=1tomdoa[i]:

repeat

print;

=m-1;

while(i>

0)and(a[i]>

a[i+1])doi:

=i-1;

ifi>

j:

=m;

while 

a[j]<

a[i]doj:

=j-1;

temp:

=a[i];

a[i]:

=a[j];

a[j]:

=temp;

k:

=i+1;

l:

whilek<

ldo

=a[k];

a[k]:

=a[l];

a[l]:

=k+1;

=l-1

untili=0;

3.2组合的产生算法

算法1:

programzuhe;

constn=6;

m=4;

array[0..m]ofinteger;

i,j:

=1tomdowrite(a[i]);

=a[dep-1]+1 

ton-(m-dep)do

a[0]:

算法2:

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

array[1..m]ofinteger;

a[i]:

print;

i:

while(i>

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

ifi>

=a[i]+1;

forj:

=i+1tomdoa[j]:

=a[j-1]+1;

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倍

则递推关系为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