安卓手机如何下载tp|质数定义

作者: 安卓手机如何下载tp
2024-03-08 21:40:36

质数_百度百科

度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心质数[zhì shù]播报讨论上传视频数学概念收藏查看我的收藏0有用+10质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。中文名质数外文名prime number别    名素数讨论范围非0自然数定    义只有1和它本身两个因数的自然数反义词合数所属范围自然数目录1简介2性质3应用4编程▪基本判断思路▪代码▪素性检测▪筛素数法5猜想▪哥德巴赫猜想▪黎曼猜想▪孪生质数▪梅森质数简介播报编辑质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。质数的个数是无穷的。欧几里得的《几何原本》中有一个经典的证明。它使用了证明常用的方法:反证法。具体证明如下:假设质数只有有限的n个,从小到大依次排列为p1,p2,……,pn,设N=p1×p2×……×pn。如果 为素数,则 要大于p1,p2,……,pn,所以它不在那些假设的素数集合中。如果N+1为合数,因为任何一个合数都可以分解为几个素数的积;而N和N+1的最大公约数是1,所以不可能被p1,p2,……,pn整除,所以该合数分解得到的素因数肯定不在假设的素数集合中。因此无论该数是素数还是合数,都意味着在假设的有限个素数之外还存在着其他素数。所以原先的假设不成立。也就是说,素数有无穷多个。其他数学家给出了一些不同的证明。欧拉证明了全部素数的倒数之和是发散的,恩斯特·库默的证明更为简洁,哈里·弗斯滕伯格则用拓扑学加以证明。尽管整个素数是无穷的,仍然有人会问“100,000以下有多少个素数?”,“一个随机的100位数多大可能是素数?”。素数定理可以回答此问题。性质播报编辑1、质数p的约数只有两个:1和p。2、算术基本定理:任一大于1的自然数,要么本身是质数,要么可以分解为几个质数之积,且这种分解是唯一的。3、质数的个数是无限的。4、质数的个数公式 是不减函数。5、若n为正整数,在 到 之间至少有一个质数。6、若n为大于或等于2的正整数,在n到 之间至少有一个质数。7、在一个大于1的数a和它的2倍之间(即区间(a, 2a]中)必存在至少一个素数。8、存在任意长度的素数等差数列 [1]。 9、任一充分大的偶数都可以表示成一个素数加一个素因子个数不超过2个的数的和,简称为“1+2”。 [2]。应用播报编辑质数被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入质数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找质数的过程(分解质因数)过久,使即使取得信息也会无意义。在汽车变速箱齿轮的设计上,相邻的两个大小齿轮齿数设计成质数,以增加两齿轮内两个相同的齿相遇啮合次数的最小公倍数,可增强耐用度减少故障。在害虫的生物生长周期与杀虫剂使用之间的关系上,杀虫剂的质数次数的使用也得到了证明。实验表明,质数次数地使用杀虫剂是最合理的:都是使用在害虫繁殖的高潮期,而且害虫很难产生抗药性。以质数形式无规律变化的导弹和鱼雷可以使敌人不易拦截。多数生物的生命周期也是质数(单位为年),这样可以最大程度地减少碰见天敌的机会。编程播报编辑基本判断思路在一般领域,对正整数n,如果用2到 之间的所有整数去除,均无法整除,则n为质数。代码Python 代码:from math import sqrt

def is_prime(n):

    if n == 1:

        return False

    for i in range(2, int(sqrt(n))+1):

        if n % i == 0:

            return False

    return TrueJava代码:1.  

 public static boolean testIsPrime2(int n){

       if (n <= 3) {

            return n > 1;

        }

       

       for(int i=2;i

           if(n%i == 0)

               return false;

       }

       return true;

   }

/*优化后*/

 public static boolean testIsPrime3(int n){

       if (n <= 3) {

            return n > 1;

        }

       

       for(int i=2;i<=Math.sqrt(n);i++){

           if(n%i == 0)

               return false;

       }

       return true;

   }

   

   

2.

public class Prime {

    public static void main(String[] args) {

        int a = 17; //判断17是不是质数

        int c = 0;

        for (int b = 2; b < a; b++) {

            if (a % b != 0) {

                c++;

            }

        }

        if (c == a - 2) {

            System.out.println(a + "是质数");

        } else {

            System.out.println(a + "不是质数");

        }

    }

}Php代码:function isPrime($n) {//TurkHackTeam AVP production

    if ($n <= 3) {

        return $n > 1;

    } else if ($n % 2 === 0 || $n % 3 === 0)  {

        return false;

    } else {

        for ($i = 5; $i * $i <= $n; $i += 6) {

            if ($n % $i === 0 || $n % ($i + 2) === 0) {

                return false;

            }

        }

        return true;

    }

}C#代码:using System;

 namespace 计算质数

 {

    class Program

    {

        static void Main(string[] args)

        {

            for (int i = 2,j=1; i < 2100000000&&j<=1000; i++)//输出21亿内的所有质数,j控制只输出1000个。

            {

                if (st(i))

                {

                    Console.WriteLine("{0,-10}{1}",j,i);

                    j++;

                }

            }

        }

        static bool st(int n)//判断一个数n是否为质数

        {

            int m = (int)Math.Sqrt(n);

            for(int i=2;i<=m;i++)

            {

                if(n%i==0 && i!=n)

                    return false;

           } 

            return true;

        }

    }

 }

 C代码:#include 

#include 

int main()

{

    double x,y,i;

    int a,b;

    x = 3.0;

    do{

        i = 2.0;

        do{

            y = x / i;

            a = (int)y;

            if(y != a)//用于判断是否为整数

            {

                if(i == x - 1)

                {

                    b = (int)x;

                    printf("%d\n",b);

                }

            }

            i++;

        }while(y != a);

        x++;

    }while(x <= 10000.0);//3到10000的素数

    system("pause");//防止闪退

    return 0;

}C/C++代码:#include

#include

#include

using namespace std;

const long long size=100000;//修改size的数值以改变最终输出的大小

long long zhishu[size/2];

void work (){//主要程序

    zhishu[1]=2;

    long long k=2;

    for(long long i=3;i<=size;i++){//枚举每个数

        bool ok=1;

        for(long long j=1;j

            if(i%zhishu[j]==0){

                ok=!ok;

                break;

            }

        }

        if(ok){

            zhishu[k]=i;

            cout<<"count"<

            k++;

        }

    }

}

int main(){

    freopen("zhishu.out","w",stdout);

    cout<<"count1 2"<

    work();

    return 0;

}bool isPrime(unsigned long n) {

    if (n <= 3) {

        return n > 1;

    } else if (n % 2 == 0 || n % 3 == 0) {

        return false;

    } else {

        for (unsigned short i = 5; i * i <= n; i += 6) {

            if (n % i == 0 || n % (i + 2) == 0) {

                return false;

            }

        }

        return true;

    }

}Pascal代码:function su(a:longint):boolean;

var

begin

    if a=2 then exit(true) else for i:=2 to trunc(sqrt(a))+1 do if a mod i=0 then exit(false);

    exit(true);

