首页 > 代码库 > Miller_Rabin、 Pollard_rho Template
Miller_Rabin、 Pollard_rho Template
Multiply and pow Function:
//计算 (a*b)%c. a,b都是ll的数,直接相乘可能溢出的// a,b,c <2^63ll mult_modq(ll a,ll b,ll c){ a %= c; b %= c; ll ret = 0; while(b){ if(b & 1){ret += a;ret %= c;} a <<= 1; if(a >= c)a %= c; b >>= 1; } return ret;}//计算 x^n %cll pow_mod(ll x,ll n,ll mod){ if(n == 1)return x%mod; x %= mod; ll tmp = x; ll ret = 1; while(n){ if(n & 1) ret = mult_mod(ret, tmp, mod); tmp = mult_mod(tmp, tmp, mod); n >>= 1; } return ret;}
Miller_Rabin Prime Number test:
return TRUE when Prime Number (BE POSSIBLITY)
return FALSE when not a Prime Number
//以a为基,n-1=x*2^t a^(n-1)=1(mod n) 验证n是不是合数//一定是合数返回true,不一定返回falsebool check(ll a,ll n,ll x,ll t){ ll ret = pow_mod(a, x, n); ll 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;}// Miller_Rabin()算法素数判定//是素数返回true.(可能是伪素数,但概率极小)//合数返回false;bool Miller_Rabin(ll n){ if(n < 2) return false; if(n == 2) return true; if((n & 1) == 0) return false;//偶数 ll x = n - 1; ll t = 0; while((x & 1) == 0){x >>= 1; ++t;} for(int i = 0; i <S ; ++i){ ll a = rand() % (n - 1) + 1; if(check(a,n,x,t)) return false;//合数 } return true;}
Pollard_rho Algorithm
The quality factor decomposition :
ll factor[100];//质因数分解结果(刚返回时是无序的)int tol;//质因数的个数。数组小标从0开始ll gcd(ll a,ll b){ if(a == 0) return 1; if(a < 0) return gcd(-a,b); while(b){ ll t = a % b; a = b; b = t; } return a;}ll Pollard_rho(ll x,ll c){ ll i = 1, k = 2; ll x0 = rand()%x; ll y = x0; while(1){ ++i; x0 = (mult_mod(x0,x0,x)+c)%x; ll d = gcd(y-x0,x); if(d != 1 && d != x) return d; if(y == x0) return x; if(i == k){y = x0; k += k;} }}//对n进行素因子分解void findfac(ll n){ if(Miller_Rabin(n)){ factor[tol++] = n; return; } ll p = n; while(p >= n) p = Pollard_rho(p,rand()%(n-1)+1); findfac(p); findfac(n/p);}
Miller_Rabin、 Pollard_rho Template
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。