数论笔记(1)
模运算的性质:
- 加法:
\[(A+B)\bmod C = (A \bmod C + B \bmod C) \bmod C
\]
- 乘法:
\[(A \times B) \bmod C = (A \bmod C \times B \bmod C) \bmod C
\]
- 减法:
\[(A - B) \bmod C = [(A \bmod C - B \bmod C)+C] \bmod C
\]
快速幂:
因为 \(a^b\) 可以看成 \(a^{(b)_2}\)。
所以 \(a^b\) 可以表达成为 \(a^{2^i}\),证明如下:
\[\begin{array}{}
\because a^{b+c} = a^ba^c\\\\
\because b = \sum_{i}^{\operatorname{len}(b)}2^i\\\\
\therefore a^{\sum_{i}^{\operatorname{len}(b)}2^i} = \prod_i^{\operatorname{len}(b)}a^{2^i}
\end{array}{}
\]
于是,我们可以根据此性质加以位运算就能快速算出幂的大小.。
long long fastfac(long long a,long long b){
long long ans = 1;
while(b>0){
if(b&1)
ans = ans * a;
b >>= 1;
a = a * a;
}
return ans;
}
欧拉函数 \(\varphi\):
-
作用:用于求得小于 \(n\) 的正整数中与 \(n\) 互质的数的个数。
-
计算式:
\[\varphi(n) = n \times \prod_{p\mid n}\frac{p-1}{p}
\]
- 证明:
\[ \begin{array}{}
\because n = p_1^{a_1} \times p_2^{a_2} \times p_3^{a_3} \times ... \times p_k^{a_k}\\
\\
\therefore \varphi(n) = \varphi(p_1^{a_1}) \times \varphi(p_2^{a_2}) \times ... \times \varphi(p_k^{a_k})\\
\\
\because \varphi(p^k) = p^{k-1}(p-1)\\
\\
\therefore \varphi(p^k) = p^k(1-\dfrac 1p)\\
\\
\therefore \varphi(n) = p_1^{a_1}(1-\dfrac{1}{p_1}) \times p_2^{a_2}(1-\dfrac{1}{p_2})\times ... \times p_k^{a_k}(1-\dfrac{1}{p_k})
\end{array}{}
\]
整理算式,可知:
\[\begin{array}{}
\varphi(n) = \prod_{p\mid n}p^a\prod_{p\mid n}(1-\dfrac{1}{p})\\\\
\because n = \prod_{p\mid n}p^a\\\\
\therefore \varphi(n) = n \times \prod_{p\mid n} (1-\dfrac 1p)
\end{array}
\]
- 性质:
- 当 \(p\) 为质数时,则有:\(\varphi(p) = p-1\)。
- 当 \(p\) 为质数时,则有:\(\varphi(p^k) = p^{k-1}(p-1) = p^k(1-\dfrac 1p) = p^k(\dfrac {p-1}{p})\)。
- \(\varphi\) 为积性函数,即:\(\varphi(mn) = \varphi(m)\times\varphi(n)\)。
- 当 \(p\) 为质数时,若 \(p\mid n\) 且 \(p^2\mid n\),则有 \(\varphi(n) = \varphi(\dfrac np) \times p\)。
- 当 \(p\) 为质数时,若 \(p\mid n\) 且 \(p^2\) 不是 \(n\) 的因子,则有 \(\varphi(n) = \varphi(\dfrac np) \times (p-1)\)。
- \(\forall n \in N , n = \sum_{d\mid n} \varphi(d)\)。
- \(\forall n > 1 , 1 \sim n\) 中与 \(n\) 互质的数的和为:\(\dfrac{n\times \varphi(n)}{2}\)。
- 实现:一般使用欧拉筛来求 \(\varphi\):
int phi(int num) {
int fin = sqrt(num);
int ans = num;
for (int i = 2; i <= fin; i++) {
if (num % i == 0) {
ans /= i;
ans *= (i - 1);
}
while (num % i == 0)
num /= i;
}
if (num > 1) {
ans /= num;
ans *= (num - 1);
}
return ans;
}
\(\gcd(a,b)\) 和 \(\operatorname{lcm}(a,b)\):
- \(\gcd(a,b)\):
- 作用:求得 \(a\),\(b\) 的最大公因数。
- 性质:
- \(\gcd(a,b)=\gcd(b,a)\)。
- \(\gcd(a,b) = gcd(-a,b)\)。
- \(gcd(a,b) = gcd(|a|,|b|)\)。
- 若有 \(d\mid a\) 且 \(d\mid b\),则 \(d\mid\gcd(a,b)\)。
- \(\gcd(a,0) = a\)。
- \(\gcd(a,ka) = a\)。
- \(\gcd(an,bn) = n \gcd(a,b)\)。
- \(\gcd(a,b) = \gcd(a,ka+b)\)。
- 实现:辗转相除法(欧几里得算法):
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
-
\(\operatorname{lcm}(a,b)\):
-
作用:求得 \(a\),\(b\) 的最小公倍数。
-
性质:
- \(\gcd(a,b) \times \operatorname{lcm}(a,b) = a \times b\)。
- 若有 \(a\mid m\) 且 \(b\mid m\),那么 \(\operatorname{lcm}(a,b)\mid m\)。
- 若 \(m,a,b\) 是正整数,那么 \(\operatorname{lcm}(ma,mb) = m\times\operatorname{lcm}(a,b)\)
-
求 \(n\) 个数的最小公倍数(\(n\ge2\)):
-
\[ \begin{array}{}
\operatorname{lcm}(a_1,a_2) = \dfrac{a_1a_2}{\gcd(a_1,a_2)}\\\\
\operatorname{lcm}(a_1,a_2,a_3) = \operatorname{lcm}(\operatorname{lcm}(a_1,a_2),a_3)
\end{array}
\]
- 实现:
long long lcm(const int a[], int n) {
long long ans = 1;
for (int i = 1; i <= n; i++)
ans = ans * a[i] / gcd(ans, a[i]);
return ans;
}
互质:
-
定义:\(\forall a,b \in N\),若 \(\gcd(a,b) = 1\),那么就说 \(a,b\) 互质,若 \(n\) 个整数的最大公因数是 \(1\),那么就说这 \(n\) 个数两两互质。
-
推论:\(a,b\) 互质 \(\Longleftrightarrow\) \(\gcd(a,b) = 1\)。
-
性质:
-
两个不同的质数一定是互质的。
-
一个质数和另一个不为它倍数的数是互质的。
-
\(1\) 既不是质数,也不是合数。
-
\(1\) 与任意一个数(除了 \(1\) 本身)都是互质的。
-
相邻的两个自然数是互质的。
-
相邻的两个奇数是互质的。
-
较大数是质数的两个数是互质的。
-

浙公网安备 33010602011771号