end.Javascript代码:function isPrime(n) {

    if (n <= 3) { return n > 1; }

    if (n % 2 == 0 || n % 3 == 0) { return false; }

    for (var  i = 5; i * i <= n; i ++) {

        if (n % i == 0 || n % (i + 1) == 0) { return false; }

    }

    return true;

}Go代码:func isPrime(value int) bool {

    if value <= 3 {

        return value >= 2

    }

    if value%2 == 0 || value%3 == 0 {

        return false

    }

    for i := 5; i*i <= value; i += 6 {

        if value%i == 0 || value%(i+2) == 0 {

            return false

        }

    }

    return true

}Basic 代码Private Function IfPrime(ByVal x As Long) As Boolean

    Dim i As Long

    If x < 0 Then x = -x

    If x = 2 Then Return True

    If x = 1 Then Return True

    If x = 3 Then Return False

    If x = 0 Then 

        MsgBox("error",,)

        Return False

    End If

    For i = 2 To Int(Sqrt(x)) Step 1

        If x Mod i = 0 Then Return False

    Next i

    Return True

End FunctionALGOL代码begin

    Boolean array a[2:100];

    integer i,j;

    for i := 2 step 1 until 100 do

    a[i] := true;

    for i := 2 step 1 until 10 do

        if a[i] then

                for j := 2 step 1 until 1000÷i do

                    a[i × j] := false;

    for i := 2 step 1 until 100 do

        if a[i] then

            print (i);

