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即可

  • 相关阅读:
    mac上python3安装HTMLTestRunner
    双目深度估计传统算法流程及OpenCV的编译注意事项
    深度学习梯度反向传播出现Nan值的原因归类
    1394. Find Lucky Integer in an Array
    1399. Count Largest Group
    1200. Minimum Absolute Difference
    999. Available Captures for Rook
    509. Fibonacci Number
    1160. Find Words That Can Be Formed by Characters
    1122. Relative Sort Array
  • 原文地址:https://www.cnblogs.com/imouren/p/2265362.html
Copyright © 2011-2022 走看看