小素数,大智慧

news2024/11/25 13:23:06

小素数,大智慧

  • 定义
  • 判断方法
    • 方法1
    • 方法2
    • 方法3
    • 方法4
    • 方法5
    • 方法6
    • 方法7

定义

素数(质数):在大于 1 的自然数中,只有 1 和该数本身两个因数的数 素数(质数):在大于1的自然数中,只有1和该数本身两个因数的数 素数(质数):在大于1的自然数中,只有1和该数本身两个因数的数

判断方法

方法1

时间复杂度 O ( n ) 时间复杂度O(n) 时间复杂度O(n)
定义法 定义法 定义法

bool isPrime(int n){
	if(n < 2) return false;
	for(int i = 2; i < n; i++) if(n % i == 0) reutrn false;
	return true;
} 

方法2

时间复杂度 O ( n 2 ) 时间复杂度O(\sqrt{\frac{n}{2}}) 时间复杂度O(2n )

性质:对于合数 a ,一定存在素数 p 1 ≤ a ≤ p 2 使得 p 1 性质:对于合数a,一定存在素数p_1≤\sqrt{a}≤p_2使得p_1 性质:对于合数a,一定存在素数p1a p2使得p1 ∣ | a , p 2 a,p_2 ap2 ∣ | a (定性理解) a(定性理解) a(定性理解)
定量证明 定量证明 定量证明
在这里插入图片描述

原理:检验 [ 1 , n ] 区间里的数是否有约数,检验区间从 [ 1 , n ] 缩小到 [ 1 , n ] 原理:检验[1,\sqrt{n}]区间里的数是否有约数,检验区间从[1,n]缩小到[1,\sqrt{n}] 原理:检验[1,n ]区间里的数是否有约数,检验区间从[1,n]缩小到[1,n ]

bool isPrime(int n){
	if(n < 2) return false;
	for(int i = 2; i < sqrt(n); i++) if(n % i == 0) reutrn false;
	return true;
} 

方法3

在方法 2 的基础上,只筛奇数 在方法2的基础上,只筛奇数 在方法2的基础上,只筛奇数
因为除 2 以外的偶数都是合数,直接跳过,只关心奇数即可 因为除2以外的偶数都是合数,直接跳过,只关心奇数即可 因为除2以外的偶数都是合数,直接跳过,只关心奇数即可

bool isPrime(int n){
	if(n < 2) return false;
	for(int i = 2; i < sqrt(n); i++) if(n % 2 == 0 || n % i == 0) reutrn false;
	return true;
} 

方法4

原理:所有大于 3 的素数都可以表示为 6 n ± 1 的形式 原理:所有大于3的素数都可以表示为6n±1的形式 原理:所有大于3的素数都可以表示为6n±1的形式

证明: n ∈ N , n 可以用 6 n − 1 ( 6 n − 1 < = > 6 n + 5 ) 、 6 n 、 6 n + 1 、 6 n + 2 、 6 n + 3 、 6 n + 4 表示 证明:n∈N,n可以用6n-1(6n-1<=>6n+5)、6n、6n+1、6n+2、6n+3、6n+4表示 证明:nNn可以用6n1(6n1<=>6n+5)6n6n+16n+26n+36n+4表示
其中, 6 n 是 6 的倍数,不是素数 其中,6n是6的倍数,不是素数 其中,6n6的倍数,不是素数
6 n + 2 是偶数,只有 n = 0 时, 6 n + 2 = 2 才是素数 6n+2是偶数,只有n=0时,6n+2=2才是素数 6n+2是偶数,只有n=0时,6n+2=2才是素数
6 n + 3 是 3 的倍数,只有 n = 0 时, 6 n + 3 = 3 才是是质数 6n+3是3的倍数,只有n=0时,6n+3=3才是是质数 6n+33的倍数,只有n=0时,6n+3=3才是是质数
6 n + 4 是偶数,且大于 2 ,不是质数 6n+4是偶数,且大于2,不是质数 6n+4是偶数,且大于2,不是质数
所以,当 n > 0 时, 6 n ± 1 是质数 所以,当n>0时,6n±1是质数 所以,当n>0时,6n±1是质数
证毕 . 证毕. 证毕.

bool isPrime(int n){
	if(n < 2) return false;
	if(n % 6 != 1 && n % 6 != 5) return false;
	for(int i = 5; i <= sqrt(n); i += 6) if(n % i == 0) return false;
	return true;
} 

方法5

