//计算  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;
}
示例#2
0
文件: meicg.c 项目: akroptya/mcmc
/*
 * 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;}
    }
}