end            素性检测素性检测一般用于数学或者加密学领域。用一定的算法来确定输入数是否是素数。不同于整数分解,素性测试一般不能得到输入数的素数因子,只说明输入数是否是素数。大整数的分解是一个计算难题,而素性测试是相对更为容易(其运行时间是输入数字大小的多项式关系)。有的素性测试证明输入数字是素数,而其他测试,比如米勒 - 拉宾(Miller–Rabin )则是证明一个数字是合数。因此,后者可以称为合性测试。素性测试通常是概率测试(不能给出100%正确结果)。这些测试使用除输入数之外,从一些样本空间随机出去的数;通常,随机素性测试绝不会把素数误判为合数,但它有可能为把一个合数误判为素数。误差的概率可通过多次重复试验几个独立值a而减小;对于两种常用的测试中,对任何合数n,至少一半的a检测n的合性,所以k的重复可以减小误差概率最多到 ,可以通过增加k来使得误差尽量小。随机素性测试的基本结构:1、随机选取一个数字a。2、检测某个包含a和输入n的等式(与所使用的测试方法有关)。如果等式不成立,则n是合数,a作为n是合数的证据,测试完成。3、从1步骤重复整个过程直到达到所设定的精确程度。在几次或多次测试之后,如果n没有被判断为合数,那么可以说n可能是素数。常见的检测算法:费马素性检验(Fermat primality test),米勒拉宾测试(Miller–Rabin primality test) ,Solovay–Strassen测试,卢卡斯-莱默检验法(Lucas–Lehmer primality test)。筛素数法筛素数法可以比枚举法节约极大量的时间(定n为所求最大值,m为≤n的质数个数,那么枚举需要O(n^2)的时间复杂度,而筛素数法为O(m*n),显然m<

#include

#include

#include

using namespace std;

const long long size=1000000;//修改此值以改变要求到的最大值

bool zhishu[size+5]={false};

int main(){

    freopen("zhishu.out","w",stdout);//输出答案至“筛质数(shaizhishu).exe”所在文件夹内

    zhishu[2]=true;

    for(long long i=3;i<=size;i+=2)zhishu[i]=true;//所有奇数标为true,偶数为false

    for(long long i=3;i<=size;i++){

        if(zhishu[i]){//如果i是质数

            int cnt=2;

            while(cnt*i<=size){//把i的倍数标为false(因为它们是合数)

                zhishu[cnt*i]=false;

                cnt++;

            }

        }

    }

    int cnt=1;

    for(int i=2;i<=size;i++){//全部遍历一遍

        if(zhishu[i]){//如果仍然标记为true(是质数)则输出

            cout<

            cnt++;

        }

    }

    return 0;

}

/*

样例输出结果,第一个数是个数,第二个是第几个质数

1 2

2 3

3 5

4 7

5 11

6 13

7 17

8 19

9 23

10 29

11 31

12 37

13 41

14 43

15 47

16 53

17 59

18 61

19 67

20 71

21 73

22 79

23 83

24 89

25 97

*/筛选法的Java实现,如下:/**

 * @title SOE

 * @desc 简单的埃氏筛选法计算素数 

 * @author he11o

 * @date 2016年5月3日

 * @version 1.0

 */

public class SOE {

    public static int calPrime(int n){

        if(n<=1){

            return 0;

        }

        byte[] origin = new byte[n+1];

        int count = 0;

        for(int i=2;i

            if(origin[i] == 0){

                count++;

                int k = 2;

                while(i*k<=n){

                    origin[i*k] = 1; 

                    k++;

                }

            }else{

                continue;

            }

        }

        return count;

    }

}采用简单的埃氏筛选法和简单的开方判断素数法计算1000000以内素数的个数的效率比较:StopWatch '计算1000000以内素数的个数': running time (millis) = 268-----------------------------------------ms % Task name-----------------------------------------00024 009% 简单的埃氏筛选法;00244 091% 简单的开方判断素数法。猜想播报编辑哥德巴赫猜想:是否每个大于2的偶数都可写成两个素数之和?孪生素数猜想:孪生素数就是差为2的素数对,例如11和13。是否存在无穷多的孪生素数?斐波那契数列内是否存在无穷多的素数?是否有无穷多个的梅森素数?在n2与(n+1)2之间是否每隔n就有一个素数?是否存在无穷个形式如X2+1素数?黎曼猜想 [2]哥德巴赫猜想在1742年给欧拉的信中哥德巴赫提出了以下猜想:任一大于2的整数都可写成两个质数之和。因现今数学界已经不使用“1也是素数”这个约定,原初猜想的现代陈述为:任一大于5的整数都可写成三个质数之和。欧拉在回信中也提出另一等价版本,即任一大于2的偶数想陈述为欧拉的版本。把命题"任一充分大的偶数都可以表示成为一个素因子个数不超过a个的数与另一个素因子不超过b个的数之和"记作"a+b"。1966年陈景润证明了"1+2"成立,即"任一充分大的偶数都可以表示成二个素数的和,或是一个素数和一个半素数的和"。 今日常见的猜想陈述为欧拉的版本,即任一大于2的偶数都可写成两个素数之和,亦称为“强哥德巴赫猜想”或“关于偶数的哥德巴赫猜想”。从关于偶数的哥德巴赫猜想,可推出任一大于7的奇数都可写成三个质数之和的猜想。后者称为“弱哥德巴赫猜想”或“关于奇数的哥德巴赫猜想”。若关于偶数的哥德巴赫猜想是对的,则关于奇数的哥德巴赫猜想也会是对的。1937年时前苏联数学家维诺格拉多夫已经证明充分大的奇质数都能写成三个质数的和,也称为“哥德巴赫-维诺格拉朵夫定理”或“三素数定理”。2013年,秘鲁数学家哈拉尔德·赫尔弗戈特在巴黎高等师范学院宣称:证明了一个“弱哥德巴赫猜想”,即“任何一个大于7的奇数都能被表示成3个奇素数之和”。黎曼猜想黎曼猜想是关于黎曼ζ函数ζ(s)的零点分布的猜想,由数学家波恩哈德·黎曼(1826~1866)于1859年提出。德国数学家希尔伯特列出23个数学问题。其中第8问题中便有黎曼假设。素数在自然数中的分布并没有简单的规律。黎曼发现素数出现的频率与黎曼ζ函数紧密相关。黎曼猜想提出:黎曼ζ函数ζ(s)非平凡零点(在此情况下是指s不为-2、-4、-6等点的值)的实数部份是1/2。即所有非平凡零点都应该位于直线1/2 + ti(“临界线”(critical line))上。t为一实数,而i为虚数的基本单位。无人给出一个令人信服的关于黎曼猜想的合理证明。在黎曼猜想的研究中,数学家们把复平面上 Re(s)=1/2 的直线称为 critical line。 运用这一术语,黎曼猜想也可以表述为:黎曼ζ 函数的所有非平凡零点都位于 critical line 上。黎曼猜想是黎曼在 1859 年提出的。在证明素数定理的过程中,黎曼提出了一个论断:Zeta函数的零点都在直线Res(s) = 1/2上。他在作了一番努力而未能证明后便放弃了,因为这对他证明素数定理影响不大。但这一问题仍然未能解决,甚至于比此假设简单的猜想也未能获证。而函数论和解析数论中的很多问题都依赖于黎曼假设。在代数数论中的广义黎曼假设更是影响深远。若能证明黎曼假设,则可带动许多问题的解决。孪生质数1849年,波林那克提出孪生质数猜想(the conjecture of twin primes),即猜测存在无穷多对孪生质数。猜想中的“孪生质数”是指一对质数,它们之间相差2。例如3和5,5和7,11和13,10,016,957和10,016,959等等都是孪生质数。英国数学家戈弗雷·哈代和约翰·李特尔伍德曾提出一个“强孪生素数猜想”。这一猜想不仅提出孪生素数有无穷多对,而且还给出其渐近分布形式。2013年5月14日,《自然》(Nature)杂志在线报道张益唐证明了“存在无穷多个之差小于7000万的素数对”,这一研究随即被认为在孪生素数猜想这一终极数论问题上取得了重大突破,甚至有人认为其对学界的影响将超过陈景润的“1+2”证明。 [3]梅森质数17世纪还有位法国数学家叫梅森,他曾经做过一个猜想:当2p-1 中的p是质数时,2p-1是质数。他验算出:当p=2、3、5、7、17、19时,所得代数式的值都是质数,后来,欧拉证明p=31时,2p-1是质数。 p=2,3,5,7时,2p-1都是素数,但p=11时,所得2,047=23×89却不是素数。梅森去世250年后,美国数学家科尔证明,267-1=193,707,721×761,838,257,287,是一个合数。这是第九个梅森数。20世纪,人们先后证明:第10个梅森数是质数,第11个梅森数是合数。由于这种质数珍奇而迷人,它被人们称为“数学珍宝”。值得一提的是,中国数学家和语言学家周海中根据已知的梅森质数及其排列,巧妙地运用联系观察法和不完全归纳法,于1992年正式提出了梅森素质分布的猜想,这一重要猜想被国际上称为“周氏猜测”。新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

质数 - 搜狗百科

搜狗百科质数(Prime number,又称素数),[1]指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。网页微信知乎图片视频医疗汉语问问百科更多»登录帮助首页任务任务中心公益百科积分商城个人中心质数编辑词条添加义项同义词收藏分享分享到QQ空间新浪微博质数(Prime number,又称素数),[1]指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。中文名质数展开类别数学展开定义一个大于1的自然数,除了1和它本身外,不再有其他的因数[2]展开外文名Prime number[3]展开数量无限个展开对应概念合数展开别名素数展开参考资料:1. 论微课对课堂教学改进的探究知网[引用日期2022-01-23]2. 数学家们努力探寻“质数公式”维普网[引用日期2022-05-23]3. 质数科技大数据知识发现平台[引用日期2022-04-06]词条标签:科学免责声明搜狗百科词条内容由用户共同创建和维护,不代表搜狗百科立场。如果您需要医学、法律、投资理财等专业领域的建议,我们强烈建议您独自对内容的可信性进行评估,并咨询相关专业人士。词条信息词条浏览:3093517次最近更新:23.11.22编辑次数:73次创建者:告别のGPO突出贡献者:新手指引了解百科编辑规范用户体系商城兑换问题解答关于审核关于编辑关于创建常见问题意见反馈及投诉举报与质疑举报非法用户未通过申诉反馈侵权信息对外合作邮件合作任务领取官方微博微信公众号搜索词条编辑词条 收藏 查看我的收藏分享分享到QQ空间新浪微博投诉登录企业推广免责声明用户协议隐私政策编辑帮助意见反馈及投诉© SOGOU.COM 京ICP备11001839号-1 京公网安备110000020000

数论(一)质数 - 知乎

数论(一)质数 - 知乎切换模式写文章登录/注册数论(一)质数小螺蛎数量这一概念应该是人类能够最原始而直接地从生活中感受到的数学内容之一了。想一想我们最早接触到的数学应该就是认识数字了吧。在对自然数的研究中有一个很重要的概念,就是质数以及与其相对应的合数,这一回我们就来聊一聊质数。质因数分解在研究一个正整数时,最直接的一种方法就是将其分解(factorization)。但在分解的过程中有不同的方法,如12既可以写成2×6,也可以写成3×4。那么有没有一种方法将其分解为唯一的形式呢?答案就是继续分解,直到无法分解为止。根据算数基本定理(Fundamental Theorem of Arithmetic),所有大于1的自然数都可以被完全分解成质数的乘积的形式。如上面的例子,12=2×6=2×2×3;或写成12=3×4=3×2×2;我们发现这两种分解方法都得到了同样的结果。这样无法再分解的数就是质数,或称素数。而那种可以继续分解的数就是合数。这是一个比较直观的定义。准确地说,质数是除去1和它自身之外,再没有其他因数的正整数。因为1的存在,任何正整数都可以写成1乘以其自身。说到这里,想必读者对质数已有了一个直观的了解。就像我们刚刚所说的,质数的定义就是想要描述那些基本的数。质数之于合数,打个不甚恰当的比方,就好比字母相对于单词。质数作为基本的单位,可以合成各种合数;而任何合数都是由质数合成而来的。质数的英文prime number中的prime就有首要的、基本的意思。但不知为何,在汉语中prime number写成了质数。可能是prime也有优质的意思吧。只能说是中文单字命名时的一种缺陷了。而合数(composite number)就更能顾名思义了,composite即为合成的意思。质数的特征不同于英文中的字母只有有限个这一特点,质数有无限多个。这一发现早在早在公元前就被欧几里得(Euclid)提出:假设质数的个数只有有限个:2,3,5,7…p,p为最大的质数。则所有的正整数都由这些质数合成而来,也就是所有的数都可以被2,3,5,7…p中的某些数整除,那么,2×3×5×7×…×p+1这个合数肯定也能够被2,3,5,7...p中的某些数整除。但是,从2×3×5×7×…×p+1这个表达式我们就能看出来,它并不能被2,3,5,7...p中的任何数整除,也就形成了悖论,所以我们之前的假设并不成立,也就说明了一定有无限多个质数。(反证法的典型应用)质数都有哪些呢?刚才我们提到的2,3,5,7都是质数,我们可以按照质数的定义继续寻找,2,3,5,7,11,13,17,19,23...质数与质数之间看似毫无关系,但仔细观察还是能找出一些规律的。下图中列出了100以内的质数。根据算术基本定理,所有合数都能够写成质数乘积的形式,因此100以内的合数必然是2,3,5或7中的至少一个数的倍数,这是因为若非如此,则这个合数必然是大于7的质数之积,则超出了100这一范围。这也就是说,在100以内的数中,合数必为2或3或5或7的倍数。除此之外的数则为质数(习惯上规定1既不是质数也不是合数)。因为2的倍数以2、4、6、8、0结尾,5的倍数以5、0结尾,所以大于10的质数必然不第2列、第4列、第5列、第6列、第8列和第10列。其余列中在除掉3的倍数和7的倍数,剩余的则为质数。关于如何快速判断出倍数关系的问题会在以后讨论。发布于 2020-06-19 09:03数学数论​赞同 10​​4 条评论​分享​喜欢​收藏​申请

请通俗易懂地讲讲什么是素数(质数)? - 知乎

请通俗易懂地讲讲什么是素数(质数)? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册数论素数初等数论请通俗易懂地讲讲什么是素数(质数)?本人不知道质数(素数)到底是什么,因数这些与它相关的数学术语也不知道。所以请通俗易懂地,尽可能简单地讲讲什么是质数,就如同跟小孩讲这个一样,谢谢。显示全部 ​关注者23被浏览68,389关注问题​写回答​邀请回答​好问题 2​添加评论​分享​17 个回答默认排序知乎用户​数学话题下的优秀答主小学的时候经常会把一些弹力球啊弹珠之类的东西摆成特定的形状玩。比如10颗弹珠,我们可以把它们摆放成2×5的长方形,或者5×2的长方形。总之可以摆出长方形。但是有一些数目的弹珠没法摆成长方形,只能摆成长长的一行或一列。这样的数目我们叫做素数。发布于 2020-09-29 23:15​赞同 46​​2 条评论​分享​收藏​喜欢收起​何冬州杨巅杨艳华典生​软件试用与测试​ 关注将自然数写成比它自己小的自然数的乘积,如果不能做到,那么它要么是0,要么是1,要么是质数。例如4=2*2,4可以写成比4小的数相乘,因此4不是素数。例如2,比2小的自然数有0和1,它们无论怎么相乘,得不到2,所以2是素数。再如3,比3小的自然数有0,1,2,它们无论怎么相乘,得不到3,所以3是素数。再如5,比5小的自然数有0,1,2,3,4,它们无论怎么相乘,得不到5,所以5是素数。关于0,1的特性,见后文说明。换个说法:一个自然数,如果它不是0,也不是1,它也不能分解成比它自己小的自然数的乘积,那么它是质数。30以内的质数有2,3,5,7,11,13,17,19,23,29外一则:一个自然数,如果它能分解成比它自己小的自然数的乘积,那么它是合数。30以内的合数有4,6,8,9,10,12,14,15,16,18,20,21,22,24,25,26,27,28合数分解成比它自己小的自然数的乘积举例:4=2*2=2^2,6=2*3,8=2*4=2*2*2=2^3,9=3*3=3^2,10=2*5,12=2*6=2*2*3=4*3=(2^2)*3,......综上,自然数可以分三类:{0,1}为一类,质数为一类,合数为一类。或者分四类:1,质数,合数,0{0,1},0的乘法属性是吸收一切,是随自己的,0乘以任何数得0;1的乘法属性是奉献自我,是随他人的,1乘以谁就等于谁。它们的共性,0乘0等于他自己,1乘1等于他自己,可以称呼它们为幂循环数。质数,它不是1,它被1和它自己整除,不能被其它数整除。能整除它的数,只有1和它自己,只有这2个。我们说他的因数有2个。合数,除了能被1和它自己整除,还能被小于它的其它数整除。能整除它的数,除了1和它自己,还有有限个。我们说他的因数有多个。1只能被1整除,我们说他的因数只有1,同时也是它自己,它只有1个因数。0除了能被1和它自己整除,还能被其它任意自然数整除。能整除它的数,除了1和它自己,还有无限个。我们说他的因数有无数个(无限,无穷,无穷多个)。我个人有个提议:将0,1,素数称为准数,或分解基数,在考虑自然数的分解时,它们是基本的、基础的数。相关答题:何冬州杨巅杨艳华典生:为什么1不算素数?何冬州杨巅杨艳华典生:请通俗易懂地讲讲什么是素数(质数)?何冬州杨巅杨艳华典生:对于特定的正整数n,能拆成不同的n组两个素数之和的偶数有是否只有有限多个?以下为2021-8-10新增{质数和合数这两个词,是相对反义词。自然数={非质数也非合敢(幂循环数)0,1}+{质数2,3,57,11,13,...}+{合数4,6,8,9,10,12,...}我提议:自然数={准数(或称分解基数0,1这两个幂循环数,和所有质数)}+{合数4,6,8,9,10,12,...}补注:1曾经被归入质数,但为了保证质因数分解的有效性和唯一性,后来将他从质数中区别出来。0在某种意义上既有与合数相似的属性,我也曾想到把它归入合数里面。后来又发现,0也有与质数相似的属性(将它要写成因数分解的形式,必须有他自己存在)。同时我们发现,0与1有一种共性,就是他们的乘幂具有幂循环性(幂守性,幂模不变性,幂的绝对值不变性):我们定义j具有幂循环性(幂守性),是指j^n∈有限集合F(当n遍历自然数集时)。在自然数集上也可以称为幂等性,对应j=0,1,有限集合F={0},{1};在(有理)整数集上,对应j=0,-1,有限集合F={0},{-1,1};在高斯整数集{形如a+b√(-1),(常常将√(-1)记作i);a,b为有理整数},对应j=0,√(-1),有限集合F={0},{-i,-1,i,1};在代数整数集上,...数的乘积分解,必须考虑到这种幂循环性。因此我们把幂循环数和质数合称为(积)分解基数,或者积准数,简称准数。8月13日新增:一、幂循环数:自然数范围内讨论:0的因数为任意自然数,即因子个数为∞个。1的因数只有1,即因子个数为1个。0的n≥1次方幂是0,1的n≥1次方幂是1,他们具有共性:幂等于它们自己。它们均归入 幂循环数。0以外的幂循环数称为幺数。幺数的概念扩展:如果一组幺数可以由一个幺数e的幂来生成,那么我们称这个幺数e为 本原幺数 或者 (本)母幺数,其他幺数为派生幺数。称这些幺数之间的关系为相伴。 如果一个数a=另外一个数b*幺数,我们也说a和b相伴。在整数范围内,1与-1均为幺数,其中-1是本原幺数。二、质数:自然数范围内讨论:因数个数=2个。质数概念扩展到整数范围:质数与它的相伴数,即质数*幺数=质数*{-1,1},均称为质数,也可以称为正质数与负质数。更广的扩充:质数的相伴数我们均称为质数。但是为了保证质因数分解的唯一性,我们最好是将基本的质数和本母幺数称为分解基数或准数,称为数的准数因子分解的唯一性,或者质因数分解的相伴数归并意义上的唯一性。(这些用辞有待进一步的标准化和简化。)}编辑于 2021-08-13 18:17​赞同 8​​9 条评论​分享​收藏​喜欢

质数(2,3,5,7,11,13,...)

质数(2,3,5,7,11,13,...)

RT

首页/数学/数字/质数

质数

什么是素数?

质数列表

0是质数吗?

1是质数吗?

2是素数吗?

什么是素数?

质数是一个正自然数,只有两个正自然数除数-一个和它本身。

质数的相反是合成数。复合数是一个正营养数,具有除一个或自身以外的至少一个正除数。

根据定义,数字1不是质数-它只有一个除数。

数字0不是质数-它不是正数并且具有无数个除数。

数字15的因数为1,3,5,15,因为:

15/1 = 15

15/3 = 5

15/5 = 3

15/15 = 1

因此15不是素数。

数字13只有两个除数1,13。

13/1 = 13

13/13 = 1

因此13是质数。

质数表

质数最大为100的列表:

2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97, ...

0是质数吗?

数字0不是质数。

零不是正数,并且具有无限大的除数。

1是质数吗?

根据定义,数字1不是质数。

一种是只有一个除数-本身。

2是素数吗?

数字2是质数。

两个具有2个自然数除数-1和2:

2/1 = 2

2/2 = 1

 

也可以看看

百分比(%)

英里数(‰)

百万分之一(ppm)

零号

常数

Advertising

号码

数字系统

百分比(%)

英里数(‰)

百万分之一(ppm)

零号

素数

常数

斐波那契数

乘法表

快速表格

推荐网站

发送反馈

关于

首页| 网页| 数学| 电力| 计算器| 转换器| 工具类

© 2024

RT | 关于| 使用条款| 隐私政策| 管理Cookies

该网站使用Cookie来改善您的体验,分析流量并展示广告。学到更多

确定 管理设置

素数的定义是什么? - 知乎

素数的定义是什么? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册定义数论素数素数的定义是什么?关注者10被浏览151,331关注问题​写回答​邀请回答​好问题​1 条评论​分享​8 个回答默认排序谮执德匆簧​ 关注质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。发布于 2019-06-11 00:20​赞同 29​​添加评论​分享​收藏​喜欢收起​夏日痴希冀传统文化中某些优秀数学思想遗泽也可在现代世界发光​ 关注传统定义:只能被1和自身整除的正整数。当然,也可以有新的定义。发布于 2019-07-30 15:07​赞同 2​​添加评论​分享​收藏​喜欢

怎样优雅地判断一个数是不是质数? - 知乎

怎样优雅地判断一个数是不是质数? - 知乎切换模式写文章登录/注册怎样优雅地判断一个数是不是质数?忘忧北萱草轻度自由。质数人类对数论的研究可以追溯到公元前,在数论研究的悠久历史中,质数是一个永恒的话题。对于质数的判定,也永远是一个迷人的问题。我们这样定义质数:如果自然数 p > 1 的因数只有1和它本身,那么 p 是质数。质数有很多美妙的性质,比如:如果一个数是质数,那么它是自然数。如果一个数是质数,那么它不是合数。如果一个数是质数,那么它大于等于2。相信我们聪明的读者不难证明这些性质。接下来,让我们进入正题:如何判定一个数是不是质数?入门版素数判定这种高深的数论问题,用一般的编程语言肯定难以优雅地实现。所以,我们必须使用 Wolfram Language 这样专门用于数学计算的语言,才能写出“出淤泥而不染,濯清涟而不妖”的美妙实现。你是素数吗 = PrimeQ;我们来看一个例子:这种纯粹的感觉,就像在QQ群里at你的同学一样自然!但是,我们不能沉溺于舒适区,要勇于面对自己,我们要前往混沌邪恶的 C++ 领域。初级版在进入这一章节之前,我们需要一些十分复杂的数论推导,不喜欢看公式的同学可以暂时跳过下面一小段。要判断一个数是不是质数,其实和判断一个数是不是合数没有太大区别。要判断一个数是合数,按照定义来看,只需要找到一个不是1和它本身的因数就可以。如果我们对一个数 n,找到了这样的因数 m,也就是 m 整除 n,此时一定会有 m \le n 。所以,我们只需要在 2~n-1 的范围内寻找 n 的因数就可以了。上面的推导中居然出现了整整一个公式!我这篇回答的读者要跑掉一半了!根据上面的数论推导,我们可以写出如下的质数判断程序:bool 你是质数吗(int n) {

if (n <= 1) return false;

for(int i = 2; i < n; ++i)

if (n % i == 0) return false;

return true;

}

在这里,我们约定负数和0不是质数。看 C++ 这混沌邪恶的语法,反人类的 for 循环,甚至连 bool 都只是语法糖,在输出的时候只能给出一个冷冰冰的 0 和 1,一点不考虑用户体验……高级版在上面的算法中,我们需要穷举2~n-1的所有整数。真的就没有改进方法了吗?在古希腊时期,有一位数学家叫埃拉托斯特尼,提出了一种方法,叫做埃拉托斯特尼筛法。埃拉托斯特尼筛法是非常经典的质数判定算法,在各种要求精确解的质数判定中,大多数都能见到埃拉托斯特尼筛法的影子。在这里,我必须多次重复埃拉托斯特尼这个长的要命的名字,以表达我对埃拉托斯特尼这位伟大先贤的崇高敬意。埃拉托斯特尼筛法的思想可以给我们很大的启发,埃拉托斯特尼筛法指导我们进一步缩小因数的搜索范围。为此,我们仍然需要更加复杂的数论推导。对于合数 n,我们可以证明它一定有一个小于等于 \sqrt{n} 的非平凡因数。这里的非平凡因数,指的是和1与他本身不同的因数。如果不是,那么它所有的非平凡因数都是大于 \sqrt{n} 的。我们任取其中一个和n不同的非平凡因数 m,那么存在整数 k 使 n=km,那么 k 也为 n 的非平凡因数,但是 k=\frac{n}{m}<\sqrt{n} ,矛盾。所以合数 n 一定有一个小于等于 \sqrt{n} 的非平凡因数。到现在为止我已经用了5个公式了!我的读者已经只剩1/32了!因此,我们只需要在2到 \left[ \sqrt{n} \right] 之间寻找 n 的因数。(这里的 \left[ x \right] 表示不超过 x 的最大整数。)不对,我怎么又用了两个公式……bool 你是质数吗(int n) {

if (n <= 1) return false;

for(int i = 2; i * i <= n; ++i)

if (n % i == 0) return false;

return true;

}

超极版我们刚才的算法都是按照质数的定义,去找一个数有没有因数,这种做法太 naive 了。那么,有没有什么能判定质数的高级定理呢?为了写这篇文章,我耗费了整整180秒上网查资料,找到了这么一个定理:威尔逊定理:对于自然数 p>1,p 是质数当且仅当 (p-1)! \equiv -1 \pmod{p} 。我怎么又用了公式!还用了同余符号!我的读者会全跑掉的啊!按照上面的想法,我们只要求出 (p-1)!+1 除以 p 的余数,看看是不是0就好了。bool 你是质数吗(int n) {

if (n <= 1) return false;

int factor = 1;

for(int i = 2; i < n; ++i)

factor = ((long long)factor * i) % n;

factor = (factor + 1) % n;

return factor == 0;

}

等等,这个算法好像比上面两个都要慢啊!速度什么不重要,重要的是让别人知道了我们能熟练运用威尔逊定理这样高级的数论定理。还有,那个说在项目里这么写代码的会被人打死的站出bubyguoi;ohugkbvfdsvvgrt4u上D版上D与你同在感谢上D把我复活,我又能回来写文章了。刚才的方法,无一例外都是基于简单的数论原理,这种人工设计的算法难以发挥计算机真正的性能。我们要逃脱手工设计算法的桎梏,进入机器学习的神圣殿堂。于是我又花了整整200秒去查找资料,终于在一篇知乎回答中找到了实现方法:作者使用了端到端的双层 LSTM 网络,将数字转为字符串输入,在质数判定问题上进行了1分钟的训练,效果拔群。神经网络学会了“不管你输入啥只要我蒙合数总比蒙质数对的多”。按照这一思想,我们得出了一个对几乎全部自然数正确的质数判定算法:bool 你是质数吗(int n) {

return false;

}

多么简洁的逻辑!机器学习让我们发现了世界的本质,就是大道至简!只要我们愿意舍弃那么一(亿)点点正确性,一切都是如此简单!撒D版欢迎来到D狱上D的算法没能给我们很大的帮助,但是这种思想给了我们一点启发:算法的能力是有极限的。我从短暂的 OI 生活当中学到一件事:越是玩弄优化,就越会发现算法被时间复杂度所限制……除非超越算法。你到底想说什么?我不做人了,JOJO!(划去)我不要精确度了!于是我们祭出了费马小定理:如果 p 是素数,那么有 a^p \equiv a \pmod p 。虽然费马小定理的逆命题是不成立的,但是不排除它在绝大多数情况下都是成立的。为了方便计算,取 a=2,于是我们又得出了一个对几乎全部自然数正确的质数判定算法:bool 你是质数吗(int n) {

if (n <= 1) return false;

int t = 1, m = 2, p = n;

while(p) { // 快速幂取模

if (p % 2) t = ((long long)t * m) % n;

m = (m * m) % n;

p >>= 1;

}

t = (t - 2) % n;

return t == 0;

}

这个算法的速度相比之前的算法,完全不在一个数量级上,只是精确度稍微差了那么一(亿)点点。比如经典的卡迈克数561,它虽然是合数(561=3×11×17),但是会被这个算法判定为质数。但是,如果我们对这一算法进行一(亿)点点改进,就能得到大名鼎鼎的 Miller-Rabin 素性检验算法[1]。这一算法在费马小定理之外,还需要另一个更加复杂的数论定理:二次检验定理:对于质数 p,在0~p-1范围内,满足 x^2\equiv 1\pmod p 的整数只有 1 和 p-1。证明就留做习题吧。根据二次检验定理,对于一个整数 x,如果 x^2,x^4,x^8,\cdots 除以 n 的余数都不为1,那么 n 就很有可能是一个质数。然后我们再把费马小定理换个形式,如果 a^{n-1} 除以 n 的余数为1,那么 n 很可能是一个质数。接下来,就是撒D赐予我们的鬼才逻辑了。首先把 n-1 分解为 2^s\cdot t ,接着再把 a^t 不断平方,每平方一次,进行一次二次检验,这样平方 s 次之后,恰好就求出了 a^{n-1} 。int prime[10]={2, 3, 5, 7, 11, 13, 17, 19, 23, 29};

bool 你是质数吗(int n) {

if (n <= 1) return false;

if (n == 2) return true;

int s = 0, t = n - 1;

while (!(t % 2)) ++s, t >>= 1; // 求解 n-1=2^s*t

for (int i = 0; i < 10 && prime[i] < n; ++i) {

int a = prime[i];

int b = 1, m = a, p = t;

while (p) { //快速幂,求 b=a^t

if (p % 2) b = ((long long) b * m) % n;

m = ((long long)m * m) % n;

p >>= 1;

}

if (b == 1) continue;

for (int j = 1; j <= s; ++j) { // 进行 s 次二次检验

int k = ((long long)b * b) % n;

if(k == 1 && b != n-1) return false;

b = k;

}

if (b != 1) return false;

}

return true;

}

这里选取了前10个质数作为底,已经可以规避绝大多数的误检情况。最后的最后也许质数检验这一个问题并不像它看上去的那么简单。在它的背后,蕴含着深刻的数学原理。2002年,来自印度坎普尔理工学院的计算机科学家,Manindra Agrawal、Neeraj Kayal和Nitin Saxena,发表了论文 PRIMES is in P[2],提出了第一个一般的、确定性的、不依赖未证明命题的多项式时间素数判定算法,作者们也因此获得了哥德尔奖和富尔克森奖。回观这篇文章中提到的算法,每一次进步都离不开跳出框架局囿的创新思考。要敢于打破那些固有认知中的限制。也许哪一天,用神经网络判别质数这样看起来根本不可能的想法,也会变成现实呢。参考^Hurd J. Verification of the Miller–Rabin probabilistic primality test[J]. The Journal of Logic and Algebraic Programming, 2003, 56(1-2): 3-21.^Manindra Agrawal, Neeraj Kayal, Nitin Saxena, "PRIMES is in P", Annals of Mathematics 160 (2004), no. 2, pp. 781–793.发布于 2020-03-17 12:57初等数论素数数论​赞同 274​​22 条评论​分享​喜欢​收藏​申请

质数是什么? - 知乎

质数是什么? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册算法数论素数质数是什么?关注者20被浏览31,286关注问题​写回答​邀请回答​好问题​添加评论​分享​8 个回答默认排序小郑小白深度学习​ 关注质数(Prime number,又称素数),指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。 大于1的自然数若不是素数,则称之为合数(也称为合成数)。算术基本定理确立了素数于数论里的核心地位:任何大于1的整数均可被表示成一串唯一素数之乘积。为了确保该定理的唯一性,1被定义为不是素数,因为在因式分解中可以有任意多个1(如3、1×3、1×1×3等都是3的有效约数分解)发布于 2020-04-07 15:38​赞同 3​​添加评论​分享​收藏​喜欢收起​绝顶我为峰前OIer。​ 关注就是说一个质因数只含有1和它本身的数(1不是质数)或者说只有两个因数的数发布于 2019-07-29 09:42​赞同 2​​添加评论​分享​收藏​喜欢

素数(又叫质数) – 整除和素数 – Mathigon

叫质数) – 整除和素数 – Mathigon请在浏览器中启用 JavaScript 以访问Mathigon。跳过导航Ploypad课程活动课程登入创建新帐户课程Ploypad活动课程计划暗模式更改语言 更改语言English中文DeutschRomânăTürkçe 登录到MathigonGoogleMicrosoft要么电子邮件或用户名密码新账户     重设密码     登入整除和素数因子和倍数整除规律素数(又叫质数)素数的分布最小公倍数最大公约数分享词汇表重置进度 分享 重置进度这将删除您在本课程中所有章节的进度和聊天数据,并且无法撤消!立即重置 词汇表选择左侧的一个关键字...整除和素数素数(又叫质数)阅读时间: ~10 min显示所有步骤我们在计算这些除数对时,会遇到一些只有第一对除数的数。一个例子是 13 – 它只有 除数1和13自己。这些特殊的数被称为__素数__. 它们不能被拆成两个稍小的数的乘积。 某种程度上,它们成了“原子数”。注意 1 自身 不是 一个素数, 所以首批的一些素数是 2, 3, 5, 7, 11, 13, …任意不是素数的数都能被写成素数的乘积形式:我们只要不断的把它分解成更多的部分直到所有 因子都是素数。例如,842×422×213×784=2×2×3×7现在 2, 3 和 7 是素数而且不能再被分解了。2 × 2 × 3 × 7 被称为84的 质因式, 同时 2, 3 和 7 是它的 质因子. 注意一些素数,比如这里的2,可以在一个质因式 里出现多次。每个整数都有一个质因式,但是没有两个数的质因式是一样的。更进一步,任意整数 都只有一种质因式写法 – 除非我们把素数不同顺序算成不同写法。这就是 算术基本定理(FTA-Fundamental Theorem of Arithmetic).利用算术基本定理能够使许多数学问题变得简单多了: 我们做多个数的质因数分解时,我们先独立 分解一个个数来解决问题,这样通常会简单很多,然后把这些结果组合起来从而解决原来 的问题。埃拉托色尼筛选法结果, 很难确定一个数是否是素数: 你总是必须找到它 全部 的质因数, 随着数变大 而变得越难确定。 然而,希腊数学家 - 昔兰尼古城的埃拉托色尼想到了 一个简单的算法来找出100内的全部素数: 埃氏素数筛选法.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100首先我们需要写下100内的所有整数我们知道1不是素数,所以删掉它。最小的素数是2. 任何2的倍数都不是素数,因为它有个因子2。所以我们能够删掉所有2的倍数。在我们列表里下一个数是3 – 又是个素数. 所有3的倍数都不是素数,因为它有因子3, 所以我们也能删掉它们。下一个数4, 已经被删掉了,所以我们继续下个数5: 它又是个素数, 同理我们删掉所有5的倍数。下一个素数一定是, 因为6已经被删掉了. 再一次的,我们删掉它的倍数。下一个素数是. 但是请注意,它的所有倍数都是已被删掉3的倍数。对于剩下的所有其它数也是一样的情形。因此所有这些剩下的数都必定是素数。现在我们可以数数了,总共有个素数小于100。有多少个素数? 当然我们能够用埃氏素数筛选法找更大的数素。在100到200间有21个素数, 200到300间 有16个素数,在400到500间有17个素数,而且10000到10100间只有11个。素数看起来在不断的分散了,但是它们会终止吗? 存在一个 最大 或 最后 的素数吗?古希腊数学家亚历山大的欧几里德 第一个证明了存在无穷多个素数的, 通过下面的论证: 假设只有有限多个素数。P, P, P, P, P让我们把它们全部相乘,得到一个非常大的数,我们把它称为N.N = P × P × P × P × P现在我们思考下N + 1. 任何整除N的素数都不能整除N + 1. 而且因为所有整除N的素数都已经被找到了, 它们中也不存在能够整除N + 1的.P, P, P, P, P NP, P, P, P, P N + 1根据算术基本定理我们知道N + 1必定有个质因数P’, 它不是N + 1自身,也不是其它新的能够整除N + 1的素数。P’ N + 1在这两种情况下,我们找到了一个新的素数它却不在我们的原始列表中,但我们又假设了所有素数都在这个列表中。显然出了什么问题!但是从步骤2–4都是绝对有效的,唯一的可能性是我们在步骤1中的初始假设是错误的。这意味着一定有无穷多个的素数。欧几里得的解释是历史上第一个正式数学__证明__的例子 — 表明一个陈述一定是正确的 逻辑论证。这个例子通常被称为__反证法__:我们从一个假设开始,推断出一些不可能的事情,从而知道我们的假设一定是错误的。要显示更多内容,您必须完成以上所有活动和练习。 你被卡住了吗? 跳到下一步 要么 显示所有步骤接下来:素数的分布 Archie

