素数与第素数个素数的和能生成 内的所有偶数
1.概念介绍
加性组合中,两个集合
那么,能不能用整个素数集与另一个更小的集合求和集,来覆盖偶数集呢?最优情况是选一个
在探究过程中,一个新的发现是素数集
P=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43...]
和第素数个素数构成的集合
PP=[3, 5, 11, 17, 31, 41, 59, 67, 83, 109, 127, ...]
的和集
2.代码
本人编程所用的Python
代码如下:
from time import time def getPrimeSet_List_isPrime(n=10**6): """ 同时生成n以内的素数集合方便查找、isPrime数组方便o(1)查找、primeList方便遍历 """ n=max(2,n+1) isPrime=[True]*n isPrime[0]=False isPrime[1]=False for i in range(1,n,1): if isPrime[i]: for j in range(i*i,n,i): isPrime[j]=False primeList=[i for i in range(n) if isPrime[i]] primeSet=set(primeList) return primeSet,primeList,isPrime def 素数集与第素数个素数的和集能否覆盖n以内所有奇数或偶数(n=10**3,idxOffset=-1): """ 验证素数集与第素数个素数的和集能覆盖多少奇数、偶数 n idxOffset 奇数未覆盖率 偶数未覆盖率 未覆盖偶数 耗时 10^7 -1 1 4e-7 [2,4] 18s """ primeSet,primeList,isPrime=getPrimeSet_List_isPrime(n) print(f"{n=},{idxOffset=}") print(f"primeList={primeList[:50]}") pprimes=[primeList[i+idxOffset] for i in primeList if i+idxOffset<len(primeList)] print(f"primeprimeList={pprimes[:50]}") isCovered=[False]*(n+1) print("逐项集合查找法\n未覆盖的偶数:") pn=idxv=len(primeList) for e in range(2,n+1,2): for idx in primeList: if idx+idxOffset>=pn or primeList[idx+idxOffset]>e: break v=e-primeList[idx+idxOffset] if v in primeSet: isCovered[e]=True break if not isCovered[e]: print(e,end=",") print() uncoverdOddNums=[i for i in range(1,n+1,2) if isCovered[i]==False] uncoverdEvenNums=[i for i in range(2,n+1,2) if isCovered[i]==False] print(f"未覆盖偶数:{uncoverdEvenNums[:50]}...{uncoverdEvenNums[-50:]}") print(f"奇数未覆盖率{len(uncoverdOddNums)*2/n},偶数未覆盖率{len(uncoverdEvenNums)*2/n}") return uncoverdOddNums,uncoverdEvenNums if __name__=="__main__": startTime=time() 素数集与第素数个素数的和集能否覆盖n以内所有奇数或偶数() print(f"运行时间{time()-startTime}s")
刚开始程序采用双重循环暴力遍历,时间复杂度约为C++
,并采用多线程检查,效率更快,分别在3秒、8分钟内验证完C++
代码如下:
#include<iostream> #include<vector> #include<cmath> #include<thread> #include <mutex> #include <condition_variable> #include<stdlib.h> #include<ctime> #include<future> #include<algorithm> using namespace std; using ull=unsigned long long; mutex mtx; void printVector(vector<ull>&arr,ull startIdx=0,ull maxLen=50){ cout<<"{"; startIdx=fmax(0,startIdx); if(startIdx){ cout<<"...,"; } for(ull i=startIdx;i<fmin(arr.size(),startIdx+maxLen);i++){ cout<<arr[i]<<","; } if(startIdx+maxLen<arr.size()){ cout<<"..."; } cout<<"};"<<endl; return; } vector<ull>genePrimeList(ull n=10e+6){ n++; vector<bool>isPrime(n,true); vector<ull>primeList; for(ull i=2;i<n;i++){ if(isPrime[i]){ primeList.emplace_back(i); for(ull j=i*i;j<n;j+=i){ isPrime[j]=false; } } } return primeList; } ull n=1e9; vector<bool>isCovered(n/2+1,false);//索引[n/2]存偶数n vector<ull>primeList=genePrimeList(n),pprimes; ull pn=primeList.size(); bool coverEvenNumInterval(ull sten,ull eden){//二分搜索 ull idx; ull val; for(ull e=(sten/2)*2;e<eden;e+=2){ for(auto pidx:primeList){ if(pidx>pn||primeList[pidx-1]>e){ break; } val=e-primeList[pidx-1]; idx=lower_bound(primeList.begin(),primeList.end(),val)-primeList.begin(); if(idx<pn&&primeList[idx]==val){//如果想筛选素数集子序列,可增加一个条件,例 && idx%4==2 isCovered[e>>1]=true; break; } } if(isCovered[e>>1]==false){ unique_lock<mutex> lock(mtx);//不使用lock时多个线程的打印信息混杂在一起 cout<<"sten="<<sten<<", uncovered "<<e<<endl; lock.unlock(); } } return true; } vector<ull>primesAndPrimeOfPrimeIndexCoverEvenNumber_multiThread(ull n,int threadNum=8){ /** n是查找范围上限 indexOffset调整第素数个素数的索引,使变成第(素数+indexOffset)个素数 */ cout<<"n="<<n<<",threadNum="<<threadNum<<endl; cout<<"primeList="<<endl; printVector(primeList); vector<ull>intervalNodes; ull intervalLen=(n/threadNum+1); if(intervalLen&1){ intervalLen++; } for(int i=0;i<threadNum;i++){ intervalNodes.emplace_back(i*intervalLen); } intervalNodes.emplace_back(n+1); for(int i=0;i<threadNum;i++){ thread a(coverEvenNumInterval,intervalNodes[i],intervalNodes[i+1]); if(i<threadNum-1){ a.detach(); }else{ a.join(); } cout<<"thread end"<<endl; vector<ull>uncoveredEvenNumber; for(ull i=1;i<isCovered.size();i++){ if(isCovered[i]==false){ uncoveredEvenNumber.emplace_back(i<<1); } } cout<<"uncoveredEvenNumber size="<<uncoveredEvenNumber.size()<<"\n"; cout<<"head="<<endl; printVector(uncoveredEvenNumber); cout<<"end="<<endl; printVector(uncoveredEvenNumber,uncoveredEvenNumber.size()-50); return uncoveredEvenNumber; } int main(){ primesAndPrimeOfPrimeIndexCoverEvenNumber_multiThread(n); return 0; }
也许这个猜想已经有人以前说过了,有知道的的话麻烦说一下;这个猜想表述如此简单,被前人讨论过的几率还是挺大的。
即使最终被验证在更大范围内不正确,也已经是个有趣的巧合了。
3.总结及推广
素数集有序列表Primes=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43...]
,
用Primes[idx::d]
表示第一项为Primes[idx]、每隔d
个元素取一项形成的索引为等差数列的素数子集,
例如Primes[0::2]=[2, 5, 11, 17, 23, 31, 41...]
,
用Primes[idx::d]
与第素数个素数集
素数集子集 未覆盖偶数数量 primes=primes[0::1] [4,4] 共 1 个 primes[0::2] [4,1552] 共 37 个 primes[1::2] [4,992] 共 14 个 primes[0::4] [4,5704] 共 123 个 primes[1::4] [4,8534] 共 92 个 primes[0::8] [4,19654] 共 443 个
因此下一个猜想是:用素数集中的任意等差索引子序列primes[idx::d]与第素数个素数集的和集覆盖偶数集时,只会漏掉有限个偶数。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库