满足哥德巴赫猜想的最简素数集生成方法(C++代码)

满足哥德巴赫猜想的最稀素数集生成程序。还有满足「哥德巴赫猜想效应」(不要求是素数)的最简数集生成程序。

「哥德巴赫猜想效应」指在一个属于等距集合M(或属于等距集合M的等距拓展)的集合m内选取数生成最终数集ε,使仅使用最终数集ε的数两两相加除2就可以铺满整个大数集M。我们称该数集m对大数集M满足哥德巴赫猜想效应。

//'属于...的等距拓展'是为了方便研究无穷集的一段。

素数集m对非1的正整数集M满足哥德巴赫猜想效应。这个关系中生成的最终数集ε:

100000以内,有9592个素数,

但只需要用805个素数就可以使100000以内的偶数满足哥德巴赫猜想。

足以见ε要稀疏很多。

感觉研究这个最简数集生成程序的可生存问题:就是在哪个集子m里取数作为最终数集ε,对原集m有一定的密度要求,否则就对大数集M不满足「效应」。感觉这个对解决哥德巴赫猜想有很大意义。

还可拓展到环形集M,闭集M,双向无穷集M时对原集m的要求。

----------------------------------------

由此,为证哥德巴赫猜想,

就要研究对非1正整数集M满足哥德巴赫猜想效应的m究竟如何取,才能使生成程序能取出有效的ε。(对等间距单无穷集M最简ε生成程序具有通性)。

由此得出关于m的「规律」,在证明素数集满足该「规律」就可给哥德巴赫猜想写上QED了。

----------------------------------------

「规律1」(关于m的必要条件)对正整数集(非1整数集可平移得到类似结论)对于任意数N,m在N+1到2N内必有取值。否则N不可能被铺出来。

----------------------------------------

<歌猜外推极简数集生成程序4.0>(含应对特殊情况达到完全最简的方案)

排放2N内素数star使N内铺满(非1正整数是M,素数是m,star是ε)

//将整个1轴表示出来,设3,5为star,标3,5的flag=1,因为(3+5)/2==4所以4的flag为1, 
//从4开始数,到6发现flag为0,

//为能够生成,用3,5生成table={9,7},table与素数集取交集得{7},从7开始选,
//7与之前的star逐步向加除2,因为(3+7)/2==5其flag==1, 故7的waste++,
//因为7的waste最小,pick=7,令7为新的star; 
//标7的flag=1;因为(3+7)/2==5,故标5的flag=1;因为(5+7)/2==6,故标6的falg=1;
//从6开始数,到8的flag为0,

//为能够生成,用3,5,7生成table={13,11,9},table与素数取交集得{13,11},从13开始选,
//13与之前的star逐步向加除2 因为没有flag==1,故13得waste=0; 
//11与之前的star逐步向加除2,因为(3+11) /2==7其flag==1, 故11的waste++,
//因为13的waste最小,pick=13,令13为新的star;
//标13的flag=1;因为(3+13)/2==8,故标8的flag=1;因为(5+13)/2==9,故标9的flag=1; 因为(7+13)/2==10,故标10的flag=1; 
//从8开始数,到11发现flag为0,


//为能够生成,用3,5,7,13生成table={15,13,9}(注意使其元素大于Mstar),从15开始选,...

#include<bits/stdc++.h>
using namespace std;
#define N 50000



bool cmp(int a, int b){
	return a>b;
}

//素数生成 
int arr[2*N]={2,3,5};
int p_len=3;
void primenum(int n, int arr[]);

bool flag[2*N]={0};//从一开始该数是否可生成;
int star[N]={0};
int main(){
	primenum(N, arr);
	
	star[0]=3;
	flag[3]=1;
	
	star[1]=5;
	flag[5]=1;
	
	int len=2;//star长度; 
	int Mstar=5;//MAX star;
	
	for(int i=0;i<len-1;i++){
			flag[(star[i]+Mstar)/2]=1;
	}
	int n=6;//n表示上一个flag=0的最小数;
	
	while(n<=N){
		
		int table[N]={0};
		int l1=0;//table未与素数取交集时的长度 
		int l=0;//table最终长度
		int waste[N]={0};//与table对应,表示table那一位的选取价值; 
		for(;l1<len;l1++){
			table[l1]=(2*n-star[l1]);
		}
		
		l=l1;
		bool flag2[N]={0};//与未与素数取交集的table对应,表示其是否出现; 
		for(int i=0;i<l1;i++){
			for(int j=0;arr[j]<2*n;j++){
				if(arr[j]==table[i]) flag2[i]=1;
			}
			if(flag2[i]==0) {
				table[i]=0;
				l--;
			}
		} 
		sort(table,table+l1,cmp);
		
		for(int i=0;i<l;i++){
			for(int j=0;j<len;j++){
				if(flag[(table[i]+star[j])/2]==1) waste[i]++;
			} 
		}
		int pick=0;
		for(int i=1;i<l;i++){
			if(waste[pick]>waste[i]) pick=i;
		}
		
		star[len++]=table[pick];
		flag[table[pick]]=1;
		if(table[pick]>Mstar) Mstar=table[pick];
		sort(star,star+len);
		
		
		for(int i=0;i<len;i++){
			flag[(star[i]+table[pick])/2]=1;
		}
		for(int i=n;;i++){
			if(flag[i]==0){
				n=i;
				break;
			}
		}
	}
	printf("\nstar序列:\n");
	for(int i=0;star[i]!=0;i++){
		printf("%d ",star[i]);
	}

	printf("\n无法填充的数字:%d",n);
	printf("\nstar长度:%d",len);
	printf("\nstar序列间隔:\n");
	for(int i=1;star[i]!=0;i++){
		printf("%d ",(star[i]-star[i-1])/2);
	}
	printf("\n\n");
	for(int i=0;i<N;i++){
		printf("%d ",flag[i]);
	}

	

}
	





void primenum(int n, int arr[]){
    for(int i=6;i<2*n;i++){//从6开始生成素数
        bool flag= true;
        for(int j=0;arr[j]<=sqrt(i);j++){
            if(i % arr[j] ==0){
                flag=false;
                break;
            }
        }
        if(flag == true){
        	p_len++;
        	arr[p_len-1]=i;
    	}
	}
	printf("素数个数:%d\n", p_len);
	for(int i=0;i<p_len;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	
	
}




//可能崩掉:已生成序列没有选某个n的对素数中前面小的,
//为解决该问题,并保持最简,应在出现没有在m中找到数对时,
//再执行一步在m中从头查找的操作,若找到应从其较小m处重新开始。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值