算法与数据结构八日谈之五——数学相关

1.模算术

欧几里得算法求最大公约数

int gcd(int a,int b){
    return b==0 ? a: gcd(b,a%b);}

扩展欧几里得算法求乘法逆元

也可利用费马小定理和快速幂直接求出乘法逆元

快速乘法

在模数大于int范围时直接乘可能会溢出,可以用基于二分的加法来代替乘法

快速幂

模线性方程组

中国剩余定理,实现方法与拉格朗日插值法类似

离散对数

BSGS算法

Lucas定理

2.矩阵及其运算

矩阵乘法的应用

矩阵乘法的意义是转移

用矩阵乘法优化一阶递推式
计数问题的状态转移可以用矩阵乘法

矩阵的行列式

拉普拉斯算子的n-1阶主子式的行列式的值等于改图的生成数个数
可以计算n维空间中的“体积”(例如三角形面积,四面体的体积等)

高斯消元

用高斯消元计算矩阵的行列式的值

先将原矩阵化为上三角矩阵,则行列式的值为对角线上元素的乘积

解线性方程组

类似解行列式,对于系数矩阵在消元的时候对最后一列减去相应的值即可,再加上一次会带就可求出解。

异或方程组的解法

只需在消元时将原来对数据的处理改为异或即可

矩阵的判定问题

判定两个矩阵的乘积是否等于另一个矩阵,保证直接用乘即使使用Strassen矩阵乘法也过不了

构造随机的列向量,分别乘上给定矩阵,判定乘积所得的向量是否相等

相当好的机遇随机性的算法,将 O(n3) 的判定问题优化到了 O(n2)

3.数论相关

素数判定

朴素判定

复杂度 O(n)

Miller-Rabin算法

基于概率性的算法,但增加重复次数可将错误概率降到极低,效率高

素数筛

埃拉托斯特尼筛法

理论复杂度 O(nlglgn) ,但因为只有加法,在某些时候比下面这玩意要快

欧拉筛法

理论复杂度 O(n) ,在筛的过程中避免了前者中重复判定的过程,降低了复杂度。更重要的是可以在筛的过程中求出每个数的欧拉函数和莫比乌斯函数的值

数的质因子分解

朴素算法
Pollard_rho算法

利用一些奇淫巧计来处理可能为原数质因子的数,将复杂度降为 O(n)

重要的数论函数

欧拉函数 φ(n)

欧拉函数的定义:

n=i=1mpαii

φ(n)=ni=1m(11pi)

莫比乌斯函数 μ(n)

莫比乌斯函数的定义:
当n含有平方因子时, μ(n)=0
当n的质因子个数为奇数时 μ(n)=1
当n的质因子个数为偶数时 μ(n)=1

-数论函数的狄利克雷卷积(这里记作 )

(fg)(n)=d|nf(d)g(n/d)

上述数论函数的重要性质:

d|nφ(d)=n

d|nμ(d)=[n==1]

利用这些性质可以解决很多求和问题。
(这种东西。。。题目做多了就会用了)

4.概率与期望

容斥原理

还记得小学讲的韦恩图么,对,就那劳什子。
求一个关于集合的函数时可以利用容斥原理转化为关于其子集的问题。

期望的线性性

两个一样的字连着说会有种ydc的感觉。
高中数学内容,不知道是啥回去玩泥巴吧。
在处理这种问题时要注意细节问题,尤其是树形的,在考虑当前节点对子树的影响时,也要考虑其对祖先的影响。

5.数值积分

咳咳,不是会员卡的积分。

多项式积分

可以处理一些与概率相关的问题

辛普森自适应积分

牛顿-科斯特公式在n=2时的情况
通过将大区间细化以得到所需精度的积分方法
用途广泛

6.多项式相关

利用快速傅里叶变换(FFT)实现 O(nlgn) 的多项式乘法

巧妙地利用单位根的特殊性质节省掉不需要的重复计算

模意义下的快速数论变换(NTT)

没有fft的精度问题,只有整数的运算,虽然取模操作效率较低,但也是非常实用的多项式乘法方法

多项式开方

多项式逆元

多项式除法

这些东西我都不会。

7.置换、群和置换群的应用

置换的阶

Burnside 引理在计数问题中的应用

Po´lya 原理的应用

置换群在搜索中的剪枝

这部分我暂时不想给代码(你™懒就直说)。

你可能感兴趣的:(总结,数学相关,快速傅里叶变换,数论,数论,数学,算法)