首页 > 其他分享 >数论基础B

数论基础B

时间:2025-01-02 15:20:19浏览次数:1  
标签:数论 合数 基础 素数 long int 枚举 质数

数论基础B


试除法判定质数

暴力做法:枚举 \(2\) ~ \(n-1\) 的所有数,判断能否将 \(n\) 整除,如果存在一个数能把 \(n\) 整数,说明 \(n\) 不是质数

实际上只需要枚举到 \(\sqrt{n}\) 即可,如果 \(a\) 是 \(n\) 的约数,那么 \(\frac{n}{a}\) 也是 \(n\) 的约数,我们只需要检验 \(min(a,\frac{n}{a})\) 即可

bool is_prime(int x){
	if (x == 1) return 0;//1不是质数
	for (long long i = 2; i <= sqrt(x); i++)//从小到大枚举
		if (x % i == 0) return 0;//如果能整除,立即返回非质数
	return 1;//返回是质数
}

具体的计算中,i <= sqrt(x) 的操作可以优化为 i * i <= xi <= x / i ,得到常数级的优化

不难看出对于判断 \(n\) 而言,试除法判断质数的时间复杂度为 \(O(\sqrt{n})\)

埃拉托斯特尼筛法

这是一种在给定区间内有效筛选素数的方式,原理是:

  • 从 \(2\) 开始枚举每一个数,直到到达给定的界限
  • 对每一个枚举的数都判断一次状态
  • 枚举当前质数的倍数,他们必然是合数,更改状态

最后每个数都存在一个状态,要么被标记为合数,要么被标记为质数,这就完成了筛选素数的过程

bool st[N];//状态数组,合数被标记为 1,初始化时都为 0
int prime_mem[N];//记录素数
int cnt;//素数个数

void Eratosthens(int n){
	for (long long i = 2; i <= n; i++){//从小到大枚举
		if (!st[i]){//如果这个数是素数
			prime_mem[++cnt] = i;//素数个数加 1,并记录
			for (long long j = i * i; j <= n; j += i)//从小到大枚举素数的倍数
				st[j] = 1;//标记素数
		}
	}
}

其中 for (long long j = i * i; j <= n; j += i)i * i 开始标记合数,这是因为小于 i * i 的合数在之前已经被标记过了

证明如下:

  • 设 \(k < i\quad k\in N^+\),则 $ki $ 为 \(i\) 的倍数,满足 \(ki<i^2\)

\[ki<i^2 \iff k<i \]

  • 存在质数\(p\), \(p<i\),\(p\) 标记了它的倍数 \(kp\) ,就有

\[p\times k=p \iff k=1 \]

  • 由于 \(k<i\) ,所以下述不等式成立

\[p\times k<p\times i<i^2 \iff p<i,k<i \]

所以任意的小于 \(i^2\) 的合数,都已经被小于 \(i\) 的一个素数 \(p\) 标记过

显然,根据算数基本定理,要找到 \(n\) 以内的所有质数,只需要对不超过 \(\sqrt{n}\) 的素数进行筛除即可

for (long long i = 2; i <= n; i++) \(\rightarrow\) for (long long i = 2; i * i <= n; i++)

这种筛法的时间复杂度在 \(O(n\log\log n)\) ,近乎于 \(O(n)\)

线性筛法/欧拉筛法

对于上面的埃拉托斯特尼筛法,过程中会对一个合数重复标记多次,通过线性筛法,可以做到让一个合数只被标记一次

那么时间复杂度就能降到 \(O(n)\)

原理如下:

  • 合数总是可以分解为多个质数的积,(整数惟一分解定理)
  • 使筛掉的方法唯一,每次通过合数的最小质因子筛掉
bool st[N];//状态数组,合数被标记为 1,初始化时都为 0
int prime_mem[N];//记录素数
int cnt;//素数个数

void Euler(int n){
	for (long long i = 2; i <= n; i++){
		if (!st[i]) prime_mem[++cnt] = i;
		for (long long j = 1; i * prime_mem[j] <= n; j++){
			st[i * prime_mem[j]] = 1;
			if (i % prime_mem[j] == 0) break;//保证只被最小质因子筛除
		}
	}
}

