一、试除法判定某个数是否为质数
时间复杂度O( N \sqrt{N} N)
//是质数返回true
bool is_prime(int c)
{
if( c < 2 ) return false;
for(int i = 2 ; i <= c / i ; i ++ )
{
if(c % i == 0) return false;
}
return true;
}
二、求最大公约数——欧几里德算法
时间复杂度logN
int gcd(int a ,int b)
{
return b ? gcd ( b , a % b ): a ;
}
三、求某个数的欧拉函数 φ ( n ) \varphi (n) φ(n)
求解公式:
φ
(
n
)
=
n
∏
1
i
(
1
−
1
/
p
i
)
\varphi (n) = n\prod_{1}^{i} (1-1/p_{i})
φ(n)=n∏1i(1−1/pi)
代码:
int phi(int x)
{
int res = x ;
for(int i = 2 ; i <= x / i ; i ++ )
{
if( x % i == 0)
{
res = res / i * (i - 1);
while( x % i == 0 ) x /= i ;
}
}
if( x > 1 ) res = res / x * ( x - 1 );
return res;
}
四、快速幂
时间复杂度O(logN)
代码:
int kmi(int a ,int b ,int p)
{
int res = 1 % p;
while(b)
{
if( b & 1 ) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}