小素数,大智慧

小素数,大智慧

  • 定义
  • 判断方法
    • 方法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.rhkb.cn/news/98103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S用户管理体系介绍

1 K8S账户体系介绍 在k8s中&#xff0c;有两类用户&#xff0c;service account和user&#xff0c;我们可以通过创建role或clusterrole&#xff0c;再将账户和role或clusterrole进行绑定来给账号赋予权限&#xff0c;实现权限控制&#xff0c;两类账户的作用如下。 server acc…

ListNode相关

目录 2. 链表相关题目 2.1 合并两个有序链表&#xff08;简单&#xff09;&#xff1a;递归 2.2 删除排序链表中的重复元素&#xff08;简单&#xff09;&#xff1a;一次遍历 2.3 两链表相加&#xff08;中等&#xff09;&#xff1a;递归 2.4 删除链表倒数第N个节点&…

ARM--day4(电灯实验、分析RCC、GPIO控制器,PMOS管、NMOS管的基本原理)

电灯实验代码&#xff1a; .text .global _start _start: /**********LED1点灯**************/RCC_INIT:1.使能GPIOE组控制器&#xff0c;通过RCC_AHB4ENSETR寄存器设置第&#xff3b;5:4&#xff3d;位写&#xff11;---->0x50000A28[4]1ldr r0,0x50000A28ldr r1,[r0]orr…

京东门详一码多端探索与实践 | 京东云技术团队

本文主要讲述京东门详业务在支撑过程中遇到的困境&#xff0c;面对问题我们在效率提升、质量保障等方向的探索和实践&#xff0c;在此将实践过程中问题解决的思路和方案与大家一起分享&#xff0c;也希望能给大家带来一些新的启发 一、背景 1.1、京东门详介绍 1.1.1、京东门…

【MySQL】索引

本期我们好好唠唠索引 目录 一、索引的概念 二、索引的重要性 三、对于索引的理解 3.1 MySQL与磁盘交互的基本单位page 3.2 MySQL中的数据交互过程 3.3 索引建立的过程 3.3.1 page的存储形式 3.3.2 B树的形成 3.4 为什么不用其他数据结构来建立索引 四、聚簇索引和非…

Python tkinter Notebook标签添加关闭按钮元素,及左侧添加存储状态提示图标案例,类似Notepad++页面

效果图展示 粉色框是当前页面&#xff0c;橙色框是鼠标经过&#xff0c;红色框是按下按钮&#xff0c;灰色按钮是其他页面的效果&#xff1b; 存储标识可以用来识别页面是否存储&#xff1a;例如当前页面已经保存用蓝色&#xff0c;未保存用红色&#xff0c;其他页面已经保存用…

【力扣】42. 接雨水 <模拟、双指针、单调栈>

【力扣】42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 目录 【力扣】42. 接雨水题解暴力双指针单调栈 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…

数据结构<树和二叉树>顺序表存储二叉树实现堆排

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

c语言实现MD5算法

MD5加密 文章目录 MD5加密MD5介绍应用场景代码分析 &#xff08;基于qt5.14.2&#xff09;测试记录 MD5介绍 1。 一种单向加密算法&#xff0c;即对明文加密&#xff0c;而不能通过密文得到明文。对原数据的任何改动&#xff0c;哪怕是1字节&#xff0c;得到的MD5值都有很大的区…

vue路由及打包部署

vue路由&#xff08;前端路由&#xff09;&#xff1a;URL中的hash&#xff08;#号&#xff09;与组件之间的对应关系。 一、安装vue路由 npm install vue-router3.5.1 二、定义路由表 路由表主要记录hash&#xff08;#号&#xff09;与组件之间的对应关系。主要定义在route…

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

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

SQL Injection

SQL Injection 就是通过把恶意的sql命令插入web表单递交给服务器&#xff0c;或者输入域名或页面请求的查询字符串递交到服务器&#xff0c;达到欺骗服务器&#xff0c;让服务器执行这些恶意的sql命令&#xff0c;从而让攻击者&#xff0c;可以绕过一些机制&#xff0c;达到直…

sql server安装报错 合成活动模板库(ATL) 失败

错误 “合成活动模板库(ATL) 规则失败“ 解决办法&#xff1a; 进入SQL Server 2008R2安装包目录找到文件&#xff1a;sqlsupport_msi&#xff0c;安装此文件之后&#xff0c;再安装SQL Server&#xff0c;便可解决该问题。C:\SQL Server 2008R2\new\SQL Server 2008R2\2052_CH…

Java虚拟机(JVM):虚拟机栈溢出

一、概念 Java虚拟机栈溢出&#xff08;Java Virtual Machine Stack Overflow&#xff09;是指在Java程序中&#xff0c;当线程调用的方法层级过深&#xff0c;导致栈空间溢出的情况。 Java虚拟机栈是每个线程私有的&#xff0c;用于存储方法的调用和局部变量的内存空间。每当…

如何学习专业的学术用语01

问题的提出——凭啥人家写的词汇这么专业 做法一 做法二&#xff1a;做一个专业数据库 专门做教育技术类的

Android Ble蓝牙App(六)请求MTU与显示设备信息

前言 在上一篇文章中已经了解了数据操作的方式&#xff0c;而数据交互的字节长度取决于我们手机与蓝牙设备的最大支持长度。 目录 Ble蓝牙App&#xff08;一&#xff09;扫描Ble蓝牙App&#xff08;二&#xff09;连接与发现服务Ble蓝牙App&#xff08;三&#xff09;特性和属…

unity 之 Vector 数据类型

文章目录 Vector 1Vector 2Vector 3Vector 4 Vector 1 在Unity中&#xff0c;Vector1 并不是一个常见的向量类型。 如果您需要表示标量&#xff08;单个值&#xff09;或者只需要一维的数据&#xff0c;通常会直接使用浮点数&#xff08;float&#xff09;或整数&#xff08;in…

Linux命令200例:tail用来显示文件的末尾内容(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

【ARM】Day4 点亮LED灯

1. 思维导图 2. 自己编写代码实现三盏灯点亮 .text .global _start _start: /**********LED1&#xff0c;LED2,LED3点灯:PE10,PF10,PE8**************/ RCC_INIT:使能GPIOE组/GPIOF组控制器,通过RXCC_MP_AHB4ENSETR设置第[5:4]位写1,地址:0x50000A28[5:4]1ldr r0,0x50000A28 …

【深入探究人工智能】:常见机器学习算法总结

文章目录 1、前言1.1 机器学习算法的两步骤1.2 机器学习算法分类 2、逻辑回归算法2.1 逻辑函数2.2 逻辑回归可以用于多类分类2.3 逻辑回归中的系数 3、线性回归算法3.1 线性回归的假设3.2 确定线性回归模型的拟合优度3.3线性回归中的异常值处理 4、支持向量机&#xff08;SVM&a…