埃拉托斯特尼筛法
Eratosthenes筛选
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n, p = 0;//p:素数的个数 
	cin >> n;
	bool is_prime[n + 5];//标记是否为素数 
	int prime[n + 5];//prime[p]:第p位素数 
	for(int i = 0; i <= n; i++) is_prime[i] = true;
	is_prime[0] = is_prime[1] = false;
	for(int i = 2; i <= n; i++){
		if(is_prime[i] != 0){
			prime[p++] = i;
			for(int j = i + i; j <= n; j += i) is_prime[j] = false;
		}
	}
	return 0;
}

优化 1 优化1 优化1
只筛奇数 只筛奇数 只筛奇数
把 2 的倍数筛掉,直接让 i 从 3 开始循环每次加 2 把2的倍数筛掉,直接让i从3开始循环每次加2 2的倍数筛掉,直接让i3开始循环每次加2
这样做内存需求减半,操作大约也减半 这样做内存需求减半,操作大约也减半 这样做内存需求减半,操作大约也减半

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n, p = 1;//p:素数的个数 
	cin >> n;
	bool is_prime[n + 5];//标记是否为素数 
	int prime[n + 5];//prime[p]:第p位素数 
	for(int i = 0; i <= n; i++) is_prime[i] = true;
	is_prime[0] = is_prime[1] = false;
	prime[1] = 2;
	for(int i = 3; i <= n; i += 2){
		if(i % 2 != 0 && is_prime[i] != 0){
			prime[p++] = i;
			for(int j = i + i; j <= n; j += i) is_prime[j] = false;
		}
	}
	return 0;
}

优化 2 优化2 优化2
假设存在 x < i 2 ,不妨设 x = a × b ( a < b ) 假设存在x<i^2,不妨设x=a×b(a<b) 假设存在x<i2,不妨设x=a×b(a<b)
如果 a , b > i ,那么 a × b > i 2 ,与假设 x < i 2 矛盾 如果a,b>i,那么a×b>i^2,与假设x<i^2矛盾 如果a,b>i,那么a×b>i2,与假设x<i2矛盾
因此,有 a ≤ i 因此,有a≤i 因此,有ai
这意味着当我们循环 f o r 到 i 之前,就早已经将这个数 x 筛过 这意味着当我们循环for到i之前,就早已经将这个数x筛过 这意味着当我们循环fori之前,就早已经将这个数x筛过
所以我们优化从 i 2 开始标记 所以我们优化从i^2开始标记 所以我们优化从i2开始标记

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n, p = 1;//p:素数的个数 
	cin >> n;
	bool is_prime[n + 5];//标记是否为素数 
	int prime[n + 5];//prime[p]:第p位素数 
	for(int i = 0; i <= n; i++) is_prime[i] = true;
	is_prime[0] = is_prime[1] = false;
	prime[1] = 2;
	for(int i = 3; i <= n; i += 2){
		if(i % 2 != 0 && is_prime[i] != 0){
			prime[p++] = i;
			for(int j = i * i; j <= n; j += i) is_prime[j] = false;
		}
	}
	return 0;
}

优化 3 优化3 优化3
vector

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n, p = 1;//p:素数的个数 
	cin >> n;
	vector<int> prime;//prime[p]:第p位素数
	vector<bool> is_prime(n + 5, true);//标记是否为素数 
	is_prime[0] = is_prime[1] = false;
	prime.push_back(2);
	for(int i = 3; i <= n; i += 2){
		if(i % 2 != 0 && is_prime[i] != 0){
			prime.push_back(i);
			for(int j = i * i; j <= n; j += i) is_prime[j] = false;
		}
	}
	return 0;
}

优化 4 优化4 优化4
bitset
⚠ ⚠ b i t s e t 的大小得是确定的 bitset的大小得是确定的 bitset的大小得是确定的

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000000;
int main(){
	int n, p = 1;//p:素数的个数 
	cin >> n;
	vector<int> prime;//prime[p]:第p位素数
	bitset<MAXN + 5> is_prime; //标记是否为素数
	is_prime.set();//都标记为true 
	is_prime[0] = is_prime[1] = false;
	prime.push_back(2);
	for(int i = 3; i <= n; i += 2){
		if(i % 2 != 0 && is_prime[i] != 0){
			prime.push_back(i);
			for(int j = i * i; j <= n; j += i) is_prime[j] = false;
		}
	}
	return 0;
}

方法6

分块筛选

方法7

线性筛法
Euler 筛法
欧拉筛法

参考
https://blog.csdn.net/way_back/article/details/122760006

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

