判断一个数是质数最快的方法?为什么?
不明白。为什么,望指教
/**
n>=3 and n is odd.
*/
int isPrime(int n)
{
int k, upperBound=n/2;
for(k=3; k<=upperBound; k+=2)
{
upperBound=n/k;
if(n%k==0)
return 0;
}
return 1;
}
[解决办法]
假设n=A*B 则只需要测试不大于min(A,B)的数就能找到n的一个因子,每次加2而不会漏掉因子二是因为假设
n=2*A(则经过有限次后k会到达A),能找到n的一个因子A,同样不会误判n为素数
[解决办法]
upperBound=n/k;
假设2~k都已经测试过不是n的因子,但n是合数,设n=A*B,则 B=n/A < n/k (K<A)
因此如果n是合数,则它的一个因子一定落在[0 n/k]内
[解决办法]
换言之,一个数N,你为了判断它是否为质数,就开始试除3、5、7...但是,如果当除以(N^1/2取整,记为m)这个数的时候还没有能够除尽,那么就没有继续下去的必要了。因为假设N存在一个比m大的因数k,那么N/k是小于m的,这跟上述条件(N除以3、5、7...m都不能除尽)产生了矛盾
[解决办法]
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着很重要的地位。
最小的素数是2, 他也是唯一的偶素数。 最前面的素数依次排列为:2,3,5,7,11,13,17,...... 不是质数且大于1的正整数称为合数。 质数表上的质数请见素数表。 依据定义得公式: 设A=n2+b=(n-x)(n+y),除n-x=1以外无正整数。故有: y=(b+nx)/(n-x) (x<N-1)无正整数,则A为素数。 因为x<N-1,而且N-X必为奇数,所以计算量比常规少很多。 详见互动百科素数分布和不定方程 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 (共25个)
[解决办法]
算术基本定理
算术基本定理: 任何大于1的正整数n可以唯一表示成有限个素数的乘积: n=p_1p_2...p_s, 这里p_1≦p_2 ≦...≦p_s是素数。 这一表达式也称为n的标准分解式。 算术基本定理是初等数论中最基本的定理。由此定理, 我们可以重新定义两个整数的最大公因子和最小公倍数等等概念。 1不能称作素数,是因为要确保算术基本定理所要求的唯一性成立。这一解释可参看华罗庚《数论导引》
[编辑本段]素数分布问题
素数分布问题,就是指素数在正整数集或其特殊子集中的分布情况,比如素数个数问题等等。这方面的结果如下; (1)欧几里得以反证法证明了素数个数无限;欧拉利用解析方法也证明了此结论。 (2)高斯提出著名的素数定理(当时是猜想,后被证明): 设π(x)是不超过x的素数个数, 那么极限(x趋向于无穷) lim π(x)/(x/Ln x)=1 更好的逼近公式有高斯提出的li(x)函数, 即lim π(x)/lix=1。 其中 (3) 狄利克雷 证明了任何等差数列: a, a+d,a+2d,...a+nd,... (这里a,d互质)中都包含无限个素数。 (4) 兰伯特猜想(已被证明): 在n和2n之间必定存在一个素数, 这里n是大于1的正整数。
[解决办法]
说快的话,LZ给的方法不算太快,当n很大的时候,效率比较低。
一般常用的是米勒-罗宾,log(n)^2应该可以搞定,前几年,印度的科学家给出了一种测试方法,
是确定的并且时间复杂度为常数,不过常数比较大,大概10^8左右,在实际应用当中,一般比不上米勒-罗宾。
[解决办法]