为什么我们检查一个素数的平方根以确定它是否为素数?
为了检验一个数是否为素数,为什么我们只能测试它是否可以整除到该数的平方根?
如果n
不是素数,则可以将其分解为两个因素a
和b
:
n = a*b
如果a
和b
都大于n
平方根,则a*b
将大于n
。 所以这些因素中至少有一个必须小于或等于n
平方根,为了检查n
是否是素数,我们只需要测试小于或等于平方根的因子。
假设m = sqrt(n)
那么m × m = n
。 现在,如果n
不是素数,那么n
可以写成n = a × b
,所以m × m = a × b
。 注意m
是一个实数,而n
, a
和b
是自然数。
现在可以有三种情况:
- a> m⇒b <m
- a = m⇒b = m
- a <m⇒b> m
在所有3种情况下, min(a, b) ≤ m
。 因此,如果我们搜索到m
,我们一定会发现至少有一个n
因子,这足以表明n
不是素数。
因为如果一个因子大于n的平方根,那么与其相乘的另一个因子等于n必然小于n的平方根。
更直观的解释是:
100的平方根是10.假设axb = 100,对于a和b的各种对。
如果a == b,则它们是相等的,并且是100的平方根。 这是10。
如果其中一个小于10,另一个必须更大。 例如,5 x 20 == 100.一个大于10,另一个小于10。
思考axb,如果其中一个倒下,另一个必须做大才能补偿,所以产品保持在100.它们绕着平方根旋转。
101的平方根约为10.049875621。 所以如果你测试素数为101的数字,你只需要尝试10到10的整数。但是8,9和10不是他们自己的素数,所以你只需要测试到7,这是主要。
因为如果有一对数大于10的数字之一,那么这一对中的另一个必须小于10.如果较小的一个不存在,则没有匹配的较大的因子101。
如果你正在测试121,那么平方根就是11.你必须测试1到11(包括1)的整数,看看它是否平均。 11次进11次,所以121次不是素数。 如果你已经停在10,而没有测试过11,那么你就错过了11。
假设您只测试奇数,您必须测试每个大于2的整数,但小于或等于平方根。
`
假设n
不是质数(大于1)。 所以有数字a
和b
这样的
n = ab (1 < a <= b < n)
通过将a
和b
的关系乘以a<=b
得到:
a^2 <= ab ab <= b^2
因此:(注意n=ab
)
a^2 <= n <= b^2
因此:(注意a
和b
是正数)
a <= sqrt(n) <= b
所以如果一个数(大于1)不是素数,而且我们测试的可分性达到数的平方根,我们会发现其中一个因素。
这只是分解和平方根的基本用法。
这看起来可能是抽象的,但事实上,它只是因为:非素数的最大可能因子必须是其平方根,因为:
sqrroot(n) * sqrroot(n) = n
。
假设,如果任何大于1
且小于或sqrroot(n)
均匀划分为n
,则n
不能是质数。
伪代码示例:
i = 2; is_prime = true; while loop (i <= sqrroot(n)) { if (n % i == 0) { is_prime = false; exit while; } ++i; }
假设给定的整数N
不是素数,
那么N可以因式分解成两个因子a
和b
, 2 <= a, b < N
使得N = a*b
。 显然,它们都不能同时大于sqrt(N)
。
让我们假设不失一般性, a
更小。
现在,如果找不到范围[2, sqrt(N)]
的N
除数,那么这是什么意思?
这意味着N
在[2, a]
中没有任何除数为a <= sqrt(N)
。
因此, a = 1
和b = n
,因此根据定义, N
是素数 。
…
进一步阅读,如果你不满意:
(a, b)
许多不同的组合可能是可能的。 假设他们是:
(a 1 ,b 1 ),(a 2 ,b 2 ),(a 3 ,b 3 ),…,(a k ,b k )。 不失一般性,假设i <b i , 1<= i <=k
。
现在,要能够证明N
不是素数,就足以证明我没有一个可以进一步因式分解。 而且我们也知道一个i <= sqrt(N)
,因此你需要检查直到sqrt(N)
,它将覆盖所有的i 。 因此,你将能够得出N
是否为素数的结论。
…
设n是非素数。 因此,它至少有两个大于1的整数因子。设f是n的这些因子中最小的。 假设f> sqrt n。 那么n / f是整数LTE sqrt n,因此小于f。 因此,f不能是n的最小因子。 减少和消除 n的最小因子必须是LTE sqrt n。
假设我们有一个数字“a”,它不是素数[不是素数/复合数字的意思是一个数字,可以用除1以外的数字平均分配。 例如,6可以被2或3,以及1或6等分。
6 = 1×6或6 = 2×3
所以现在如果“a”不是素数,那么它可以除以另外两个数字,让我们说这些数字是“b”和“c”。 意思是
α= B * C。
现在如果“b”或“c”中的任何一个比“a”的平方根大于“b”和“c”的乘积将大于“a”。
因此,“b”和“c”总是<=“a”的平方根以证明方程“a = b * c”。
由于上述原因,当我们测试一个数字是否为素数时,我们只检查该数字的平方根。
所以要检查一个数字N是不是Prime。 我们只需要检查N是否可以被数字<= SQROOT(N)整除。 这是因为,如果我们把N纳入任何2个因素中,就称X和Y,即。 N = X Y.因此,X和Y中的每一个不能小于SQROOT(N),因为那么 X和Y不能大于SQROOT(N),因为那么X * Y> N
因此,一个因子必须小于或等于SQROOT(N)(而另一个因子大于或等于SQROOT(N))。 所以要检查N是否是Prime,我们只需要检查那些数字<= SQROOT(N)。
为了检验一个数字的素数n ,我们可以期待一个循环,比如:
bool isPrime = true; for(int i = 2; i < n; i++){ if(n%i == 0){ isPrime = false; break; } }
上面的循环做的是这样的:对于给定的1 <i <n ,它检查n / i是否是一个整数(离开余数0)。 如果存在一个i,那么n / i是一个整数,那么我们可以肯定n不是素数,在这一点上循环终止。 如果没有我,n / i是一个整数,那么n是素数。
就像每个算法一样,我们问: 我们可以做得更好吗?
让我们看看上面的循环中发生了什么。
我的顺序是:i = 2,3,4,…,n-1
并且整数检查的顺序为:j = n / i,即n / 2,n / 3,n / 4,…,n /(n-1)
如果对于某些i = a,n / a是整数,那么n / a = k(整数)
或者n = ak,显然n> k> 1(如果k = 1,那么a = n,但是我从来没有达到n;如果k = n,那么a = 1,但是我从2开始)
而且,n / k = a,如上所述,a是i的值,所以n> a> 1。
所以,a和k都是1和n(独占)之间的整数。 因为,我到达该范围内的每个整数,在一些迭代i = a,并在其他一些迭代i = k。 如果n的素性检验对于min(a,k)失败,那么max(a,k)也将失败。 所以我们只需要检查这两种情况中的一种,除非min(a,k)= max(a,k)(其中两个检查减少到一),即a = k,在这一点上a * a = n意味着a = sqrt(n)。
换句话说,如果n的素性检验对某些i> = sqrt(n)(即max(a,k))失败了,那么对于某个i <= n也将失败(即min(a中,k))。 所以,如果我们对sqrt(n)运行i = 2的测试就足够了。