有关素数的小问题

本篇写的是这样一个问题:
我们知道,素数是无限多个的,我们将素数集合从小到大进行编号,p1=2,p2=3,p3=5,p4=7,…,那么请问

p1+1=2+1=3、p1p2+1=23+1=7、p1p2p3+1=65+1=31都是素数,那么对所有的n,
p1
p2p3…*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都是素食呢?便成了问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值