小素数,大智慧

小素数,大智慧

  • 定义
  • 判断方法
    • 方法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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ES6自用笔记

目录 原型链 引用类型&#xff1a;__proto__(隐式原型)属性&#xff0c;属性值是对象函数&#xff1a;prototype(原型)属性&#xff0c;属性值是对象 相关方法 person.prototype.isPrototypeOf(stu) Object.getPrototypeOf(Object)替换已不推荐的Object._ _ proto _ _ Ob…

易服客工作室:Uncode主题 - 创意和WooCommerce WordPress主题

Uncode主题是一款像素完美的创意 WordPress 主题&#xff0c;适用于任何类型的网站&#xff08;作品集、代理机构、自由职业者、博客&#xff09;&#xff0c;也是适用于商店&#xff08;电子商务、在线商店、企业&#xff09;的顶级 WooCommerce 主题。Uncode 的设计非常注重细…

21.1 CSS 文字样式

1. 字体倾斜 font-style属性: 为文本设置字体样式.常用取值: normal: 正常显示文本. 快捷键: fstab. italic: 显示斜体文本. 快捷键: fsntab.<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>fo…

matlab中exp和expm的区别

exp()为数组 X 中的每个元素返回指数 e x e^{x} ex expm()计算 X 的矩阵指数。 两个函数传入矩阵后计算的结果是不同的&#xff0c;千万不能混淆。之前曾经想当然得把exp里传入矩阵当矩阵指数使用&#xff0c;也未验证正确性&#xff0c;实不应该。

深入理解 Flutter 图片加载原理 | 京东云技术团队

前言 随着Flutter稳定版本逐步迭代更新&#xff0c;京东APP内部的Flutter业务也日益增多&#xff0c;Flutter开发为我们提供了高效的开发环境、优秀的跨平台适配、丰富的功能组件及动画、接近原生的交互体验&#xff0c;但随之也带来了一些OOM问题&#xff0c;通过线上监控信息…

【leetcode 力扣刷题】快乐数/可被k整除的最小整数(可能存在无限循环的技巧题)

可能存在无限循环的技巧题 202. 快乐数数学分析 1015. 可被k整除的最小整数数学分析 202. 快乐数 题目链接&#xff1a;202. 快乐数 题目内容&#xff1a; 理解题意&#xff0c;快乐数就是重复每位数的平方之和得到的新数的过程&#xff0c;最终这个数能变成1。变成1以后&…

docker的资源控制及数据管理

docker的资源控制及docker数据管理 一.docker的资源控制 1.CPU 资源控制 1.1 资源控制工具 cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被 namespace 隔离起来的资源&#xff0c; 还可以为资源设置权重、计算使用量、操控进程启停等等。 …

HTML中的字符串转义

为什么要转义&#xff1f; 转义可以防止 xss 攻击。接下来&#xff0c;我们来看一下如何转义。 HTML Sanitizer API Sanitizer 是浏览器自带的转义方法&#xff0c;在2021年初被提出&#xff0c;兼容性问题很大。 列举几个常用的 API&#xff1a; const $div document.qu…

Python批量爬虫下载文件——把Excel中的超链接快速变成网址

本文的背景是&#xff1a;大学关系很好的老师问我能不能把Excel中1000个超链接网址对应的pdf文档下载下来。虽然可以手动一个一个点击下载&#xff0c;但是这样太费人力和时间了。我想起了之前的爬虫经验&#xff0c;给老师分析了一下可行性&#xff0c;就动手实践了。    没…

【网络架构】华为hw交换机网络高可用网络架构拓扑图以及配置

一、网络拓扑 1.网络架构 核心层:接入网络----路由器 汇聚层:vlan间通信 创建vlan ---什么是vlan:虚拟局域网,在大型平面网络中,为了实现广播控制引入了vlan,可以根据功能或者部门等创建vlan,再把相关的端口加入到vlan.为了实现不用交换机上的相同vlan通信,需要配置中继,为了…

《HeadFirst设计模式(第二版)》第八章代码——模板方法模式

代码文件目录&#xff1a; CaffeineBeverage package Chapter8_TemplateMethodPattern;/*** Author 竹心* Date 2023/8/17**/public abstract class CaffeineBeverage {final void prepareRecipe(){boilWater();brew();pourInCup();//这里使用钩子customerWantsCondiments()来…

FPGA:uart原理+tx发送模块+rx接收模块

文章目录 一、串口通信二、UART通信三、tx发送模块四、rx模块接收 一、串口通信 处理器与外部设备通信的两种方式&#xff1a; 串行通信&#xff1a; 指数据的各个位使用多条数据线同时进行传输。 并行通信&#xff1a; 将数据分成一位一位的形式在一条数据线上逐个传输。 串…

Dodaf架构的学习分享

一.Dodaf的内容 Dodaf的背景 DODAF&#xff08;Department of Defense Architecture Framework&#xff09;起源于美国国防部&#xff0c;是一个用于支持复杂系统设计、规划和实施的架构框架。以下是DODAF的背景和起源&#xff1a; 复杂系统需求&#xff1a;在军事和国防领域&…

stm32单片机开关输入控制蜂鸣器参考代码(附PROTEUS电路图)

说明&#xff1a;这个buzzer的额定电压需要改为3V&#xff0c;否则不会叫&#xff0c;源代码几乎是完全一样的 //gpio.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file gpio.c* brief Thi…

idea新建web项目

步骤一 步骤二 步骤三 新建两个目录lib、classes 步骤四 设置两个目录的功能lib、classes 步骤五 发布到tomcat

网络编程面试笔试题

一、OSI 7层模型&#xff0c;TCP/IP 4层模型 5层模型。 以及每一层的功能&#xff08;重点&#xff1a;第三层 第四层&#xff09; 答&#xff1a; 7层模型&#xff08;①物理层&#xff1a;二进制比特流传输&#xff0c;②数据链路层&#xff1a;相邻结点的可靠传输&#xf…

选择大型语言模型自定义技术

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 企业需要自定义模型来根据其特定用例和领域知识定制语言处理功能。自定义LLM使企业能够在特定的行业或组织环境中更高效&#xff0c;更准确地生成和理解文本。 自定义模型使企业能够创建符合其品牌…

“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会顺利召开

研讨会主题 8月10日&#xff0c;“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定&#xff08;专家建议稿&#xff09;》研讨会在浙江大学计算机创新技术研究院举办。 本次研讨会的主题聚焦于“智能网联汽车的数据安全与数据合规”&#xff0c;邀请行业主管部门和数据…

近 2000 台 Citrix NetScaler 服务器遭到破坏

Bleeping Computer 网站披露在某次大规模网络攻击活动中&#xff0c;一名攻击者利用被追踪为 CVE-2023-3519 的高危远程代码执行漏洞&#xff0c;入侵了近 2000 台 Citrix NetScaler 服务器。 研究人员表示在管理员安装漏洞补丁之前已经有 1200 多台服务器被设置了后门&#x…

Fork/Join框架

是什么 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架&#xff0c;是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 Fork: 把一个大任务切分为若干子任务并行的执行 Join: 合并这些子任务的执行结果&#xff0c;最后…