一、发文目的
本文主要阐述素数的概念,以通俗易懂的方式形象的描述素数和合数究竟代表什么意思,以及找到一种方法能够求得给定的数值范围内的素数。
二、文章大纲
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就不是合数,而是素数了)。
那么,现在知道了,如何求一个给定的整数范围内的素数方法了:
- 首先,对给定的整数,求平方根,得到I1(取整数);
- 然后,找到I1范围内的所有的素数,构成一个集合G
- 接着,依次将给定的整数范围内的整数,对集合G的素数,依次取模,若结果是0,那么说明这个整数是合数,则排除之;否则就是素数,保留;
- 以上收集的素数就是给定的整数范围内的所有的素数。
6,一个Python求素数的例子
根据上面讨论的方法,现在用Python实现一个程序来求给定的整数范围内的素数。
Python实现的代码(求给定整数范围内的素数)
验证结果: