初学数论
学得十分肤浅
判断质数
for(i = 2;i * i <= n;i++)
if(n % i == 0)
{
able = 1;
break;
}
判断1~n范围内的质数
inline void sieve(int x)
{
int i,j;
prime[1] = 1;
for(i = 2;i * i <= x;i++)
if(!prime[i])
for(j = i * i;j <= x;j += i) prime[j] = 1;
}
然后学的是
整数的唯一分解
对于(forall)n
可表示为n = (sum_{i = 1,p|n}^{m_i}) (p^{w_i}_i)
//factorize
for(i = 2;i * i <= n;i++)
{
if(!vis[i])
{
p[++k] = i;
while(n % i == 0)
n /= i,w[k]++;
}
}
if(n != 1) p[++k] = n,w[k]++;
最小公倍数和最大公约数(gcd&&lcm)
对于(forall) a,b(in) Z
辗转相除法
inline LL gcd(LL a,LL b)
{
if(a < b) exchange(a,b);
if(b == 0) return a;
return gcd(b,a % b);
}
还可以用整数的唯一分解来求
(gcd(a,b) = sum^{max(m_a,m_b)}_{i=1}p_i^{min(w_{ai},w_{bi})})
(lcm(a,b) = sum^{max(m_a,m_b)}_{i=1}p_i^{max(w_{ai},w_{bi})})
(a * b = gcd(a,b) * lcm(a,b)) 有重要作用
(forall)n的约数个数
d(n) = (prod_{i=1}^m(w_i+1))
乘法原理,+1指的指数取0
(forall)n的约数之和
s(n) = (prod_{i=1}^msum_{j=0}^{w_j}p_i^j)
清晰易懂 不解释
同余
a (equiv) b(mod m)
有性质
1: a (equiv) b(mod m) (Rightarrow) b (equiv) a(mod m)
2: a (equiv) b(mod m) , b (equiv) c(mod m)(Rightarrow) a (equiv) c(mod m)
3: a (equiv) b(mod m) (Leftrightarrow) m|(a - b)
4: a (equiv) b(mod m) , n|m 那么 a (equiv) b(mod n)
欧拉函数
看看 这位帅哥叫欧拉(滑稽
(phi(n)) 小于n的正整数中与n互质的数的数目
(phi(n)) = n * (prod_{i=1}^m(1 - frac{1}{p_i}))
计算(phi(n))
inline int phi(int n)
{
int i,res = n;
for(i = 2;i * i <= n;i++)
{
if(n % i == 0)
res = res / i * (i - 1);
while(n % i == 0) n /= i;
}
if(n > 1) res = res / n * (n - 1);
return res;
}
计算(phi(i))(1<=i<=n)
inline void sieve(int n)
{
phi[1] = 1;
int i,j;
for(i = 2;i <= n;i++)
{
if(!vis[i])
{
prime[++pn] = i;
phi[i] = i - 1;
}
for(j = 1;j <= pn&&prime[j] * i <= n;j++)
{
vis[prime[j] * i] = 1;
if(i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
//注释1
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
/*积性函数f(a*b) = f(a) * f(b)(gcd(a,b) = 1)
phi[prime[j] - 1] = prime[j] - 1(prime[j]为质数)
*/
}
}
}
注释1:phi[i * prime[j] = n * prime[j] * (prod_{i=1}^m(1 - frac{1}{p_i}))
费马小定理
若有质数p,gcd(p,a) = 1
则有 (a^{p-1}) (equiv) 1(mod p)
二次探测定理
(x^2) (equiv) 1(mod p)
当 p 为奇质数时
(x_1 = 1),(x_2 = p - 1)
威尔逊定理
(p是质数Leftrightarrow (p - 1)! equiv -1(mod p))