满足哥德巴赫猜想的最稀素数集生成程序。还有满足「哥德巴赫猜想效应」(不要求是素数)的最简数集生成程序。
「哥德巴赫猜想效应」指在一个属于等距集合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处重新开始。