数学部分简单总结

总:

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

简单数论:

一、质数

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 \]

证明:

\(\because \gcd(a,b)=\gcd(a,a-b)\)

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

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

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

\(\therefore\)与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^P\equiv a\mod P \]

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

\[a^{\phi(n)}\equiv1\mod n \]

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

\[a^b\equiv a^{b\mod{\phi(n)}}\mod n \]

证明:

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

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

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

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

证明:反证法。

\(x_i\equiv x_j\mod n\)

则$x_i-x_j\equiv0\mod n \(,即\)a*(p_i-p_j)\equiv0\mod n$

\(\because a,p互质\to\therefore n\mid p_i-p_j\)

显然\(p_i,p_j<n,p_i\neq 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_i\in P\}\)与数集\(X=\{x_i\in 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\\ \therefore 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*\lfloor\frac{P}{i}\rfloor+P\%i\equiv0\mod P\\ \lfloor\frac{P}{i}\rfloor\equiv-P\%i*i^{-1}\mod P\\ i^{-1}\equiv-\lfloor\frac{P}{i}\rfloor*(P\%i)^{-1}\mod P\\ i^{-1}\equiv(P-\lfloor\frac{P}{i}\rfloor)*(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_n\equiv C^{m\ mod\ P}_{n\ mod\ P}\ (mod\ P) \]

实现的话递归即可。

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

题目:

Counting Swaps

古代猪文

Exlucas模板


posted @ 2019-04-03 22:36  薄荷凉了夏  阅读(482)  评论(1编辑  收藏  举报