数学算法对数增长阶实现
最近在看scip,不得不说,这本书的确是经典之作,每天抽出时间看一会上面所讲的东西,对我这样编程算法基础薄弱的人,也是受益匪浅。所以想把上面的一些好的算法用自己熟悉的javascript重新写一遍,加深记忆。
最大公约数
两个整数a和b的最大公约数(GCD)定义为能除尽这两个数的那个最大的整数。在SCIP中提到了一种基于欧几里得算法的对数增加阶的实现。该算法的思想是:如果r是a除以b的余数,那么可以有结论r和b的公约数等于a和b的公约数。基于该理论,有如下实现
function GCD(a,b){
let gcd = 0;
if(b === 0){
gcd = b;
}
else{
let r = a%b;
GCD(b,r);
}
return gcd;
}
增长阶是log(n)底数是1.6180。
素数检测
素数检测是数学中一个经久不衰的话题,同样,本文也只讨论素数检测的对数级复杂度的算法。
关于这个算法,需要介绍一下这个算法的核心理论:
费马小定理推论:对于一个整数n,取另外一个整数a满足a< n,计算a^n%n是否等于n,如果结果不是a,那肯定不是素数,相反,那么n是素数的概率就很大。