素数(质数)判断的五种方法_判断质数-CSDN博客

>

素数(质数)判断的五种方法_判断质数-CSDN博客

素数(质数)判断的五种方法

K o a l a

于 2021-04-29 00:05:40 发布

阅读量6.8w

收藏

558

点赞数

144

分类专栏:

算法

文章标签:

java

算法

数据结构

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_43695957/article/details/116062333

版权

算法

专栏收录该内容

4 篇文章

6 订阅

订阅专栏

素数判断的五种方法

素数判断是我们写程序过程中经常遇见的一个问题,于是今天我简单地整理一下常用的素数判断的方法。

素数的介绍

素数定义

质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。

根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。                         --------360百科

第一种:暴力筛选法

思路分析

根据素数的定义,我们可以简单地想到:若要判断n是不是素数,我们可以直接写一个循环(i从2到n-1,进行n%i运算,即n能不能被i整除,如被整除即不是素数。若所有的i都不能整除,n即为素数)。

代码实现

boolean isPrime(int n){

for(int i=2;i

if(n%i==0){

return false;

break;

}

}

return true; // 反之则返回true

}

时间复杂度:O(n)

这时间复杂度一看就不咋乐观,于是我们简单优化一下。

boolean isPrime(int n){

for ( i=2; i<=(int)sqrt(n); i++ ){//如果n被i整除,则返回false

if(n%i==0){

return false;

break;

}

}

return true; // 反之则返回true

}

