数学与程序设计Word下载.docx
- 文档编号:17348300
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:36
- 大小:77.93KB
数学与程序设计Word下载.docx
《数学与程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《数学与程序设计Word下载.docx(36页珍藏版)》请在冰豆网上搜索。
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*t;
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,..,n}的一个排列i1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数学 程序设计