int main(){
    vector<int> prime(10000, 1);
    for(int i=2; i<100; i++){
        if(prime[i]){
            for(int j=i; i*j<10000; j++)
                prime[i*j] = 0;
        }
    }
    ifstream in("prime.txt");
    for(int k; in>>k && k>1 && k<10000; )
        cout << k << " is " << (prime[k] ? "":"not ") << "a prime." << endl;
    return 0;
}
bool isPrime4(int n) {
 bool yes = false;
 int num[SIZE] = { 0 };
 for (int i = 2; i < SIZE; i++) {
  if (!num[i]) {
   for (int j = i + i; j < SIZE; j += i) {
    num[j] = 1;
   }
  }
 }
 if (!num[n]) {
  yes = true;
 }
 return yes;
}
bool isPrime5(int n) {
 bool yes = false;
 int num[SIZE] = { 0 };
 if (n == 2) {
  yes = true;
 }
 else {
  for (int i = 0; i < SIZE; i++) {
   if (!num[i]) {
    for (int j = (2 * i + 3) * (2 * i + 3); j < (2 * SIZE + 3); j += 2 * (2 * i + 3)) {
     num[(j - 3) / 2] = 1;
    }
   }
  }
 }
 if ((n - 3) % 2 == 0) {
  if (!num[(n - 3) / 2]) {
   yes = true;
  }
 }
 return yes;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/904081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

No114.精选前端面试题,享受每天的挑战和学习

文章目录 vue3中的ref、toRef、toRefs说明下TS的优缺点说下函数式组件说下函数式编程 vue3中的ref、toRef、toRefs 下面是对Vue 3中的ref、toRef和toRefs进行比较的表格&#xff1a; reftoReftoRefs参数类型值类型或引用类型响应式对象响应式对象返回值Ref 对象Ref 对象响应式…

简单认识Docker的资源控制

文章目录 一、CPU资源限制1.设置CPU使用率上限2.设置CPU资源占用比&#xff08;设置多个容器才有效&#xff09;3.设置容器与CPU绑核 二、内存资源限制三、对磁盘I/O配额的限制 一、CPU资源限制 1.设置CPU使用率上限 Linux通过CFS&#xff08;Completely Fair Scheduler&#…

【简单认识Docker基本管理】

文章目录 一、Docker概述1、定义2.容器化流行的原因3.Docker和虚拟机的区别4.Docker核心概念 二、安装docker三、镜像管理1.搜索镜像2.下载&#xff08;拉取&#xff09;镜像3.查看已下载镜像4.查看镜像详细信息5.修改镜像标签6.删除镜像7.导出镜像文件和拉取本地镜像文件8.上传…

如何在Linux系统上搭建自己的FRP内网穿透

前言 我有一个1核1G的服务器有公网IP但是这个1核1G的服务器太垃圾了,几乎什么都跑不起来,不过网速还行,那我本地还有一个物理主机是一个4核4G的,那我就可以把这台主机安装上linux系统当成一个服务器来使用,然后把网络代理到公网IP上.使用内网穿透这篇文章也就出现了. FRP简介 F…

服务器CPU飚高排查

排查思路 当正在运行的Java服务导致服务器的CPU突然飙高时&#xff0c;我们该如何排查定位到哪个接口的哪行代码导致CPU飙高的问题呢&#xff1f;我主要提供两个方案&#xff1a; jstackarthas 准备工作 代码准备 现在需要准备一段可以让服务器CPU飙高的代码以及把代码部署…

鑫达惠购系统APP开发的功能架构介绍

鑫达惠购是一款新电商模式的购物分销系统&#xff0c;基于分销裂变的商业价值行为&#xff0c;快速地分享邀请用户注册。这个系统的模式有个特别的亮点&#xff0c;基于全网公排的模式快速推动用户在商城上的购买活动。 鑫达惠购客户端系统功能 包含的功能有&#xff1a;商城模…

memset の 那些事儿 (C++)

如果你在编程时开了一个数组 int a[100010] 这是后你想把他全部赋值为一个很大的值&#xff08;可能你用它来取min&#xff09; 这时候&#xff0c;应该这样写 for (int i 0; i < 100010; i ) a[i] 0x3f3f3f3f //0x3f3f3f3f 是一个比较接近int_max的一个数&#xff0…

机器学习笔记 - 使用VGG16深度学习模型进行图像相似度比较

一、简述 VGG16 是一个强大的预训练模型,可用于识别图像之间的相似性。通过使用该模型,我们可以从不同图像中提取高级特征并进行比较以识别相似性。该技术具有广泛的应用,从图像搜索和推荐系统到安全和监控。 在本文中,将利用该模型来查找两个图像之间的相似性。 …

Win11游戏高性能模式怎么开

1、点击桌面任务栏上的“开始”图标&#xff0c;在打开的应用中&#xff0c;点击“设置”&#xff1b; 2、“设置”窗口&#xff0c;左侧找到“游戏”选项&#xff0c;在右侧的选项中&#xff0c;找到并点击打开“游戏模式”&#xff1b; 3、打开的“游戏模式”中&#xff0c;找…

【汇编语言】栈及栈操作的实现

文章目录 栈结构栈操作栈的小结 栈结构 栈是一种只能在一端插入或删除的数据结构&#xff1b;栈有两个基本的操作&#xff1a;入栈和出栈&#xff1b; 入栈&#xff1a;将一个新的元素放到栈顶&#xff1b;出栈&#xff1a;从栈顶取出一个元素&#xff1b; 栈的操作规则&#…

单晶高温合金收获阶段性应用成果,科研人员已开展定向凝固实验

根据央视报道&#xff0c;中国科学院金属研究所的科研人员对从太空带回的铝硅合金样品进行了初步的解剖分析工作&#xff0c;并计划用不同的实验方法和合金材料继续开展相关实验工作&#xff0c;以进一步探索重力在单晶高温合金凝固过程中的具体作用及相关机理。 值得关注的是&…

ORB-SLAM2学习笔记9之图像帧Frame

先占坑&#xff0c;明天再完善… 文章目录 0 引言1 Frame类1.1 成员函数1.2 成员变量 2 Frame类的用途 0 引言 ORB-SLAM2学习笔记8详细了解了图像特征点提取和描述子的生成&#xff0c;本文在此基础上&#xff0c;继续学习ORB-SLAM2中的图像帧&#xff0c;也就是Frame类&#…

自我管理篇--工作做完了,我能不能到点就下班

以上简历模板资源的排版可能不是最优&#xff0c;但工作经历可以借鉴 工作做完了&#xff0c;我能不能到点就下班&#xff1f; 答案&#xff1a;是&#xff0c;每个人都是自由的 ​ 工作完了&#xff0c;我能不能准点下班&#xff0c;背后真正的问题是:你有没有找到那件让你愿意…

【算法——双指针】LeetCode 11 盛最多水的容器

题目描述&#xff1a; 解题思路&#xff1a; 如图所示&#xff1a; 1、我们考虑相距最远的两个柱子所能容纳水的面积。宽度是两根柱子之间的距离8&#xff1b;高度取决于两根柱子之间较短的那个&#xff0c;即左边柱子的高度3。水的面积就是3824。 2、如果选择固定一根柱子&…

【Linux】传输层协议:UDP和TCP

争做西格玛男人 文章目录 一、UDP协议1.端口号2.理解UDP报头3.UDP的特点&#xff08;面向数据报&#xff0c;全双工&#xff09; 二、TCP协议1.理解TCP报头某些TCP的策略1.1 TCP报头字段&#xff08;TCP的黏包问题&#xff09;1.2 网络协议栈和linux系统的联系&#xff08;以p…

SpringBoot + MyBatis-Plus构建树形结构的几种方式

1. 树形结构 树形结构&#xff0c;是指&#xff1a;数据元素之间的关系像一颗树的数据结构。由树根延伸出多个树杈 它具有以下特点&#xff1a; 每个节点都只有有限个子节点或无子节点&#xff1b;没有父节点的节点称为根节点&#xff1b;每一个非根节点有且只有一个父节点&a…

2023国赛数学建模A题思路模型代码汇总 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

econml介绍

EconML简介 EconML: A Python Package for ML-Based Heterogeneous Treatment Effects Estimation EconML是一个通过机器学习方法从观察数据中估计heterogeneous treatment effects的Python包。该软件包是微软研究院ALICE项目的一部分&#xff0c;目的是将最新的机器学习方法…

8.5.tensorRT高级(3)封装系列-基于生产者消费者实现的yolov5封装

目录 前言1. yolov5封装总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-基于生产者消费者实现的yolov5封装…

日撸java_day63-65

文章目录 Booster代码运行截图 Booster 代码 package machineLearning.adaboosting;import weka.core.Instances;import java.io.FileReader; import java.util.Arrays;/*** ClassName: WeightedInstances* Package: machineLearning.adaboosting* Description:Weighted inst…