时间复杂度:O(sqrt(n))

优化原理:素数是因子为1和本身, 如果num不是素数,则还有其他因子,其中的因子,假如为a,b.其中必有一个大于sqrt(num) ,一个小于sqrt(num) 。所以必有一个小于或等于其平方根的因数,那么验证素数时就只需要验证到其平方根就可以了。即一个合数一定含有小于它平方根的质因子。

第二种:素数表筛选法

素数表筛选法一看名字就知道是将素数存到一个表中,然后对需要判断的数在表中查找,找了就是素数,找不到的即不是素数。

思路分析

如果一个数不能整除比它小的任何素数,那么这个数就是素数

顺便嘀咕一句,这种方法的效率贼低,看看就好,学习一下思路就行。

代码实现

/*

target:要查询的数字

count:素数表中素数的个数

PrimeArray:素数表数组

*/

boolean isPrime(int target, int count, int[] PrimeArray){

for (i = 0; i < count; i++){

if (target % PrimeArray[i] == 0){

return false;

break;

}

}

return true;

}

时间复杂度:O(n)

第三种:埃拉托斯特尼(Eratosthenes)筛法

思路分析

创建一个比范围上限大1的数组,我们只关注下标为 1 ~ N(要求的上限) 的数组元素与数组下标对应。 将数组初始化为1。然后用for循环,遍历范围为:[2 ~ sqrt(N)]。如果数组元素为1,则说明这个数组元素的下标所对应的数是素数。 随后我们将这个下标(除1以外)的整数倍所对应的数组元素全部置为0,也就是判断其为非素数。 这样,我们就知道了范围内(1 ~ 范围上限N)所有数是素数(下标对应的数组元素值为1)或不是素数(下标对应的数组元素值为0)

