数论——素数

转自:http://www.cnblogs.com/linyujun/p/5198832.html

整合:https://blog.csdn.net/x_i_y_u_e/article/details/46365549

素数

定义

除了1和它本身以外不再有其他的因数的数。也叫质数。

素数判定

根据素数的定义判定(复杂度$O(\sqrt{n})$)

代码如下

1 //素数
2 inline bool isPrime(const LL x) {
3     if (x <= 1)return false;
4     for (LL i = 2; i * i <= x; i++)if (x % i == 0)return false;
5     return true;
6 }

埃拉托斯特尼筛法

原理:如果找到一个质数,那么这个质数的倍数都不是质数。

这个方法能在 $O(n \ln \ln n)$ 的时间复杂度内筛选出 1~n 中的所有素数。示例图如下:

代码如下

 1 bool primes[maxN];
 2 inline void Eratosthenes(){
 3     For(i, 2, maxN) primes[i] = true;//先全部初始化为质数
 4     For(i, 2, maxN) {
 5         if(primes[i]){//如果i是质数
 6             for(int j = 2 * i; j < maxN; j += i){//从i的两倍开始的所有倍数
 7                 primes[j] = false;
 8             }
 9         }
10     }
11 }

原文地址:https://www.cnblogs.com/zaq19970105/p/10799564.html

时间: 2024-10-14 10:08:44

数论——素数的相关文章

HDU4497 GCD and LCM 数论 素数分解

题意很简单首先以前做最简单的LCM跟CGD的时候都知道先求出两个数A,B的最大公约数GCD,那么LCM可以利用  A*B/GCD来求得,这点一开始脑残了没想到,结果没有进行特盘所以错了,意思就是 题目给的L%G不为0的话就是无解,结果我给判其它的去了,肯定漏了些什么没有发现 然后对于 L/G进行素因子分解,同时任意的数都能够通过素因子分解来表示,所以三个解x,y,z也能分解 L/G = p1^q1*p2^q2.... x = p1^i1*... y = p1^j1*... z = p1^k1*.

数论-素数

    素数定义: 质数(prime number)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数.例 子:2.3.5.7.11.13.17.19. 素数一些性质: 质数p的约数只有两个:1和p: 任一大于1的自然数,要么本身是质数,要么可以分解为几个质数之积,这种分解是唯一的: 一个偶数可以写成两个合数之和,其中每一个合数都最多只有9个质因数: 一个偶数必定可以写成一个质数加上一个合成数,其中合数的因子个数有上界: 素数应用: 数学上来看,

hdu 4497 GCD and LCM 数论 素数分解

GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 1339    Accepted Submission(s): 607 Problem Description Given two positive integers G and L, could you tell me how many solutions of

数论 - 素数的运用 --- poj 2689 : Prime Distance

Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12512   Accepted: 3340 Description The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number th

总结:数论 素数

素数判定算法,经典的Rabin Miller测试,通过二次探测的方法,可以将其正确率上升到一个很高的高度. $O(1)$的快速乘. 在一些卡常数而且爆long long的取余问题中用到快速乘. 朴素的快速乘是$O(logn)$的,从而添加了不必要的复杂度. 爆long long的,实质上是取余的结果,在long long运算中只要不涉及除法,那么一直是对INF取余的结果,对答案没有干扰. 1 LL mul(LL a,LL b,LL mod){ 2 if(a<=(LL)(1e8) &&

数论——素数筛选法与整数的素因子分解

筛选法 求出n以内的素数,最快的应该是筛选法. 筛选法的思路是: 要求10000以内的素数,把1-10000都列出来,1不是素数,划掉:2是素数,所有2的倍数都不是素数,划掉:取出下一个幸存的数,划掉它的所有倍数:直到所有素数找完为止. 这种做法的空间复杂度是O(n),时间复杂度O(n/logn). 1 const int Max = 1000005; 2 bool prime[Max]={0};//0表示素数,1为非素数 3 4 //筛选n以内的素数 5 void getPrime(int n

P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib (数论—素数 + DFS)

这大概是我写的第一个DFS 题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说: 7 3 3 1 全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数. 7331 被叫做长度 4 的特殊质数.写一个程序对给定的肋骨的数目 N (1<=N<=8),求出所有的特殊质数.

数论——素数和反素数

素数 素数一般判定方法 bool isPrime(a) { if (a < 2) return 0; for (int i = 2; i * i <= a; ++i) if (a % i) return 0; return 1; } 但对于long long int的数,O(√n)的复杂度还是会时间超限. 此时要用Miller-Rabin 素性测试,但也只是极为可能是素数. 复杂度O(klog3n). #include <iostream> using namespace std

MillerRabin素性测试(数论:素数Template)

1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 #define random(a , b) ((a) + rand() % ((b) - (a) + 1)) 5 LL QuickPower(LL a , LL b , LL p) 6 { 7 LL yaoyuan = 1; 8 while(b) 9 { 10 if(b & 1) yaoyuan = yaoyuan * a % p; 1