/* Name: MillerRabin 素数测试。。。 Copyright: Author: Moon@Whu Date: 01-08-06 09:31 Description: 费尔马小定例 ( 如果p是素数,且0<a<p ,则a^(p-1)=1(mod p) 必要条件) + 二次探测(如果p是素数 则a*a%p==1的解只有 1,和p-1)。出错率1/(4^st)。。 */ #include <stdio.h> #include <stdlib.h> #include <time.h> int modxp(int a,int b,int c) //(a^b)%c.. { int i,j,k=1; while(b){ if(b&1) k=(k*a)%c; if(a*a%c==1&&a!=1&&a!=c-1) return 0;//二次探测。。 a = a*a%c; if(a==1) return k; b >>= 1; } return k; } int MillerRabin(int nt,int st)//nt为测试的数,st为测试次数。 { int i,j,k; if(nt<=3) return 1; srand((unsigned)time(NULL)); for(i=0; i<st; i++) if( modxp( rand()%(nt-2)+2,nt-1,nt)!=1) return 0; return 1; } int main() { int i,j,k; while(scanf("%d",&k)!=EOF) { if(MillerRabin(k,20)) printf("YES/n"); else printf("NO/n"); } return 0; } // n 久以前写的东西。。测了下基本能用,二次探测能在一定程度消除CaXX数的误判。。