例子(N=25)

详细列出算法如下: 1、列出2以后的所有序列:  2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2、标出序列中的第一个素数,也就是2,序列变成:  2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 3、将剩下序列中,划掉2的倍数,序列变成:  2 3 5 7 9 11 13 15 17 19 21 23 25 4、如果这个序列中最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数,否则回到第二步。 5、本例中,因为25大于2的平方,我们返回第二步: 6、剩下的序列中第一个素数是3,将主序列中3的倍数划掉,主序列变成:  2 3 5 7 11 13 17 19 23 25 7、我们得到的素数有:2,3 8、25仍然大于3的平方,所以我们还要返回第二步: 9、序列中第一个素数是5,同样将序列中5的倍数划掉,主序列成:  2 3 5 7 11 13 17 19 23 10、我们得到的素数有:2,3,5 。 11、因为23小于5的平方,跳出循环。

结论:2到25之间的素数是:2 3 5 7 11 13 17 19 23。

代码实现

/*

target:要查询的数字

isprime:素数数组,大小至少为n+1

n:数值上界

*/

boolean isPrime(int target,int[] isprime, int n){

isprime[2]=0;

int k=2,tt=0;

while(tt

for(int i=1; i

if(i%k==0&&i!=k) isprime[i]=1;

}

for(int i=1; i

if(i>k&&isprime[i]==0){

k=i;

break;

}

}

tt++;

}

if(isprime[target]==1)return true;

else return false;

}

