本篇写的是这样一个问题:
我们知道,素数是无限多个的,我们将素数集合从小到大进行编号,p1=2,p2=3,p3=5,p4=7,…,那么请问
p1+1=2+1=3、p1p2+1=23+1=7、p1p2p3+1=65+1=31都是素数,那么对所有的n,
p1p2p3…*pn+1是素数吗?
我编码如下解决:
#include<stdio.h>
#include<math.h>
int primes[50000];
int prime(int n);
bool isPrime(int x);
int prime(int n){
if(primes[n]!=0)return primes[n];
else {
bool b=true;
int p=prime(n-1)+1;
// while(b){
// for(int i=0;i<n;i++)
// if(p%primes[i])
// {
// b=false;
// break;
// }
// if(!b){p++;b=true;}
// else {primes[n]=p;break;}
// }
while(!isPrime(p))p++;
primes[n]=p;
return primes[n];
}
}
bool isPrime(int x){
int i=0;
int r=prime(i);
while(r*r<=x){
if(x%r==0)return false;
else r=prime(i++);
}
return true;
}
int ppf(){
int k=0;
int r=2;
while(isPrime(r)){
r-=1;
r=r*prime(k)+1;
k++;
}
return k;
}
main(){
primes[0]=2;
printf("%d\n",ppf());
int p=30031;
int s=0;
while(p%prime(s)!=0)s++;
printf("@%d\n",prime(s));
for(int i=0;i<20;i++)
printf("primes[%d]=%d\n",i,primes[i]);
}
结果:当n=6时,P=p1p2p3p4p5*p6_+1=30031=59 X 509,它是使P不为素数最小的n。
这个问题提出源自于一个数论上著名的问题:素数是无限多个的一个证明:
```c
在《几何原本》的数论这一卷,欧几里得大体上是这样证明素数有无限多个的:
**证明:**假设素数有无限多个,设其为K个,并记这K个素数为:p1,p2,p3,...,pK,
考虑数P=p1*p2*p3*p4*...pK+1,它是否不是素数呢?由因式唯一分解定理即任何一个整数都可以唯一地分解成确定的几个素数的乘积,由此看来,若P不是素数,则P除了1和P本身以外,必有其他素数因子,而每个素数都大于1,P必不能被任何一个素数整除,于是得出了与唯一分解定理的矛盾。故素数有无限多个。
于是,似乎给出了构造除素数的一个公式了,但P是否对所有的n都是素食呢?便成了问题。