ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-11 20:10:12  阅读:177  来源: 互联网

标签:约数 vis 数论 质数 mid sqrt int 素数 include


素数与约数

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有