zoukankan      html  css  js  c++  java
  • 数学基础的算法分析

    1)素数  
    数学类的基本算法大多数属于初等数论范畴,相当大一部分与素数有直接关系,因此
    素数是一个很基本又很重要的内容。
    我们先来看看怎么判断一个数是否素数。素数的定义为:如果一个数的正因子只有1
    和这个数本身,那么这个数就是素数。根据定义,我们立即能得到判断一个数N(大于
    1)是否素数的简单的算法:枚举2到N-1之间的整数,判断是否能整除N。
    如果n很大,那么上面的程序就要运行比较长的一段时间,那么有没有更快一点的算
    法呢?回答是肯定的!因为如果n含有不为1和自身的因子,那么这些因子中必定有不大于
    sqrt(n)的(假设n有因子p,1<p<n,如果p<=sqrt(n),那么p就不大于sqrt(n),如果
    p>sqrt(n),那么n/p也是n的因子,而且1<n/p<n,所以n/p不大于sqrt(n))。
    容易知道这个算法的时间复杂度为O(sqrt(n))。

    (2)因式分解  
    因式分解的算法很简单,模拟手工分解的过程,我们得到分解n的算法:枚举所有不
    大于n的所有素数,判断这些素数能整除n多少次。判断2到n是否素数,总共要计算
    sqrt(2)+sqrt(3)+sqrt(4)…+sqrt(n)<=n*sqrt(n)次,因此算法的时间复杂度可以粗略地
    认为是O(n*sqrt(n))。事实上,我们有更好的算法。先看一个显而易见的结论:如果p是
    能整除n的所有大于1的数中最小的,那么p是n的一个素因子。

    (3)公因子的数量  
    问题描述:已知一个正整数N,问这个数有多少正公因子。
    算法分析:最容易想到的算法是:枚举1..N,看看有多少个数能整除N,这种算法的复杂
    度为O( N )。可以优化一下:如果N有小于SQRT( N )的因子X,那么N必定有大于SQRT( N )
    的因子Y与X对应,而且XY=N。所以我们只需要枚举1..SQRT( N )的数即可,还要考虑N为
    完全平方数的特殊情况
    上面这个算法的复杂度为O(sqrt(N))。其实我们可以利用因式分解的方法来做。假设我们
    已经分解N得到 N =(p[1]^s[1])*(p[2]^s[2])...*(p[pnum]^s[pnum]),其中p[i]为互不
    相同的素数,那么N的正因子的数量为(具体怎么推导请参考组合数学教材中的母函数一
    章):(s[1]+1)*(s[2]+1)*…*(s[pnum]+1)。

    (4)最大公因式  
    问题描述:已知两个正整数a和b,求这两个数的最大公因数GCD( a , b )。
    (GCD是Greatest Common Divisor的缩写)
    算法分析:不妨设a<=b,一种十分容易想到的算法是:枚举1到a的所有整数,在能同时整
    除a和b的数中取最大的。这个算法的时间复杂度为O(min(a,b)),当min(a,b)较大的时候
    程序要执行比较长的时间。我们可以利用初等数论中的一个定理:
    GCD( a , b ) = GCD( a , b-a ) = GCD( a , b-2*a ) = GCD( a , b-3*a ) = …
    = GCD( a , b mod a )
    关于这个定理的具体证明,请参考初等数论书(或者初中数学竞赛中的数论相关章节)。
    下面给出利用这个定理来写的一个求最大公因式的程序,此算法的时间复杂度为
    O(log(Max(a,b)))。

    (5)最小公倍数  
    问题描述:已知两个正整数a和b,求这两个数的最小公倍数LCM ( a , b )。
    (LCM是Least Common Multiply的缩写)
    算法分析:直接利用公式:LCM ( a , b ) * GCD( a , b ) = a * b即可

  • 相关阅读:
    IE页面后退刷新数据加载问题
    小经验: html中 js脚本运行顺序:思路整理
    jquery 之 $.end() 和 $.siblings()
    AI安防智能化发展至今还存在哪些问题?
    别 荣
    你是魔鬼 荣
    完全版权所有的DataGrid操作类及其用法 荣
    几篇关于.net1.1到.net2.0升级的文章(转载)Microsoft .NET Framework 1.1 和 2.0(测试版)兼容性 荣
    几篇关于.net1.1到.net2.0升级的文章(转载)在VS2005 正确地创建、部署和维护由1.1迁移到ASP.NET 2.0 应用程序注意事项 荣
    关于老实 荣
  • 原文地址:https://www.cnblogs.com/imouren/p/2265362.html
Copyright © 2011-2022 走看看