日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言判断素数squ,poj1811——Prime Test//素数判断+整数分解因子

發布時間:2024/4/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言判断素数squ,poj1811——Prime Test//素数判断+整数分解因子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給定N,如果N為素數,輸出“Prime”,否則輸出其最小因子。

思路:用miller_rabin判斷素數,pollardRho用于整數因子的分解。整數因子分解還有一個更快的算法:SQUFOF。

#include

#include

#include

#include

#include

#define time 8

#define call 200

using namespace std;

__int64 min_num;

//============================素數判斷====================================//

__int64 mod_mult(__int64 a,__int64 b,__int64 n)//返回 (a*b)%n

{

a=a%n;

__int64 res=0;

while(b)

{

if(b&1)

{

res+=a;

if(res>=n) res-=n;

}

a=a<<1;

if(a>=n) a-=n;

b=b>>1;

}

return res;

}

__int64 mod_exp(__int64 a,__int64 b,__int64 n)//返回(a^b)mod n

{

a=a%n;

__int64 res=1;

while(b>=1)

{

if(b&1)

res=mod_mult(res,a,n);

a=mod_mult(a,a,n);

b=b>>1;

}

return res;

}

bool witness(__int64 a,__int64 n)

{

__int64 m,x,y;

int i,j=0;

m=n-1;

while(m%2==0)

{

m=m>>1;

j++;

}

x=mod_exp(a,m,n);

for(i=1;i<=j;i++)

{

y=mod_exp(x,2,n);

if(y==1&&x!=1 &&x!=n-1) return true;//二次探測

x=y;

}

if(y!=1)

return true;

return false;

}

bool miller_rabin(__int64 n,int s)

{

if(n==1) return true;

if(n==2) return false;

if(n%2==0) return true;

for(int i=1;i<=s;i++)//s次試探

{

__int64 a=rand()%(n-1)+1;

if(witness(a,n))

return true;

}

return false;//為素數

}

//=======================分解整數因子============================================//

__int64 gcd(__int64 a,__int64 b)

{

if(b==0) return a;

return gcd(b,a%b);

}

__int64 pollardRho(__int64 n,int c)

{

int i=1;

__int64 x=rand()%n;

__int64 y=x;

int k=2;

while(1)

{

i=i+1;

x=(mod_exp(x,2,n)+c)%n;

__int64 d=gcd(y-x,n);

if(1

if(y==x) return n;

if(i==k)

{

y=x;

k=k*2;

}

}

}

void getsmallest(__int64 n,int c)

{

if(n==1) return ;

if(miller_rabin(n,time)==false)//如果為素數

{

if(n

return ;

}

__int64 val=n;

while(val==n)

val=pollardRho(n,c--);

getsmallest(val,c);//二分

getsmallest(n/val,c);

}

//======================================================================//

int main()

{

int test;

cin>>test;

__int64 n;

while(test--)

{

scanf("%I64d",&n);

if(miller_rabin(n,time)==false )

cout<

else

{

min_num=n;

getsmallest(n,call);

cout<

}

}

return 0;

}

總結

以上是生活随笔為你收集整理的c语言判断素数squ,poj1811——Prime Test//素数判断+整数分解因子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。