时间复杂度:O(n^3)

第四种:线性筛选–欧拉筛法

思路分析

在埃拉托斯特尼(Eratosthenes)筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。

代码实现

void PrimeList(int* Prime, bool* isPrime, int n) {

int i = 0, j = 0, count = 0;

if (isPrime != NULL) {//确保isPrime不是空指针

//将isPrime数组初始化为 1

for (i = 2; i <= N; i++) {

isPrime[i] = true;

}

}

if (isPrime != NULL && Prime != NULL) {

//从2遍历到范围上限N

for (i = 2; i <= N; i++) {

if (isPrime[i])//如果下标(下标对应着1 ~ 范围上限N)对应的isPrime值没有被置为false,说明这个数是素数,将下标放入素数数组

Prime[count++] = i;

//循环控制表达式的意义:j小于等于素数数组的个数 或 素数数组中的每一个素数与 i 的积小于范围上限N

for (j = 0; (j < count) && (Prime[j] * (long long)i) <= N; j++)//将i强制转换是因为vs上有warning,要求转换为宽类型防止算术溢出。数据上不产生影响

{

isPrime[i * Prime[j]] = false;//每一个素数的 i 倍(i >= 2)都不是素数,置为false

//这个是欧拉筛法的核心,它可以减少非素数置false的重复率

//意义是将每一个合数(非素数)拆成 2(最小因数)与最大因数 的乘积

if (i % Prime[j] == 0)

break;

}

}

}

}

时间复杂度:O(n)

第五种:欧拉筛法优化

由上面欧拉筛法的代码可见,欧拉筛法的代码也挺臃肿的,于是我们简单优化一下。

代码实现

boolean isPrime(int num) {

if (num <= 3) {

return num > 1;

}

// 不在6的倍数两侧的一定不是质数

if (num % 6 != 1 && num % 6 != 5) {

return false;

}

int sqrt = (int) Math.sqrt(num);

for (int i = 5; i <= sqrt; i += 6) {

if (num % i == 0 || num % (i + 2) == 0) {

return false;

}

}

return true;

}

结束语

本文部分参考以下文章: https://zhuanlan.zhihu.com/p/104314640

如有问题,欢迎留言交流,共同进步

优惠劵

K o a l a

关注

关注

144

点赞

558

收藏

觉得还不错?

一键收藏

知道了

15

评论

素数(质数)判断的五种方法

素数判断的五种方法素数的介绍素数定义质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。                        --------360百科第一种:暴力筛选法思路分析根据素数的

复制链接

扫一扫

专栏目录

15 条评论

您还未登录,请先

登录

后发表或查看评论

K o a l a

CSDN认证博客专家

CSDN认证企业博客

码龄5年

暂无认证

8

原创

103万+

周排名

59万+

总排名

9万+

访问

等级

324

积分

33

粉丝

198

获赞

43

评论

711

收藏

私信

关注

热门文章

素数(质数)判断的五种方法

67995

MyBatisPlus之逻辑删除

13323

浅谈Java中List的用法

3718

Java算法必备(背)之快读快输出

3124

最详细的Vue脚手架安装教程

2885

分类专栏

Java

5篇

算法

4篇

后端

2篇

开发工具

前端

1篇

教程

1篇

最新评论

Java算法必备(背)之快读快输出

Chasing Aurora:

我醉了,我理解错题了,我以为传送器的半径是i+k,随着城市变化,我还搞了个后缀数组怪不得不对,啊啊啊啊

Java算法必备(背)之快读快输出

Chasing Aurora:

好嘞哥,可是算法题超过这个方位的比较少吧,我是新手不知道

素数(质数)判断的五种方法

小小李程序员:

这么看来除了2,3以外,所有的素数都分布在6n的左侧或右侧或左右侧,然后只需要对6n-1和6n+1进行单独判断即可,也就是只需要判断number能否对6n-1或6n+1取余为0即可

素数(质数)判断的五种方法

2301_79712941:

那个暴力筛选法判断25,75是素数是肥事?

SpringBoot整合Dubbo2.7.8+zookeeper3.4.14(适合初学者)

「已注销」:

能不能出一期xml的方式进行配置

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

浅谈Java中List的用法

洛谷P1784 数独 题解 Java版&&C++版

MyBatisPlus之逻辑删除

2022年5篇

2021年3篇

目录

目录

分类专栏

Java

5篇

算法

4篇

后端

2篇

开发工具

前端

1篇

教程

1篇

目录

评论 15

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值