zoukankan      html  css  js  c++  java
  • 数学部分简单总结

    总:

    这里只包括了一些简单数学知识。

    简单数论:

    一、质数

    1、单个质数的判定:① 试除法 ② Miller-Rabin

    Miller-Rabin的基本思想:随机+费马小定理+二次探测定理。

    [有兴趣的戳这里(在文章中间有提到)]

    [Here is mine]

    2、质数的筛法 :① 欧拉筛 ② 线性筛

    线性筛基本思想:确定每个数产生的唯一方式

    只给当前数乘上一个质因子,且使得这个质因子是生成的合数的最小质因子,这样保证了合数质因子从大到小累积

    线性筛 :

    	RG int n,m,cnt=0,i,j;
        n=gi(),m=gi();
        for(i=2;i<=n;++i) {
            if(!minpr[i])   // 数i的最小质因子
                pr[i]=1,minpr[i]=i,prime[++cnt]=i;
            for(j=1;j<=cnt&&prime[j]<=minpr[i]&&prime[j]*i<=n;++j)
                minpr[i*prime[j]]=prime[j];
        }
    

    3、质因数分解 :① 试除法 ② Pollard-Rho-大数质因数分解

    Pollard-Rho的讲解戳上面那个链接。

    关于Pollard-Rho的小优化:

    ① 每次算出一个差x后,不单单只看是否x|N,而是看是否gcd(x,N)>1。

    ② 在①的基础上,不需要每次都算gcd,而可以每127(其他数应该也行)个x累乘起来,和N算一次gcd。

     对Miller-Rabin的优化:对于质数选取选择:2,3,7,61,24251据说可以保证在10的14次方,只有46856248255981判不掉。

     这样可以筛出N的每一个因子,然后用Miller-Rabin判断是否为质数即可。

    IL int Pollard_rho(int x,int c) {
        RG int i,j,Las,now=0,res,gcd;
        for (i=2;;i<<=1) {
            for (j=1,Las=now,res=1;j<=i;++j) {
                now=(qm(now,now,x)+c)%x,res=qm(res,abc(now-Las),x);
                if (!(i%137)) {
                    gcd=getgcd(x,res);
                    if (gcd>1) return gcd;
                }                     
                if (now==Las) return x;
            }
            gcd=getgcd(x,res);
            if (gcd>1) return gcd;
        }
    }
    
    IL void Find(int x,int c) {
        if (x<2||x<=ans) return;
        if (Miller_Rabin(x)) {ans=max(ans,x);return;}  
        RG int p=x;
        while (p==x) p=Pollard_rho(x,c--);
        while (x%p==0) x/=p;
        Find(p,c),Find(x,c);
    }
    

    题目:

    Luogu Pollard-Rho 模板题


    二、约数

    1、算术基本定理及其推论:

    [N=prod^{cnt}_{i=1}P_i^{c_i} ]

    算术基本定理的推论(N的正约数和):

    [prod^{cnt}_{i=1}{sum^{c_i}_{j=0}P_i^{j}} ]

    2、N的正约数集合的求法:试除法

    3、1~N每个数的正约数集合:倍数法

    4、最大公约数:欧几里得算法

    5、互质与欧拉函数:

    [phi(n)=n*prod_{质数p|n}{frac{p-1}{p}} ]

    证明:

    首先只考虑两个质因子p,q的情况。

    那么需要去掉的是数是p,q的倍数,所以减掉(n/p,n/q)

    但是同时为p,q倍数的数被减掉了两次,所以加上(n/(p*q))

    所以得到(phi=n-n/p-n/q+n/(p*q)=n*(1-frac{1}{p})*(1-frac{1}{q}))

    对所有的质因子进行上述过程可以得到(phi(n))

    故欧拉函数的计算可在质因数分解的过程中求得。

    欧拉函数的性质:

    ① 对于任意n>1 ,1~n中与n互质的数的和为

    [n*phi(n)/2 ]

    证明:

    (ecause gcd(a,b)=gcd(a,a-b))

    ( herefore)与n不互质的数(x,n-x)成对出现。

    ( herefore)这些数的平均值为(n/2)

    (ecause sum_{i=1}^{n-1}i=frac{n}{2}*(n-1))

    ( herefore)与n互质的数的平均值也是(n/2)

    上述性质得证。

    ② 若a,b互质,则有:

    [phi(ab)=phi(a)*phi(b) ]

    证明:根据(phi)的定义,直接(a,b)分解质因数即可。

     实际上,一个函数f,当a,b互质时,存在

    [f(ab)=f(a)*f(b) ]

    那么f为积性函数。相关拓展内容

    题目:

    反素数 Sol

    余数之和 Sol

    Hankson的趣味题 Sol


    三、同余

    1、费马小定理:若P是质数,那么对于任意整数a,有:

    [a^Pequiv amod P ]

    2、欧拉定理:若正整数a,n互质,则:

    [a^{phi(n)}equiv1mod n ]

    3、欧拉定理的推论:若正整数a,n互质,则对于任意整数b,有:

    [a^bequiv a^{bmod{phi(n)}}mod n ]

    证明:

    可以发现费马小定理是欧拉定理的n为质数时的一种特殊情况。

    所以只需证明欧拉定理即可。下面证明欧拉定理。

    (1~n-1内与n互质的数为p_i,令x_i=a*p_i)

    引理1:(x_i)(mod n)意义下两两不同。

    证明:反证法。

    (x_iequiv x_jmod n)

    则$x_i-x_jequiv0mod n (,即)a*(p_i-p_j)equiv0mod n$

    (ecause a,p互质 o herefore nmid p_i-p_j)

    显然(p_i,p_j<n,p_i eq p_j),所以上式不成立。所以假设不成立。

    引理2:(x_i)(mod n)意义下与n互质。

    证明:(gcd(x_i,n)=gcd(n,xi\%n)=1)

    由于(p_i,x_i)都是(phi(n))个,(p_i,x_i)都是两两不同,并且(p_i,x_i)都与n互质

    所以数集(P={p_iin P})与数集(X={x_iin X})相等。

    所以可以得到:

    [x_1*x_2…*x_{phi(n)}equiv p_1*p_2*…p_{phi(n)}mod n\ a*p_1*a*p_2*…a*p_{phi(n)}equiv p_1*p_2*…p_{phi(n)}mod n\ (a^{phi(n)}-1)*p_1*p_2*…p_{phi(n)}equiv 0 mod n\ herefore a^{phi(n)}equiv 1 mod n ]

    命题得证。

    关于欧拉定理的推论的证明:令(b=p*phi(n)+q),把次方展开即可。

    4、裴蜀定理:对于任意整数a,b,存在一对整数x,y,满足:

    [a*x+b*y=gcd{(a,b)} ]

    证明:考虑欧几里得算法的过程。

    ​ 当b=0时可以得到一组特解,每次回到上一层时,用原来的解总是可以得到一组新解。

    ​ 扩展欧几里得算法即基于上述过程。

       推广:对于更加一般的方程

    [a*x+b*y=c ]

    ​ 它有解,当且仅当:

    [gcd{(a,b)}mid c ]

    5、乘法逆元的求法(记为inv):

    ① 费马小定理(若模数P为质数)。

    ② 扩展欧几里得算法。

    ③ 线性递推逆元:

    [inv[i]=(P-P/i)*inv[P mod i] ]

    证明:

    [i*lfloorfrac{P}{i} floor+P\%iequiv0mod P\ lfloorfrac{P}{i} floorequiv-P\%i*i^{-1}mod P\ i^{-1}equiv-lfloorfrac{P}{i} floor*(P\%i)^{-1}mod P\ i^{-1}equiv(P-lfloorfrac{P}{i} floor)*(P\%i)^{-1}mod P\ ]

    6、线性同余方程:CRT & ExCRT

    有兴趣的戳这里

    7、高次同余方程:BSGS & ExBSGS

    有兴趣的戳这里

    题目:

    The Luckiest Number Sol

    Sumdiv Sol

    ExCRT模板

    BSGS模板

    ExBSGS模板


    线性代数 & 组合数学:

    四、矩阵乘法

    主要用于加速递推。

    需要特别留心的是关于类似floyd的可行矩阵的递推,可能会有点抽象。

    直接上题吧:

    石头游戏 Sol

    数学作业 Sol

    花园 Sol


    五、高斯消元与线性空间

    1、Gauss_Jordan消元法(无回带操作)

    IL void Gauss_Jordan() {
    	RG int i,j,k,l;
    	for(i=1;i<=n;++i) {
    		for(j=cnt+1,l=0;j<=n;++j)
    			if(fabs(a[j][i])>eps) {l=j;break;}
    		if(!l) continue;
    		for(j=i,++cnt;j<=n+1;++j) swap(a[cnt][j],a[l][j]);
    		for(j=i+1;j<=n+1;++j) a[cnt][j]/=a[cnt][i];
    		a[cnt][i]=1.0;
    		for(j=1;j<=n;++j) {
    			if(j==cnt) continue;
    			RG DB res=a[j][i]/a[cnt][i];
    			for(k=i;k<=n+1;++k) a[j][k]-=res*a[cnt][k];
    		}			
    	}
    	for(i=cnt+1;i<=n;++i)
    		if(fabs(a[i][n+1])>eps) {puts("-1");exit(0);}
    	if(cnt<n) {puts("0");exit(0);}
    }
    // 无解输出-1 无穷解输出0
    

    2、线性基

    有兴趣的戳这里

    题目:

    球形空间产生器

    开关问题

    线性基模板

    装备购买 Sol

    XOR Sol


    六、组合计数

    1、加法原理 & 乘法原理

    不多说。。

    2、排列 & 组合:

    从n个不同元素中选m个元素排成一列,产生的不同排列数量为:

    [P^m_n=frac{n!}{(n-m)!} ]

    从n个不同元素中选m个元素组成一个集合,产生的不同集合数量为:

    [C^m_n=frac{n!}{(n-m)!*m!} ]

    3、二项式定理:

    [(a+b)^y=sum_{i=0}^ya^i*b^{n-i}*C^i_n ]

    4、多重集的排列 & 组合:

    设多重集S={c1·a1,c2·a2……cN·aN},S的全排列个数为:

    [P=frac{(sum^N_{i=1}{n_i})!}{prod^N_{i=1}(n_i!)} ]

    设多重集S={c1·a1,c2·a2……cN·aN},则从中选出r个元素组成一个多重集(此处仅考虑r<=ni的情况)的数量为:

    [C^{N-1}_{N+r-1} ]

    对于r更加一般的情况,需要用到容斥,此处不作深究。

    5、Lucas定理:

    若P为质数,则对于任意整数1≤m≤n,有:

    [C^m_nequiv C^{m mod P}_{n mod P} (mod P) ]

    实现的话递归即可。

    推广:Exlucas,可以处理P为任意数的情况。有兴趣的戳这里

    题目:

    Counting Swaps

    古代猪文

    Exlucas模板


  • 相关阅读:
    循环的中断
    创建.NET应用程序所经历的步骤
    完整的开发一个ContentProvider步骤
    Perl 基于OOP的数据库链接(增删改查)
    Perl 基于OOP的数据库链接(优化)
    Perl 基于OOP的数据库链接
    Perl oop链接数据库
    Perl oop研究
    PythonStudy——内存管理机制 Memory management mechanism
    博客园美化——Design by Venti
  • 原文地址:https://www.cnblogs.com/Bhllx/p/10652038.html
Copyright © 2011-2022 走看看