//计算 x^n %c long long pow_mod(long long x,long long n,long long mod){ if(n==1)return x%mod; x%=mod; long long tmp=x; long long ret=1; while(n){ if(n&1) ret=mult_mod(ret,tmp,mod); tmp=mult_mod(tmp,tmp,mod); n>>=1; } return ret; }
/* * prng_meicg_get_next_int: Return next mEICG number (unscaled) * * Input: * gen: Pointer to a struct prng. * */ inline prng_num prng_meicg_get_next_int(struct prng *gen) { s_prng_num an, sum, inv, n; n = gen->data.meicg_data.next_n; an = mult_mod(n, & (gen->data.meicg_data.mm)); add_mod(sum,an,gen->data.meicg_data.b,gen->data.meicg_data.p); if (++gen->data.meicg_data.next_n == gen->data.meicg_data.p ) gen->data.meicg_data.next_n = 0; inv = prng_inverse(sum,gen->data.meicg_data.p); if (gen->data.meicg_data.simple_square) /* can use straight f. ? */ { return((n * inv ) % gen->data.meicg_data.p); } else { #ifdef HAVE_LONGLONG return(mult_mod_ll(n,inv,gen->data.meicg_data.p)); #else return(mult_mod_generic(n,inv,gen->data.meicg_data.p)); #endif } /* not reached */ }
//以a为基,n-1=x*2^t a^(n-1)=1(mod n) 验证n是不是合数 //一定是合数返回true,不一定返回false bool check(long long a,long long n,long long x,long long t){ long long ret=pow_mod(a,x,n); long long last=ret; for(int i=1;i<=t;i++){ ret=mult_mod(ret,ret,n); if(ret==1&&last!=1&&last!=n-1) return true;//合数 last=ret; } if(ret!=1) return true; return false; }
long long Pollard_rho(long long x,long long c){ long long i=1,k=2; long long x0=rand()%x; long long y=x0; while(1){ i++; x0=(mult_mod(x0,x0,x)+c)%x; long long d=gcd(y-x0,x); if(d!=1&&d!=x) return d; if(y==x0) return x; if(i==k){y=x0;k+=k;} } }