数论部分摘要

主要内容:1.素数 2.同余 3.组合数学 4.矩阵乘法

1.素数

试除法

试除法可以对任意位置的正整数进行查询,除了试除法以外,还有其他的优秀的算法也可以对单个数进行判定,如 Miller_Rabin
试除法在单个查询时,可以以 (O(sqrt{n})) 的时间内判定一个数是否是质数,一般而言,试除法已经能够满足大部分题目对于质数查找的需求

质数筛

问题:给定一个整数 N ,求出 1~N 之间的所有质数,称为质数筛

1.Eratosthenes筛法(埃氏筛)

该算法基于一个思想:对于一个数 x ,它的所有倍数 (2x , 3x , …… , dx) , 均为合数,显然,该命题成立
由此,埃氏筛对所有未被标记过的数进行筛选,经它的所有倍数筛去,剩余的数即为素数
但是, 2 和 3 均为质数,未被标记,它的倍数 6 会被标记多次,对复杂度有一定的影响,(O(Nlog{log{N}}))

2.线性筛
线性筛通过“从大到小积累质因子”的方法标记每一个合数,这样,对于一个合数,就可以避免过多的冗余运算

int v[maxn],prime[maxn];
void primes(int n)
{
	memset(v,0,sizeof(v));//最小质因子
	m=0;//质数个数
	for(int i=2;i<=n;i++)
	{
		if(!v[i])//未被标记,i为质数
		{
			v[i]=i;
			prime[++m]=i;
		}
		for(int j=1;j<=m;j++)
		{
			if(prime[j]>v[i]||prime[j]>n/i) break;//i有更小的质因子,或者超出n的范围
			v[i*prime[j]]=prime[j];//prime[j]为合数 i*prime[j]的最小质因子
		}
	}
}

欧拉函数

  • 定义:欧拉函数 (varphi(n)) 表示在小于 n 的数中,与 n 互质的数的个数
  • 计算公式:(varphi(n)) = (n imes prod_{i=1}^{k}{(1-frac{1}{p_i})})
  • 性质:欧拉函数为积性函数(积性函数定义:若任意的两个互质的正整数满足(f(xy)=f(x) imes f(y)),则称函数 (f(x)) 为积性函数)
  • 性质:(sum_{d|n}{varphi(d)} = n)

2.同余

定义 & 定理

  • 定义:若整数 a , b 除以正整数 m 的余数相等,则称 a , b 模 m 同余,记为:(a equiv b (mod m))
  • 定义:乘法逆元:若整数 b , m 互质,则必然存在 (a imes b equiv 1 (mod m)) ,则称 a 为 b 的乘法逆元
  • 费马小定理:若 p 为质数 , 则对于任意整数 a , 有 (a^p equiv a (mod p))
  • 欧拉定理: 若正整数 a , n 互质,则 (a^{varphi(n)} equiv 1 (mod n))

扩展欧几里得算法(exgcd)

  • 贝祖定理:对于任意的整数 a,b,存在一对整数 x,y,满足 (ax+by = gcd(a,b))
    利用贝祖定理,即可得到上式中整数 x,y 的计算方法,称为扩展欧几里得算法
int exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	int d=exgcd(b,a&b,x,y);//利用扩展欧几里得算法,可顺便求得 a 与 b 的最大公约数
	int z=x;
	x=y;
	y=z-(a/b)*y;
	return d;
}

利用扩展欧几里得算法,即可求得不定方程 (ax + by = gcd(a,b)) 的一组特解,则其通解可表示为:(x = frac{c}{d}x_0 + kfrac{b}{d})(y = frac{c}{d}y_0 - kfrac{a}{d})

中国剩余定理(crt)

  • (m_1 , m_2 , …… , m_n) 为两两互质的正整数,(m = prod_{i=1}^{n}{m_i})(M_i = m/m_i)(t_i) 是线性同余方程 (M_i t_i equiv 1 (mod m_i)) 的一个解,
    则对于任意的 n 个整数 (a_1 , a_2 , …… , a_n) , 方程组:

    有整数解,解为: (x = sum_{i=1}^{n}{a_iM_it_i})
    证明略

3.组合数学

组合数学向来是数学上的一大难点,但是应用性极强,可以帮助解决许多复杂的问题,与容斥原理配合食用效果更佳 (建议百度搜索:小葱同学

加法原理

  • 若完成一件事的方法有 n 类,其中第 i 类方法包括 (a_i) 种不同的方法,且这些方法互不重合,则完成这件事共有:(a_1+a_2+a_3+……+a_n) 种方法

乘法原理

  • 若完成一件事的需要有 n 步,其中完成第 i 步包含 (a_i) 种不同的方法,且这些步骤互不干扰,则完成这件事共有:(a_1 imes a_2 imes a_3 imes …… imes a_n) 种方法

排列数

  • 从 n 个不同元素中依次取出 m 个元素排成一列,产生的不同排列的数量为:(A_n^m = frac{n!}{(n-m)!})

组合数

  • 从 n 个不同元素中取出 m 个元素组成一个集合,产生的不同集合的数量为:(C_n^m = frac{n!}{(n-m)!(m)!})

性质

1.(C_n^m = C_n^{n-m})

2.(C_n^m = C_{n-1}^m + C_{n-1}^{m-1})

3.(C_n^0 + C_n^1 + C_n^2 + …… + C_n^n = 2^n)

4.((a+b)^n = sum_{k=0}^{n}{C_{n}^{k}{a^k}{b^{n-k}}}) (二项式定理)

Lucas 定理

公式:(C_n^m equiv C_{n mod p}^{m mod p} * C_{n/p}^{m/p} (mod p))
(证明略)

原文地址:https://www.cnblogs.com/jd1412/p/13293820.html