判断素数

线性筛法 素数判断优化

China☆狼群 提交于 2020-04-04 06:50:31
   判断素数: 普通的就不说了 一种更高效的做法: 结论是:大于等于5的质数一定和6的倍数相邻 令 x≥1 x ≥ 1,将大于等于 5 5的自然数表示如下: ......6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1...... . . . . . . 6 x − 1 , 6 x , 6 x + 1 , 6 x + 2 , 6 x + 3 , 6 x + 4 , 6 x + 5 , 6 ( x + 1 ) , 6 ( x + 1 ) + 1 . . . . . . 可以看到,不在6的倍数两侧,即 6x 6 x两侧的数为 6x+2,6x+3,6x+4... 6 x + 2 , 6 x + 3 , 6 x + 4 . . .由于 2(3x+1),3(2x+1),2(3x+2), 2 ( 3 x + 1 ) , 3 ( 2 x + 1 ) , 2 ( 3 x + 2 ) , 所以它们一定不是素数,再除去 6x 6 x本身,显然,素数要出现只可能出现在 6x 6 x的相邻两侧。 所以,基于以上条件,我们假如要判定的数为 n n,则 n n必定是 6x-1 6 x − 1或 6x+1 6 x + 1的形式,对于循环中 6i-1 6 i − 1, 6i 6 i, 6i+1 6 i + 1, 6i+2,6i+3,6i+4 6 i + 2 , 6

素数线性筛优化

时光总嘲笑我的痴心妄想 提交于 2020-04-04 06:26:16
大致思路:   初始时,令2是素数,假设2之后奇数全部数都是素数(偶数不考虑会快一点点),从3开始每当找到一个素数时,显然这个素数乘上另外一个数之后都是合数,把这些合数都筛掉,直到最后一个奇数超出范围,剩下的都是奇数都是素数。   注:以下代码只为得到n以内的素数,所以执行后标记数组中的标记是不完整的,如函数1和2中的isPrime[4]=1显然是错的,不过这对prime数组没有影响。如果想使标记数组完整,请自行修改。 前提: 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int MN=1e+8; 5 bool isPrime[MN];//isPrime[i]:i是否素数 6 int prime[MN/10];//prime[i]:第i个素数 1.普通筛法: 1 int makePrime1(int n)//求n以内的素数,返回得到的素数个数,下同 2 { 3 memset(isPrime,1,sizeof(isPrime)); 4 memset(prime,0,sizeof(prime)); 5 // 6 prime[1]=2; 7 int cnt=1; 8 for(long long i=3;i<=n;i+=2) 9 { 10 if(isPrime[i]) 11 { 12 prime[++cnt]=i;

米勒罗宾素数判定法

十年热恋 提交于 2020-04-04 06:22:54
说明 :根据费马小定理做的,时间复杂度很低。但是有一定概率判断出错,一般count==5时判断几率有99%。 代码 #include<cstdlib> #include<ctime> #include<cstdio> using namespace std; const int count=10; //提高判断精确度 int modular_exp(int a,int m,int n) { if(m==0) return 1; if(m==1) return (a%n); long long w=modular_exp(a,m/2,n); w=w*w%n; if(m&1) w=w*a%n; return w; } bool Miller_Rabin(int n) { if(n==2) return true; for(int i=0;i<count;i++) { int a=rand()%(n-2)+2; if(modular_exp(a,n,n)!=a) return false; } return true; } int main() { srand(time(NULL));//随机数种子 int n; while(~scanf("%d",&n)) { if(Miller_Rabin(n)) printf("YES\n"); else printf("NO\n"); }

【模板】线性筛素数

流过昼夜 提交于 2020-04-04 06:15:04
【模板】线性筛素数 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N、M,分别表示查询的范围和查询的个数。 接下来M行每行包含一个不小于1且不大于N的整数,即询问该数是否为质数。 输出格式: 输出包含M行,每行为Yes或No,即依次为每一个询问的结果。 输入输出样例 输入样例#1: 100 5 2 3 4 91 97 输出样例#1: Yes Yes No No Yes 说明 时空限制:500ms 128M 数据规模: 对于30%的数据:N<=10000,M<=10000 对于100%的数据:N<=10000000,M<=100000 样例说明: N=100,说明接下来的询问数均不大于100且不小于1。 所以2、3、97为质数,4、91非质数。 故依次输出Yes、Yes、No、No、Yes。 #include<iostream> #include<algorithm> #include <cstring> #include<vector> #include<math.h> using namespace std; int su[10000010];//素数表,默认为0,值为0代表是素数,值为1代表不是素数 bool out[10000010];//判断素数,默认为false 如果值为true

质因数分解的rho以及miller-rabin

為{幸葍}努か 提交于 2020-04-04 06:10:55
一、前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题。我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法,rho启发式搜索质因数分解算法等。在此文里,我要介绍的就是miller-rabin算法以及rho启发式搜索分解算法。 二、算术基本定理 首先,我们得知道,任意一个大于1的自然数都可以分解为有限个质数的乘积。这里因子均为质数,且为正整数。我们把这样的分解成为N的标准分解式。关于算数基本定理的应用有许多,例如可以证明素数无限,定义god,lcm等,在此不一一赘述。有了算数基本定理,我们可以发现计算数论函数,约数和等都是十分方便的,这大大的方便了我们的解题。接下来我们介绍如何来分解质因数。 三、质因数分解的算法 所谓质因数,是某自然数的因素而且这个因素还得是质数。 我们不难想到基本的枚举,即暴力枚举1~n所有数,判断是否能够被n整除且该数是否为质数。大概代码如下: For i:=1 to n do If n mod i=0 then If check(i) then //check为检验i是否为质数的子函数,返回值为boolean Writeln(i); Function check(n:longint):boolean; Var i:longint; begin For i:=2 to n

