【学习笔记】素数和合数+欧拉函数


素数:因数只有 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$ 的质因数。
 
证明:(我的理解,可能不太严谨)
  1. 假如现在有一个数 $x$,那么 $x$ 和 $n$ 的公约数只有一个 $1$。
  2. 那我们先把 $n$ 分解质因数,$p_1,p_2,p_3....p_k$,我们不能让 $x$ 拥有因数 $p_i$。$(1 \le i \le k)$
  3. 我们现在要求的就是 $n$ 里面有多少个数的因数不含 $p_1,p_2,p_3...p_k$ ,这些数的个数。
  4. 我们先考虑不含 $p_1$ 的数的个数,这个很好求,是 $n(1-\dfrac{1}{p_1})$。可以理解为每 $p_1$ 个数就会有一个 $p_1$ 的倍数。(比如 $2$,每两个数中就有一个 $2$ 的倍数)
  5. 然后我们要在这不含 $p_1$ 的数中再筛出来也不含 $p_2$ 的数的个数。那就是  $n(1-\dfrac{1}{p_1}) \times (1-\dfrac{1}{p_2})$。
  6. 然后一直乘到 $p_k$。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM