欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  新闻

什么是素数和质数,深度解读这两者之间的区别

程序员文章站 2024-03-26 17:40:17
一、发文目的本文主要阐述素数的概念,以通俗易懂的方式形象的描述素数和合数究竟代表什么意思,以及找到一种方法能够求得给定的数值范围内的素数。二、文章大纲1,素数的概念2,素数的形象的理解3,什么是合数4...

一、发文目的

本文主要阐述素数的概念,以通俗易懂的方式形象的描述素数和合数究竟代表什么意思,以及找到一种方法能够求得给定的数值范围内的素数。

二、文章大纲

1,素数的概念

2,素数的形象的理解

3,什么是合数

4,为什么1不是素数

5,如何求给定范围内的素数

6,一个python求素数的例子

素数又称质数,英文名称是prime number。

三、文章内容

1,素数的概念

关于素数,也叫质数,从字面意思可以想象,这种数有着基本,本质,原子的意思,也就是说,这种数是不能够再拆分的,是一个基本的,独立的原子个体。素数的定义是指在除了1和此整数本身外,不能被其他自然数整除的数(1除外)。

2,素数的形象的理解

可以想象,有一堆苹果,n个。假设苹果是不可切割的,现在需要你去给这堆苹果等份分给若干人。

有两种可能的结果,一种是可以再分成若干等份;一种是不能够再分了,苹果保存原样的一堆。

针对第二种情况(保持原样,不能再分),这堆苹果可以看成下面两种情形:

a,以单个苹果为一个个体,可以分成n个人,1(个)*n(人)

b,以n个苹果为一个整体,可以分给1个人,n(个)*1(人);

回到数的范畴,也就是说,如果一个整数n,只能被1或者自己整除,也就是说整数n只能表示为n=1*n,或者n=n*1的形式,即不能分成其他形式的等份了,那么这个数就叫做素数。

形象的理解为:一堆苹果,还是原来的那堆苹果,没有改变。

3,什么是合数

接着上面素数的概念,相反的情况,如果一堆苹果可以再分成n=a*b的形式(a,b不等于1或者n),那么就称n为合数。合数这个词,本身也代表了本身是可以由几个数合在一起的意思。

也以苹果为例,假设这堆苹果是15个,除了本身15这种状态之外,也可以分成3个一堆,共5堆(3*5)或者5个一堆,共3堆(5*3)这两种状态。即15不单单只能表示为15*1或者1*15,还可以表示成3*5或者5*3。也就是说,15除了被1和自己整除外,还可以被3或者5整除。

4,为什么1不是素数

其实,如果从本质的概念来说,1也可以称为素数,这个从上面的例子就可以看出。

之所以现在不能将1看成素数,原因在于,如果将1看成素数了,那么会使得合数的概念不统一。

合数,从上面第3点的分析,可以知道,合数n可以表示为n=a*b的形式(这里的a,b不等于1或者n)。

既然n=a*b,那么a,b有两种状态,要么是素数,要么是合数。why?

因为,数本身就只有这两种状态:要么只能被1或者本身整除,要么除此之外还能被其他数整除。因此,a,b这两个数可能是素数,可能是合数。

现在,我想对a,b做如下操作:如果是素数,则保持不变;如果是合数,那么继续分解为两个数的乘积的形式。

这样,一直持续操作下去,n=a*b,最终会以n=p1*p2*p3…的形式呈现(其中,p1,p2,p3…都是素数)。即一个合数,最终都会以素数的乘积表示。

现在回到本题的疑问,为什么1不是素数?

因为:1由于本身的特殊性(任意个1相乘还是1),导致一个合数n=p1*p2*p3,会有无数个表示式。即合数n,可以表示为:

n=p1*p2*p3

n=p1*p2*p3*1

n=p1*p2*p3*1*1

n=p1*p2*p3*1*1*1

……

所以,为了达到合数的表达式的唯一性,就人为的将1排除在了素数之外。

5,如何求给定范围内的素数

到这里,已经知道了素数和合数。那么如果想要求某个给定的数范围内的素数有哪些,应该怎么求。

比如,如何求10以内的素数?

根据常识,可以容易的想到10以内的素数有:2,3,5,7

如果不是10,而是100以内的素数呢?

难道是依次的去数,2,3,5,7,11,13,17,19…

如果不是100,而是1000以内的素数呢?

看来人为的靠自己的理解去数,会把自己数晕,不是解决问题的根本方法。

那么应该怎么去解决?

我认为,还是得从素数的概念入手:只能被1和自己本身整除的数。

也就是说,除了1和本身,不能被其他数整除的数。或者说,只要找到了一个能够被1和本身之外的数整除,那么就可以判定这个数就不是素数。

下面的目标,就是努力去找到这样的数。

先想一下不是素数的数是什么数?答案很明显,就是合数。合数有什么性质?合数可以表示为若干个素数的乘积。

既然是要求n以内的素数,那么肯定n以内的素数一定是在n以内;n以内的合数也是在n以内。n以内的合数可以表示为若干个素数的乘积,这里的素数也肯定是在n以内。

那么可以确定的知道n以内的某个合数必会至少能够被n以内的一个素数整除。如果能够找到这样的能够被n以内的合数整除的最大的素数k,那么就可以得到这样一组素数集(从2开始,最大值是k),将n以内的整数,依次与这组素数中的素数进行求余运算,根据求余结果是否是0,来判断整数是否是合数。即求余的结果不是0的整数就是素数了。

下面的问题是:已知整数范围n,如何求得能够被n以内的合数整除的最大的素数?

还是从合数的概念出发,一个合数必然可以表示为若干个素数的乘积。

至于合数分解成的素数的个数多少,这个就不确定了,可能是2个,也可能是3个,或者更多。

下面先给出一个结论:

假设一个合数m可以分解为3个素数的乘积,m=x1*x2*x3(x1<=x2<=x3),那么对m进行开3次方根,得到的结果取整数为i,i必然介于m的素数的中间,即i>=x1且i<=x3。以整数i内的素数构成一个素数集合g,那么g中必然存在素数x1;合数m越大,那么得到的i就越大,因而构成的素数集合g中的最大的素数也越大。设想,要使得找到最大的素数,那么必然要找到最大的i。在合数m最大的情况下,开方根次数越小,则此时找到的i才是最大的。那么开方次数最小是多少呢?显然就是开2次方根时(虽然开1次方根时,i最大,但此时的m就不是合数,而是素数了)。

那么,现在知道了,如何求一个给定的整数范围内的素数方法了:

  1. 首先,对给定的整数,求平方根,得到i1(取整数);
  2. 然后,找到i1范围内的所有的素数,构成一个集合g
  3. 接着,依次将给定的整数范围内的整数,对集合g的素数,依次取模,若结果是0,那么说明这个整数是合数,则排除之;否则就是素数,保留;
  4. 以上收集的素数就是给定的整数范围内的所有的素数。

6,一个python求素数的例子

根据上面讨论的方法,现在用python实现一个程序来求给定的整数范围内的素数。

什么是素数和质数,深度解读这两者之间的区别

python实现的代码(求给定整数范围内的素数)

验证结果:

什么是素数和质数,深度解读这两者之间的区别