其他分享
首页 > 其他分享> > 『学习笔记』 质数约数 「数论」

『学习笔记』 质数约数 「数论」

作者:互联网

素数与约数

1.算数基本定理

任何一个大于1的正整数都能唯一分解成有限个质数的乘积

写作:

\[ n=p_1^{c1}p_2^{c2}······p_m^{cm} \]

可以直接写作:

\[ \prod_{i=1}^mp_i^{ci} \]

\(pi\) 都是质数且满足 $ p1<p2<······<pm$ , \(ci\) 都是正整数。

这玩意。。。好像没啥用,但是后面一些东西都要用到。

2.质数分布定理

对于任意正整数 \(x\) ,定义 \(f(x)\) 为不大于 \(x\) 的质数个数,则有 \(f(x)\approx x / ln x\) ,第 \(n\) 个质数的渐近值 \(p(n) \approx n ln n\) 。

这个好像真的没啥用

3.若存在一个正整数 \(n\) 为合数,则存在一个数 \(k\) ,满足 \(2\) \(\le\) \(k \le\) \(\sqrt{n}\) 且 \(k|n\) 。

证明过程:

首先,我们要证明一个结论:

如果 \(m1*m2=n\) ,那么,\(m1\) 和 \(m2\) 必定有一个大于 \(\sqrt{n}\),一个小于 \(\sqrt{n}\) 。

然后我们去证明上面的结论,假如我们在 \(2—sqrt(n\) 没有找到 \(n\) 的因数,在 \(sqrt(n)—n\) 中找到了因数 \(m1\) ,根据上面的结论,另一个因数 \(m2\) 肯定在 \(2—sqrt(n)\) 之间,与在 \(2—sqrt(n)\) 之间没有找到因数矛盾,命题获证。

4.素数的筛选

1.埃氏筛

原理:素数的倍数一定不是素数

link

code

for(int i=2;i<=n;++i)
  if(isprime[i]==1)
  {
  	for(int j=2*i;j<=n;j+=i)
  	  isprime[j]=0;
  }

埃氏筛的复杂度已经非常接近线性了,但是不能完全达到线性,因为它在筛的时候会有重复,比如说12,它在被2筛过之后,循环到3,4,6的时候都会再重新筛一遍。

2.线性筛

针对上面的埃氏筛存在的问题,我们可以让每一个合数只被它的最小质因数筛掉。

code

inline void Prime(int n)
{
	memset(vis,1,sizeof(vis));//一开始全部赋为素数 
	vis[1]=0;//1不是素数 
	for(reg int i=2;i<=n;i++)//枚举 
	{
		if(vis[i])//如果没筛掉 
		prime[++cnt]=i;//i就是素数,cnt是计数器 
		for(reg int j=1;j<=cnt && i*prime[j]<=n;j++)//i*prime[j]<=n保证他不超过上限 
		{
			vis[i*prime[j]]=0;//不是素数 
			if(i%prime[j]==0) break;//i中含有prime[j] 
		}
	}
}

扔下一道例题

P3383 【模板】线性筛素数

代码在这哦~
#include<bits/stdc++.h>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define reg register
using namespace std;
const int N=1e8+5; 

bool vis[N];
int n,q,cnt;
int prime[N];

inline void Prime(int n)
{
	memset(vis,1,sizeof(vis));//一开始全部赋为素数 
	vis[1]=0;//1不是素数 
	for(reg int i=2;i<=n;i++)//枚举 
	{
		if(vis[i])//如果没筛掉 
		prime[++cnt]=i;//i就是素数,cnt是计数器 
		for(reg int j=1;j<=cnt && i*prime[j]<=n;j++)//i*prime[j]<=n保证他不超过上限 
		{
			vis[i*prime[j]]=0;//不是素数 
			if(i%prime[j]==0) break;//i中含有prime[j] 
		}
	}
}
 
int main()
{
	scanf("%d%d",&n,&q);
	Prime(n);//求出n以内的所有素数 
	while(q--)//共有q次询问 
	{
		int k; 
		scanf("%d",&k);//第k小的数 
		printf("%d\n",prime[k]);//输出 
	}
	return 0;
}

5.一个正整数 \(n\) ,至多只有一个大于 \(sqrt(n)\) 的质因子。

证明:设 \(p,q≥ sqrt(n)\) , \(p | n\) , \(q | n\) ,那么我们有 \(pq | n\) , \(pq > n\) , 很显然矛盾,命题获证。

6.带余除法

设 \(a\) , \(b\) 是两个整数,且 \(b != 0\) ,如果存在整数 \(c\) ,则存在唯一的整数 \(q,r\) , 使得 \(a=qb+r (0\le r < b)\) ,该式被称为带余除法,并记 \(r= a\mod b\) 。

7.整除的性质

  1. 若 \(a \mid b\) 且 \(a \mid c\) ,则 \(\forall x,y\) ,有 \(a \mid xb+yc\) 。

证明:

设 \(b=an, c=am\) ,则 \(xb+yc=xan+yam=a(xn+ym)\) ,很明显 \(a \mid a(xn+ym)\) ,命题获证。

  1. 若 \(a \mid b , b \mid c\) ,则 \(a \mid c\) 。(传递性)

  2. 若 \(ma \mid mb (m \ne 0)\) ,则 \(a \mid b\) 。

  3. 若 \(a \mid b\) 且 \(b \mid a\) ,则 \(a=\pm b\) 。

8.算术基本定理的推论

对于唯一分解的正整数 \(n= p_1^{c_1}p_2^{c_2}……p_m^{c_m}\)

其正约数集合可写作 \(\{ p_1 ^ {c_1} p_2 ^ {c_2}……p_m^{b_m}| 0 \le b_i \le c_i \}\)

其正约数个数为:

\[(c_1+1)(c_2+1)……(c_m+1)=\prod_{i=1}^mc_i+1 \]

其所有约数和为:

\[(p_1^0+p_1^1+……+p_1^{c_i})……(p_m^0+p_m^1+……p_m^{c_m})= \prod_{i=1}^m(\sum_{j=0}^{c_i}a_i^j) \]

对于一个合数 \(n^2\) ,它的约数个数为:

\[\prod_{i=1}^mc_i \times 2+1 \]

转自link,微改,谢谢JJ

标签:约数,vis,数论,质数,mid,sqrt,int,素数,include
来源: https://www.cnblogs.com/Alwaysmaxx/p/16467608.html