『学习笔记』 质数约数 「数论」
作者:互联网
素数与约数
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.埃氏筛
原理:素数的倍数一定不是素数
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]
}
}
}
扔下一道例题
代码在这哦~
#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.整除的性质
- 若 \(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)\) ,命题获证。
-
若 \(a \mid b , b \mid c\) ,则 \(a \mid c\) 。(传递性)
-
若 \(ma \mid mb (m \ne 0)\) ,则 \(a \mid b\) 。
-
若 \(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