龙空技术网

《论三生原理》例:利用三生原理生成100以内素数

O夏日痴O 102

前言:

目前同学们对“生成大素数算法”大约比较着重,同学们都想要剖析一些“生成大素数算法”的相关资讯。那么小编在网摘上搜集了一些关于“生成大素数算法””的相关知识,希望姐妹们能喜欢,大家快快来学习一下吧!

一、基本内容

三生原理本质上是一条简明的素数通项公式,基本内容如下:

任意不小于5的奇数p可表为:

p=3(2n+1)+2(2n+m+1)

n∈N,m={0,1,2,3,4} ,

则p为素数当且仅当同时满足以下两个条件:

①3(2n+1)与2(2n+m+1)互素;

<p0(n=0、m=0),或当

≥…>pi(n、m不为0)>…p2>p1>p0(i=0、1、2…,pi满足条件①②)时p与pi互素。

二、一个例图

举例列表说明利用三生原理生成100以内素数的过程方法如下:

插入的例图较小,可直接看知乎原文链接:

三、编程代码

有赖一位知乎朋友(昵称:空白)支持提供了一段代码,即三生原理C++代码实现(时间复杂度O(n*sqrt(n),空间复杂度O(n))):

(知乎原文链接:)

#include<cstdio>#include<algorithm>using std::__gcd;int p[100000]={2,3},pos1=2,pos2=1;int main(){  for(int n=0;n<=10000;++n){    int t=3*(2*n+1);    for(int m=0;m<5;++m){      int d=2*(2*n+m+1),p1=t+d;      if(__gcd(t,d)>1)continue;	  if(p1>p[pos2]*p[pos2]/p1){      	if(pos2<pos1-1&&p1>p[pos2+1]*p[pos2+1]/p1)      	  ++pos2;		for(int i=0;i<=pos2;++i)		  if(__gcd(p1,p[i])>1)goto notp;		p[pos1++]=p1;		printf("%d ",p1),_sleep(30);	  }	  notp:;	}  }  getchar();}

标签: #生成大素数算法 #生成大素数算法实验报告