本篇补充smooth sort和weakheap sort,不打算做太多介绍,因为自己太菜不会讲,只作为笔记来记录一下实现代码。smooth sort在接近排序完成的情况下的动态图
这里记录的是素数判断 Miller Rabbin 的快速判定算法,而分解使用的算法是 Pollard Rho 的玄学分解算法,这个算法的理论依据是生日悖论,这里不具体讨论这个数学问题,具体讨论看前面链接就可以了。
以下我们分别简要介绍这两个算法的原理
首先这是Miller Rabbin的维基百科介绍页,由于页面是中文,这里不做重复介绍。
下面简要解释一下Pollard’s Rho算法的原理,这是它的维基百科页面
首先我们来定义这样一个函数
$$f(x)=(x*x+c)%n$$
其中n是需要被分解的数,c是一个任意小于n的正整数常数。那么我们给一个初始值x1,通过计算 $f(x1)$ 得到x2,然后去求 $|x1-x2|$ 与 n 的最大公约数,只要结果大于1就找到了分解结果。那如果最大公约数仍然是1,那么就通过刚才的x2求出 $x3=f(x2)$ 并计算 $|x1-x3|$ 与 n 的最大公约数。也就是说,我们可以通过这个公式得到一个数列
二进制位运算的技巧特别多,这里就做一份cheat sheet,希望能帮助到大家。不过过于简单的就不列举了
单行表达式 作用 表达式 把右边连续的1变成0 n & ( n + 1 ) 把右边第一个1变成0 n & ( n - 1 ) 把右起第一个0变成1 n | ( n + 1 ) 把右起连续的0变成1 n | ( n - 1 ) 取右边连续的1 n ^ ( n + 1 ) 去掉右起第一个1的左边 n & -n 或 n & ( n ^ ( n - 1 ) ) 高低位交换,前x位 ( n << x ) | ( x >> ( 32 - x ) ) 有符号整数计算绝对值 ( n ^ (n >> 31) ) - (n >> 31)