\(i\) 为质数,最多枚举到自身中断,即 \(i^2\ \%\ i=0\) 。\(i\) 为合数,最多枚举到最小质因子 \(p\) 结束,即 \(i*p\ \%\ i=0\)

其中的 st[i * prime_mem[j]] = 1; 做到了具体的筛除过程

标签:数论,合数,基础,素数,long,int,枚举,质数
From: https://www.cnblogs.com/dianman/p/18647815

相关文章

  • 2025年Java基础面试题,附答案解析。
    1.Java支持多继承么?不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。2.接口和抽象类的区别是什么?Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可......
  • python基础while循环(break、continue)、格式化输出、运算符
    day2while循环break、continue相关知识、格式化输出打印1~100的数字a=1whilea<=100:print(a)a=a+1#continue结束本次循环,开始下一次开启下一次循环break直接结束循环flag=Truewhileflag:print(1)print(2)flag=Falsecontinueprint......
  • 【AI产品经理入门到精通】超详细基础教程:收藏这一篇就够了!祝大家2025年都能成功上岸
    什么是AI产品经理?AI产品经理,顾名思义,就是负责人工智能产品的规划、设计、开发和迭代的专业人士。他们不仅要对市场有敏锐的洞察力,还要对技术有深入的理解,能够将复杂的AI技术转化为用户友好的产品。为什么要学AI产品经理?根据脉脉《2023年人才报告》显示:人工智能成为2023......
  • Openlayers零基础教程【6】geojson实现点要素
    1.geojson定义geojson数据是矢量数据,是包含地理信息的json数据,格式是以key:value的形式存在的。后缀以geojson结尾2.geojson设置一个点要素本篇内容我们主要介绍使用geojson设置一个点要素,效果如下图所示。3.实现步骤:3.1.创建geojson数据/*创建geojson数据......
  • 大语言模型【基础】(二)微调需要多少算力?
    微调模型需要多少的GPU显存?一、模型【训练】占用显存【QWen2.5-32B为例】模型配置情况如下所示方法一:较为精确估计全量微调占用情况结论根据模型配置和假设的batchsize、序列长度:总显存需求:约388GB所需卡数:至少13张昇腾910B卡才能满足显存需求,推荐使用1......
  • 01xArduino程序基础
    Arduino程序基础使用C++编程,基本参考C++语法。每一句结尾用分号,注释用//,全大写单词是特有字符,不要乱用。函数用{}套起来。voidsetup(){//putyoursetupcodehere,torunonce://这里的代码在开始的时候运行一次codedoingsomething;//每一行代码......
  • 《docker基础篇:5.本地镜像发布到阿里云》
    @目录5.本地镜像发布到阿里云本人其他相关文章链接5.本地镜像发布到阿里云案例使用步骤:1)本地镜像素材原型2)阿里云开发者平台3)创建仓库镜像4)将镜像推送到阿里云5)将阿里云上的镜像下载到本地6)运行注意点1:本地镜像发布到阿里云流程注意点2:步骤1中本地镜像素材原型注......
  • 初等数论-06-连分数
    连分数定义设\(a_0,a_1,...,a_n,...\)是一个无穷实数序列,其中\(a_j>0,j≥1,n\)为非负整数。分数\[a_{0}+\frac{1}{a_{1}+\frac{1}{a_{2}+\cdots+\frac{1}{a_{n}}}}\]称为有限连分数,如果\(a_0\)为整数,\(a_1...a_n\)为正整数,则称为有限简单连分数。当\(n→∞\)时,则分别称为连分......
  • 计算机基础,让电脑小白对计算机有更深入的认识
    计算机的组成输入设备、输出设备、存储器、运算器、控制器1.输入设备:将其他信号转换为计算机可以识别的信号(电信号)。2.输出设备:将电信号(0、1)转为人或其他设备能理解的信号。3.运算器:CPU对信息处理和运算的部件,常进行算术运算和逻辑运算,其核心是算术逻辑单元ALU,CPU中用各......
  • 第一节 Java中的For循环到底多强大?从基础到高级让你彻底搞懂!
    在Java编程中,for循环是一个“平凡又伟大”的存在!......