tft每日頭條

 > 生活

 > n是否是素數函數

n是否是素數函數

生活 更新时间:2024-07-19 20:11:21

序:對于一個循環小數,我們用 ’……‘ 表示一個循環節,例如:1/3=0.3333……,記作:1/3=0.’3’;1/6=0.1666……,記作:1/6=0.1’6’;1/7=0.142857142857……,記作:1/7=0.’142857’.

一、例子:

1/7=0.’142857’,其循環節有6位,7是素數且7-6=1

1/17=0.’0588235294117647’,其循環節有16位,17是素數且17-16=1

1/19=0.’052631578947368421’,其循環節有18位,19是素數且19-18=1

1/23=0.’0434782608695652173913’,其循環節有22位,23是素數且23-22=1

1/29=0.’0344827586206896551724137931’,其循環節有28位,29是素數且29-28=1

……………………………………………………

經過檢驗在10^7即一千萬以内,共有222531個符合以上規律的數,它們都是素數,也就是:在一千萬以内共有222531個全循環素數。

二、結論:

由此得到猜想:n是一個不能被5整除的奇數,n的倒數必是一個純無限循環小數,如果它的循環節有n-1位,那麼n一定是素數。由于n的循環節位數隻比它本身小1并且n是素數,我們就把這樣的數n叫做全循環素數。

三、檢驗展示:

n是否是素數函數(若n的倒數的循環節有n-1位)1

四、檢驗程序:

//檢驗全循環素數:

#include <stdio.h>

#include <math.h> /*包含數學函數*/

int main ()

//先找出小于(2^31-1)的平方根的質數存入數組z[]

{ int z[4793]={2,3},g=1,i,x,q; //因46349以内共有素數4793個

for(i=5;i<=46349;i =2) //因46349的平方>2的31次方

{ x=1;q=sqrt(i); //每次都從第一個素數開始檢驗

while(i%z[x]!=0)

{ if(z[x]>q){g ;z[g]=i;break;} //i是素數時:累加素數個數,存儲,退出内循環

x ; //不确定時用下一個素數檢驗

}

}

int m,n,b,y,w,hg=0; //被除數b,餘數y,循環節位數w,合數個數hg

g=0;

printf("請輸入奇數範圍[m,n](用空格隔開):"); scanf("%d %d",&m,&n);

if(m%2==0) m ; //保證m從奇數開始

for(i=m;i<=n;i =2)

{ if(i%5!=0) //排除5的倍數

{ b=10;w=0;y=1; //被除數從10起,循環節位數置0,餘數置1

while (b>1) //當被除數不為1時(反複除直到餘數即被除數再次為1止):

{ y*=10; y%=i; //餘數*10變為被除數,求新的餘數

w ; b=y; //循環節位數加1,餘數給被除數

}

if(i-w==1) //若是全循環素數時:(如果改用i%w==1,則可檢驗部分循環素數)

{ g ; printf(" %d",i); //素數個數加1,輸出該數

x=1;q=sqrt(i); //每次都從第一個素數開始檢驗

while(z[x]<=q) //不能确定是素數時一直檢驗,直到确定是素數為止

{ if(i%z[x] ==0){ hg ; printf("%d不是素數\n",i);break;} //是合數時累加合數個數,退出循環

x ; //不能确定時用下一個素數檢驗

}

}

}

}

printf("\n[%d,%d]以内共有以上%d個全循環素數,其中有%d個不是素數",m,n,g-hg,hg);

}

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved