素数:因数只有 1 和它自己的数。只有两个因数的数。
合数:除了素数和 1 的数。/ 因数 $>2$。
假设现在有一个合数 $x$。$x$ 一定是由若干个小于它的质数组成的(分解质因数)。
Q1:如何判断一个数 $x$ 是不是素数?
如果 $x$ 只有两个因数($1$ 和 $x$)说明它是素数。
假如说 $x$ 是合数,那么 $x$ 除了 $1$ 和 $x$ 这两个因数必定至少还有一个因数 $y$。那么 $2≤y≤x-1$ 。那 $y$ 有三种情况:$\begin{cases}y<\sqrt{x}\\y=\sqrt{x}\\y>\sqrt{x}\end{cases}$
不管是这三种的哪一个,我们都可以看出来 $\dfrac{x}{y} / y \le \sqrt{x}$ (必定有一个因数是 $\le \sqrt{x}$),就是说只要 $x$ 是合数,那么一定能找到一个因数 $y$,$2 \le y \le \sqrt{x}$。反过来说,如果一个数 $x$ 找不到在 $2$ ~ $\sqrt{x}$ 范围里能整除 $x$ 的一个数 $y$,那 $x$ 就不是合数,是质数。($1$ 除外)
所以说,我们想判断 $x$ 是不是质数,只需要在 $2$ ~ $\sqrt{x}$ 这个范围里找一个能整除 $x$ 的数 $y$,如果能找到,就说明 $x$ 是合数,找不到,就说明 $x$ 是质数。
程序:
#include<bits/stdc++.h>
using namespace std;
int x;
int main(){
cin >> x;
if(x == 1){
cout << "No";
return 0;
}
for(int i=2; i<=sqrt(x); i++){
if(x%i == 0){
cout << "No";
return 0;
}
}
cout << "Yes";
return 0;
}
关于互质:
定义:如果 $a$ 和 $b$ 互质,则 $(a,b)=1$。($a$ 和 $b$ 只有一个公约数 $1$)
相邻的两个数互质。因为两个不互质的数至少至少也要相差 $2$,然而相邻的两个数相差 $1$。
欧拉函数:(互质拓展)
对正整数
$n$,欧拉函数是小于 $n$ 的正整数中与 $n$ 互质的数的数目。
$φ(n)=n(1-\dfrac{1}{p_1})(1-\dfrac{1}{p_2})(1-\dfrac{1}{p_3})(1-\dfrac{1}{p_4})...\times (1-\dfrac{1}{p_k})$
$P_i$ 表示 $n$ 的质因数。
证明:(我的理解,可能不太严谨)
- 假如现在有一个数 $x$,那么 $x$ 和 $n$ 的公约数只有一个 $1$。
- 那我们先把 $n$ 分解质因数,$p_1,p_2,p_3....p_k$,我们不能让 $x$ 拥有因数 $p_i$。$(1 \le i \le k)$
- 我们现在要求的就是 $n$ 里面有多少个数的因数不含 $p_1,p_2,p_3...p_k$ ,这些数的个数。
- 我们先考虑不含 $p_1$ 的数的个数,这个很好求,是 $n(1-\dfrac{1}{p_1})$。可以理解为每 $p_1$ 个数就会有一个 $p_1$ 的倍数。(比如 $2$,每两个数中就有一个 $2$ 的倍数)
- 然后我们要在这不含 $p_1$ 的数中再筛出来也不含 $p_2$ 的数的个数。那就是 $n(1-\dfrac{1}{p_1}) \times (1-\dfrac{1}{p_2})$。
- 然后一直乘到 $p_k$。