素数:只能除以1和自身的数(需要大于1)就是素数,又叫质数。

方法

  1. 从2开始一直除到该数之前的那个自然数,如果有能被整除的就不是素数
bool isPrime(int n) {if (n == 1) {return false;}if (n == 2) {return true;}for (int i = 2; i <n ; ++i) {if (n % i== 0) {return false;}}return true;
}
  1. 假设 d 为 n 的约数,那么 n/d 也是 n 的约数,因为有: n = d * (n/d),即:min(d, n/d) <= sqrt(n),因此我们只要检测 2 ~ sqrt(n) 范围内所有的整数就可以了,
bool isPrime(int n) {if (n == 1) {return false;}if (n == 2) {return true;}for (int i = 2; i <= sqrt(n); i++) {if (n % i== 0) {return false;}}return true;
}
  1. 如果不能被 2 整除,那么 n 即为奇数,判断其是否能被奇数整除就好了,因此循环的范围就可以减小为 [3, sqrt(n)]内的奇数
bool isPrime(int n) {    if (n == 2) {                               // 2 是素数return true;}if (n != 2 && n % 2 == 0) {               // 如果能被 2 整除,证明 n 不是素数(2 本身除外) return false;}// 如果不能被 2 整除,那么 n 即为奇数,判断其是否能被奇数整除,前面我们已经处理了 2 和 2 的倍数,因此这个循环的范围就是 [3, sqrt(n)]内的奇数for (int i = 3; i <= sqrt(n); i += 2) {     //i <= sqrt(n); 可以换成i*i<n。为什么加2,因为能被偶数整除的,一定能被2整除。上面已经讨论过了if (n % i == 0) {return false;}}
}

上面的其实是之前我写过的,用的c++,回文字符串判断、素数的判断、求最大公约数最小公倍数(c++)我懒得改了,下面的会用一些 python 的

  1. 既然可以通过除以 2 这个素数来先排除一半 ,那么我已可以除以其他的3、5、7、11来再排除一些嘛
def isPrime(n):if n <= 1:return Falseelif n % 2 == 0 and n != 2:     # 去除能被2整除的  不包括2return Falseelif n % 3 == 0 and n != 3:     # 去除能被3整除的  不包括3return Falseelif n % 5 == 0 and n != 5:     # 去除能被5整除的  不包括5return Falseelif n % 7 == 0 and n != 7:     # 去除能被7整除的  不包括7return Falseelse:for i in range(3, int(math.sqrt(n)) + 1, 2):   # 这里 +1是因为range不含end值,是个左闭右开的(start,end)if n % i == 0:return Falsereturn True
  1. 6倍原理。所有的素数都在6的倍数的左侧或者右侧,也即num % 6 == 1 || num % 6 == 5,不满足者不是素数,满足者继续验证,步骤如下
  • 对于1,2,3三个数字特殊处理
  • 所有的素数都在6的倍数的左侧或者右侧,也即num % 6 == 1 || num % 6 == 5,不满足者不是素数,满足者继续验证
  • 计算sqrt(num),从5,11,17,23…开始验证,每次验证i和i+2,一旦整除,不是素数多次筛的时候可以打表。
           
            注意: 只有6的倍数附近的数才有可能是质数。为什么说可能是质数的,我举个反例,25,35,49。。。
bool isPrime(int n) {if (n == 2 || n == 3) {            // 先排除2、3这两个特例 return true;}if (n % 6 != 1 && n % 6 != 5) {    //如果不在6的倍数附近,肯定不是素数return false;} for (int i = 5; i <= sqrt(n); i += 6) {   //对6倍数附近的数进行判断if (n % i == 0 || n % (i + 2) == 0) {return false;}}return true;
}
  1. 费马素性检验,基于费马小定理。缺点:在 232以内,这种方法的准确性尚可接受,但到了 264级别,出错的概率就太高了。

费马小定理wiki

假如a是一个整数,p是一个质数,那么 ap - a 是p 的倍数
       
那么反过来呢?如果存在某个 ap - a 是p 的倍数,是否就能判定 p 是素数呢?并不行,
       
例如 2341 - 2 是341 的倍数,但 341 是合数;再比如 31105 - 3 是 1105的倍数,但 1105 是合数;这类合数被称为费马伪素数。
       
不过幸好,一个合数是费马伪素数的概率并不是很高。所以我们可以多测试几个 a,只要有一个a不满足,就说明即可说明 p 不是素数。
       
都成立,那它就很可能是素数了。注意,是很可能,不是一定是

import random
def isprime(n,k=128):   // 默认测试128 个aif n<2:return Falsefor _ in range(k):a = random.randrange(1,n)if pow(a,n-1,n)!=1:return Falsereturn True

这个东西我也不是很熟啊,所以建议配合Wiki看,Wiki比我讲的好的多

  1. 米勒-罗宾(Miller-Robin)素性检验。解决了费马素性检验错误率有点高的情况,

#include <iostream>
using namespace std;typedef long long ll;ll qpow(ll a, ll n, ll p)      // 快速幂
{ll ans = 1;while (n){if (n & 1)ans = (__int128)ans * a % p;      // 注意!中间结果可能溢出,需要使用__int128过渡a = (__int128)a * a % p;n >>= 1;}return ans;
}bool is_prime(ll x)
{if (x < 3)                 // 特判1,2return x == 2;if (x % 2 == 0)            // 特判偶数return false;ll A[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022}, d = x - 1, r = 0;while (d % 2 == 0)         // 算出d, r d /= 2, ++r;for (auto a : A){ll v = qpow(a, d, x);        // a^dif (v <= 1 || v == x - 1)    // 如果a^d≡0,说明是a是x的倍数;如果a^d≡1或-1,说明这串数接下来一定都是1,不用继续计算continue;for (int i = 0; i < r; ++i){v = (__int128)v * v % x; // 同样使用__int128过渡if (v == x - 1){         // 得到-1,说明接下来都是1,可以退出了v = 1;break;}if (v == 1)              // 在中途而非开头得到1,却没有经过-1,说明存在其他数字y≠-1满足y^2≡1,则x一定不是奇素数return false;}if (v != 1)                  // 查看是不是以1结尾return false;}return true;
}int main()
{cout<<bool(is_prime(6))<<endl;return 0;
}

6一般不咋用了,7一般用在要测试的那个数很大很大的情况,较小的情况其实前面几种方法基本可以了,还有其他的一些方法比如欧拉筛选、埃拉托斯特尼筛选等等,详见 素性测试,当然,Wiki百科也有可能出错,但是概率较低,毕竟可以自己修改 wiki 百科

判断一个数是否是素数的 n 多种方法相关推荐

  1. python脚本判断一个数是否为素数的几种方法

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...

  2. python中判断一个数是否为素数_【转载】Python脚本判断一个数是否为素数的几种方法...

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...

  3. C语言:判断一个数是否为素数(3种方法,含注释)

    首先要先明白素数的定义:除了1和本身之外,没有其他的因数的数,即不能被其他数整除. 同时要注意,1不是素数. 以下为判断素数的3个代码: 1.要注意给m赋初值是不能为1,因为1是任何数的因数,可以被任 ...

  4. 判断一个数是否为素数的两种方法:质数又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除,换句话说就是该数除了1和它本身以外不再有其他的因。最小的质数是2。

    一,由键盘输入一个数判断是否为素数(设一个数存放变量,将为0的代表非素数,为1的代表为素数) #include <stdio.h> int main() { int i,flag,numb ...

  5. 初等数论--整除--判断一个数是否是素数

    初等数论--整除--判断一个数是否是素数 博主是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找:如果有错,欢迎指正. 我整理成一个系列:初等数论,方便检 ...

  6. c语言 sqrt求100以内素数,C语言实现判断一个数是否为素数并求100以内的所有素数...

    判断一个数是否为素数 算法思想 设一个正整数x,sqrt(x)为x开平方后的值,若x不为素数,则x=a*b,a,b为2~x-1之间的整数,且当2=< a <= sqrt(x)时,必有sqr ...

  7. 判断素数的java程序_Java代码实例 判断这个数是否是素数

    import java.util.Scanner; /* 7.1:判断数字是否为素数(时间:20分钟) 7.1.1 任务描述 写一个程序,由用户输入一个整数,判断这个数是否是素数(素数:只能被1和本身 ...

  8. 如何判断一个数是否是素数

    判断一个数是否是素数,用for循环语句或while循环语句都可以,使除数j在2 到 i(i为我们需判断的数)之间递增一,知道i % j刚好等于0,然后判断 i 和 j 是否相等,相等则为素数,不相等则 ...

  9. Java程序中如何判断一个数是否为素数

    文章目录 一.素数是什么? 二.思考步骤 1.满足定义:拿一个数看能不能被1和它本身整除,对吗?? 2.先说说1-100以内的素数如何输出: **那么怎么变成判断输入的一个数是不是素数呢??** 总结 ...

最新文章

  1. 20181113-2 每周例行报告
  2. 0/0型极限等于多少_求极限时是否可以进行代入?
  3. eclipse中使用svn提交,更新代码。
  4. HDU 1221: Cube
  5. 今天是星期四,不知道是不是由于太想家了,每天晚上做梦遇到家人
  6. Spring Cloud【Finchley】-10Hystrix监控
  7. rapidjson读取json文件_SPARK入门 - json文件读取
  8. [编程技巧] C++字符串初始化的优化写法
  9. (三)、dubbo环境的搭建
  10. VSCode 设置 Tab 空格
  11. 从零开始学ios开发(十三):Table Views(下)Grouped and Indexed Sections
  12. hls ask 调制
  13. LFW人脸数据库的简介
  14. linuxi下的做图工具——gnuplot安装
  15. php中html插入图片,html插入图片的示例代码详解(图)
  16. [导入]PSP 经典游戏合集
  17. 免费生信课程|多组学数据整合分析之转录组和蛋白质组分析
  18. 深圳大学计算机专业保研率,深圳最好的公立大学(本科阶段)南方科技大学,2018级保研率应该会提高到30%...
  19. 波场java-tron3.6 fullnode节点广播交易前的流程分析
  20. 在MySQL中,如何给用户授予权限

热门文章

  1. 微信第三方平台的开发过程一
  2. 微信扫描二维码-电脑上网
  3. imagenet数据集类别标签和对应的英文中文对照表
  4. 华为AR系列路由器密码重置
  5. 对话Digital FUN和TEA社区创始人Totti#MiXTalk004
  6. 一键还原精灵万能的安装方法及error loading os的解决办法
  7. [Android]SIM字段EF_SUME(6F54) 可用作STK app name
  8. 互联网营销新模式,泰山众筹sun4.0模式了解一下
  9. 底层小程序员 练手做一个网站不小心赚了几十亿
  10. SSL与数字证书,Htpps