判断素数的方法(全部方法)

article/2025/9/20 19:41:19

功能

最快、最合适地判断一个数为素数

说明

分为打表法单个判断法两类方法

打表法  是开始时将所有素数标记出来,适合多次调用判断,前两种属于打表法

单个判断法  则是只一个数一个数判断,适合少量判断来节省时间,后俩种属于单个判断法

四种方法:

方法一:素数筛(埃氏筛)(n<10^7)         

方法二:欧拉筛  (n<10^7)

方法三:遍历法    (n<10^9)

         方法四:Miller-Rabin算法 (n<10^18)


方法一:素数筛(埃氏筛)(n<10^7)         

          N只需等于MAX的一半(因为j从i*i开始),这个算最常用的

#define MAX 10000005
#define N 4000
int vis[MAX]={1,1};
void Prime(){for(int i=2;i<= N;i++){if(!vis[i]){for(int j=i*i;j<=MAX;j+=i)vis[j]=1;      //0为素数}}
}

     

 方法二:欧拉筛  (n<10^7)

           据说时间上接近O(n),实际上没有试过,空间复杂度基本一样

           但欧拉筛的过程可以得到其最小的素数因子,有的题要使用改进后的欧拉筛

const long long MAX=10000005;
int prime[MAX];
int vis[MAX]={1,1};
void Prime(){for (int i = 2;i <= MAX; i++) {if (!vis[i])prime[++prime[0]] = i;for (int j = 1; j <=prime[0] && i*prime[j] <=MAX; j++) {vis[i*prime[j]] = 1;       //1为素数if (i % prime[j] == 0)break;}}
}

方法三:遍历法    (n<10^9)

             最经典的方法,优化后,只需判断从2到\sqrt{n}即可

             虽然复杂度较大,但对于单个判断还是很适用的。范围判断也可以判断1-1e6的所有次数,一般是用的最多的

bool fin(int x)
{if(x==1) return false;for(int i=2;i*i<=x;i++)if(x%i==0) return false;return true;     //1为素数
}

 方法四:Miller-Rabin算法 (n<10^18)

              大概率地判断是否为素数                                                                                                                    详情见博客:Miller-Rabin算法

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
int prime[10]={2,3,5,7,11,13,17,19,23,29};
ll mul(ll a,ll b,ll c)     //快速积
{ll ans=0,res=a;while(b){if(b&1)ans=(ans+res)%c;res=(res+res)%c;b>>=1;}return (ll)ans;
}
ll qpow(ll a,ll b,ll c)     //快速幂
{ll ans=1,res=a;while(b){if(b&1)ans=mul(ans,res,c);res=mul(res,res,c);b>>=1;}return ans;
}
ll pri(ll x)     //判断素数,1为素数
{ll i,j,k;ll s=0,t=x-1;if(x==2)  return 1;if(x<2||!(x&1))  return 0;while(!(t&1)){s++;t>>=1;}for(i=0;i<10&&prime[i]<x;++i){ll a=prime[i];ll b=qpow(a,t,x);for(j=1;j<=s;++j){k=mul(b,b,x);if(k==1&&b!=1&&b!=x-1)return 0;b=k;}if(b!=1)  return 0;}return 1;
}

http://chatgpt.dhexx.cn/article/FatxmFap.shtml

相关文章

c语言判断素数(c语言判断素数)

C语言中素数判断 是素数就返回1&#xff0c;不是的话返回0。 int IsPrime(int n) int i; if (n 1 || n 2 || n 3 || n 5) return 1; else if (n % 2) for (i 3; i < n / 2 1; i 2) if (n % i 0) return 0; return 1; else return 0; } 代码如下&#xf…

C语言判断素数的三种方法 判断素数(质数)

题目&#xff1a; 方法一&#xff1a;在2到n-1之间任取一个数,如果n能被整除则不是素数&#xff0c;否则就是素数 代码示例如下&#xff1a; #include <stdio.h> int main() {int i,n;printf("Please input: ");scanf("%d",&n);for(i2;i<n-…

C语言判断素数(求素数)

C语言判断素数&#xff08;求素数&#xff09; 素数又称质数。所谓素数是指除了 1 和它本身以外&#xff0c;不能被任何整数整除的数&#xff0c;例如17就是素数&#xff0c;因为它不能被 2~16 的任一整数整除。 思路1)&#xff1a;因此判断一个整数m是否是素数&#xff0c;只需…

Flink自定义生成 Watermark

Watermark 策略简介 # 为了使用事件时间语义&#xff0c;Flink 应用程序需要知道事件时间戳对应的字段&#xff0c;意味着数据流中的每个元素都需要拥有可分配的事件时间戳。其通常通过使用 TimestampAssigner API 从元素中的某个字段去访问/提取时间戳。 时间戳的分配与 wat…

Flink学习:WaterMark

WaterMark 一、什么是水位线?二、案例分析三、如何生成水位线?(一)、在SourceFunction中直接定义Timestamps和Watermarks(二)、自定义生成Timstamps和Watermarks 一、什么是水位线? 通常情况下,由于网络或系统等外部因素影响,事件数据往往不能及时传输至Flink系统中,导致数…

flink watermark

flink1.12版本开始&#xff0c;事件事件作为默认的时间语义 watermark是flink逻辑时钟&#xff0c;不是真正意义上的表&#xff0c;而是靠着数据去推动它的时间不停的往前走 工厂生产的商品上面印有时间戳&#xff0c;八点到九点的商品要坐一班车运走&#xff0c;商品从生产到…

Flink WaterMark 详解

摘录仅供学习使用&#xff0c;原文来自&#xff1a; Flink详解系列之五--水位线&#xff08;watermark&#xff09; - 简书 1、概念 在Flink中&#xff0c;水位线是一种衡量Event Time进展的机制&#xff0c;用来处理实时数据中的乱序问题的&#xff0c;通常是水位线和窗口结合…

Flink:watermark

Table of Contents 三种时间概念 Processing time Event Time Ingestion time watermark 并行流的Watermarks 迟到的事件 watermark分配器 watermark的两种分配器 三种时间概念 在谈watermark之前&#xff0c;首先需要了解flink的三种时间概念。在flink中&#xff0c;…

Flink 水位线(Watermark)

文章目录 什么是水位线水位线的特性如何生成水位线Flink 内置水位线生成器自定义水位线策略在自定义数据源中发送水位线水位线的总结 在实际应用中&#xff0c;一般会采用事件时间语义。而水位线&#xff0c;就是基于事件时间提出的概念。一个数据产生的时刻&#xff0c;就是流…

vue -- watermark水印添加方法

作者&#xff1a;蛙哇 原文链接&#xff1a; https://segmentfault.com/a/1190000022055867 来源&#xff1a;segmentfault 前言 项目生成公司水印是很普遍的需求&#xff0c;下面是vue项目生产水印的方法。话不多说&#xff0c;复制粘贴就可以马上解决你的需求。 步骤1 创建…

tp-watermark.js网页添加水印插件

tp-watermark.js网页添加水印插件 作者&#xff1a;鹏仔先生 上周五&#xff0c;出差去改上个前端遗留的小问题&#xff0c;用到了watermark.js这个网站添加水印插件&#xff0c;功能很简单&#xff0c;就是给网页添加个水印&#xff0c;我看了下网上&#xff0c;有很多种&…

实用有效!React项目中使用watermark.js添加水印效果

为了避免公司的内部文档被截图外泄&#xff0c;有必要在系统页面上面增加水印。 第一步&#xff1a; 下载依赖包&#xff1a; npm install watermark-dompackage.json中会添加一个依赖如下&#xff1a; "watermark-dom": "^2.3.0"第二步&#xff1a; 引…

Flink之水位线(Watermark)

在流数据处理应用中&#xff0c;一个很重要、也很常见的操作就是窗口计算。所谓的“窗口”&#xff0c;一般就是划定的一段时间范围&#xff0c;也就是“时间窗”&#xff1b;对在这范围内的数据进行处理&#xff0c;就是所谓的窗口计算。所以窗口和时间往往是分不开的。接下来…

水印watermark

第一步:npm获取水印组件包 npm install watermark-dom 第二步:引入水印模块 import watermark from ‘watermark-dom’ 或者 var watermarkDom require(“watermark-dom”) 根据业务需要&#xff0c;我是登入之后的页面才有水印&#xff0c;前者我是放在验证用户登录状态js文件…

Flink流计算编程--watermark(水位线)简介

1、watermark的概念 watermark是一种衡量Event Time进展的机制&#xff0c;它是数据本身的一个隐藏属性。通常基于Event Time的数据&#xff0c;自身都包含一个timestamp&#xff0c;例如1472693399700&#xff08;2016-09-01 09:29:59.700&#xff09;&#xff0c;而这条数据…

Flink之watermark(水印)讲解

flink中watermark的详细介绍 使用前提&#xff1a; 处理数据开窗&#xff0c;处理数据的时间语义是事件时间&#xff0c;也就是每条数据产生的时间。 使用场景&#xff08;解决问题&#xff09;&#xff1a; 处理乱序数据&#xff1a;flink中是实时处理数据&#xff0c;但是…

WaterMark使用和详解

上篇&#xff1a;基于flink的会话窗口的api实现 WaterMark翻译为水位线&#xff0c;什么时候用到水位线呢&#xff1f; 比如说水控在顺水的时候达到紧梯就会触发&#xff0c;若不放水就可以发现危险的现状 在spark程序划分成窗口的时候&#xff0c;主要是衡量什么时候触发&am…

【大数据】带你理解并使用flink中的WaterMark机制

文章目录 一、引导二、WaterMark1、Watermark的原理2、Watermark 的使用2.1、顺序数据流中的watermark示例 2.2、乱序数据流中的WaterMark2.2.1、With Periodic&#xff08;周期性的&#xff09; Watermark示例一&#xff1a;使用周期性的WaterMark2.2.2、With Punctuated&…

JavaEE是什么?JavaSE又是什么?两者的区别有哪些?

Java作为最流行的编程语言受到了许多人的喜爱&#xff0c;其在编程中的地位自不必多说。对于许多才刚刚入门Java的朋友来讲&#xff0c;常常会产生这样的困惑&#xff0c;JavaEE是什么&#xff1f;JavaSE又是什么&#xff1f;两者的区别有哪些&#xff1f;学哪个比较好&#xf…

php mysql Javaee_javaee与php的区别是什么

javaee与php的区别&#xff1a;1、JavaEE是门面向对象的程序设计语言&#xff0c;而PHP是解释执行的服务器脚本语言&#xff1b;2、用JavaEE开发的Web应用从MySQL数据库转到Oracle数据库只需要做很少的修改&#xff0c;而PHP则需要做大量的修改工作。 javaee与php的区别&#x…