POJ 2689.Prime Distance-区间筛素数

北战南征 提交于 2020-04-04 03:24:54
最近改自己的错误代码改到要上天,心累。 这是迄今为止写的最心累的博客。 Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18707 Accepted: 4998 Description The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousands of years is the question of primality. A prime number is a number that is has no proper factors (it is only evenly divisible by 1 and itself). The first prime numbers are 2,3,5,7 but they quickly become less frequent. One of the interesting questions is how dense they are in various ranges.

python流程控制

青春壹個敷衍的年華 提交于 2020-03-29 16:23:47
流程控制概念 什么是流程控制? 所谓的流程控制是计算机运算领域的用语意指在程序运行时个别的指令(或是陈述 子程序)运行或求值的顺序不论是在声明式编程语言还是函数式编程语言都有类似的概念 关于声明式编程语言和函数式编程语言详解 以上是官方的解释,我们列举一个现实中的实例来具体说明一下 假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动机的。你要判断那条岔路是你真正要走的路,如果我们想让程序也能处理这样的判断怎么办? 很简单,只需要在程序里预设一些条件判断语句,满足哪个条件,就走哪条岔路。这个过程就叫流程控制。 if...else 语句 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性。须重要理解,if、while、for以及与它们相搭配的 else、 elif、break、continue和pass语句 详解 if语句 Python中的if子句由三部分组成:关键字本身、用于判断结果真假的条件表达式以及当表达式为真或者非零时执行的代码块。if 语句的语法如下: if 执行条件: 执行体 if语句有三种形式: 单分支 if 条件: 满足条件后要执行的代码 双分支 语法: if 条件: 满足条件执行代码 else: if条件不满足就走这段 实例: Name = 'yefei' if

素数筛

折月煮酒 提交于 2020-03-27 06:03:47
摘自博客: https://blog.csdn.net/qq_39826163/article/details/81395306 一、一般筛素数(埃拉托斯特尼筛法) 此筛选法的时间复杂度是O(nloglogn) //埃氏筛 bool prime[maxn+5] void getprime() //筛选maxn以内的素数 { int tot=0; memset(prime,true,sizeof(prime)); prime[0]=prime[1]=0; for(int i=2;i<=sqrt(maxn);i++) { if(prime[i]) { for(int j=i*i;j<=maxn;j+=i) prime[j]=0; //i是素数,则下一个起点是i*i,把后面的所有的i*i+2*n*i筛掉 } } } 这种方法比较好理解,初始时,假设全部都是素数,当找到一个素数时,显然这个素数乘上另外一个数之后都是合数(注意上面的 i*i , 比 i*2 要快点 ),把这些合数都筛掉。 但仔细分析能发现,这种方法会造成重复筛除合数,影响效率。比如10,在i=2的时候,k=2*15筛了一次;在i=5,k=5*6 的时候又筛了一次。所以,也就有了快速线性筛法。 二、线性筛素数(欧拉筛法) 线性筛,复杂度为O(n)。与埃氏筛相比,不会对已经被标记过的合数再进行重复标记,故效率更高

SCAU 8614 素数

孤街浪徒 提交于 2020-03-26 12:40:36
8614 素数 时间限制:500MS 内存限制:1000K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 数学对于计算机学是很重要的,大一的高数就曾经(或即将)令一批又一批人饮恨。这里就是一个数学问题,当然,它不需要用到高深的高数知识。 给出n(1<=n<=100000),问1到n之间有几个素数。 Input 第1行,1个整数T(T<=100000),表示共有T组测试数据 第2---第T+1行,每行1个整数,表示测试数据n Output 对于每个测试数据,输出1行,每行1个数,表示1到n之间的素数个数 Sample Input 5 1 2 100 1000 5000 Sample Output 0 1 25 168 669 Source 白衣人 Provider admin #include <stdio.h> #include <string.h> int prime[100001]; int cnt[100001]; int main() { int i,j,t; memset(prime,0,sizeof(prime)); memset(cnt,0,sizeof(cnt)); prime[0]=prime[1]=1; for(i=2;i<100000;i++) if(prime[i]==0){ for(j=i+i;j<100001;j+

《信息安全数学基础一》第一章笔记

被刻印的时光 ゝ 提交于 2020-03-26 03:15:25
《信息安全数学基础一》第一章笔记 目录 《信息安全数学基础一》第一章笔记 整除 素数,合数 素数判别 筛法 埃式筛 欧拉筛 进制转换 最大公因数与最小公倍数 欧几里得算法 贝祖等式 拓展欧几里得算法 算术基本定理 整除 定义 在整数域内,若 \(a = q\cdot b\) ,则 \(b\) 整除 \(a\) ,记作 \(a | b\) 性质 若 \(a | b,\ b | c\) ,则 \(a | c\) 若 \(c | a_{i},\ i = 1,\ 2,\ ..,\ n\) 则 \(c\) 也整除 \(a_{i}\) 的线性组合 素数,合数 素数定义 除了 \(1\) 和自身外,没有因数的数,称之为素数,也称为质数,其他数被称为合数。 \(2\) 是最小的素数 素数判别 一个定理 对于合数 \(n\) ,必然存在不超过 \(\sqrt{n}\) 的质因子。 设 \(n = pq\) ,设 \(p\) 是最小因子,则 \(p\leq q\) 则 \(n = pq \geq p^{2}\) 所以 \(p\leq \sqrt{n}\) 假设 \(p\) 是合数,则可以继续进行分解,与题设不符,所以 \(p\) 是质数。 定理推论 对于一个数 \(n\) ,若其不存在不超过 \(\sqrt{n}\) 的质因子,那么其为素数。 素数平凡判别 枚举 \(2-\sqrt{n}\) 内的素数