互质与欧拉函数学习笔记

互质与欧拉函数学习笔记

互质

定义:

\(\forall a,b\in \N\) ,若 \(gcd(a,b)=1\) ,则称 \(a,b\) 互质。

积性函数

定义:

​ 如果 \(a,b\) 互质时,有 \(f(ab)=f(a)*f(b)\) ,那么称函数 \(f\) 为积性函数。

性质:

​ 若 \(f\) 为积性函数,且在算数基本定理中, \(n=\prod\limits_{i=1}^m p_i^{c_i}\) ,则 \(f(n)=\prod\limits_{i=1}^m f(p_i^{c_i})\)

欧拉函数

  • 定义:

\(1\sim N\) 中与 \(N\) 互质的数的个数被称为欧拉函数,记为 \(\varphi(N)\)

若在算数基本定理中, \(N=p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m}\) ,则: \(\varphi(N)=N*\frac{p_1-1}{p_1}*\frac{p_2-1}{p_2}\cdots\frac{p_m-1}{p_m}=N*\prod\limits_{质数p\mid N}(1-\frac{1}{p})\)

证明:

​ 设 \(p\)\(N\) 的质因子, \(1\sim N\)\(p\) 的倍数共有 \(N/p\) 个。同理,若 \(q\) 也是 \(N\) 的质因数,则 \(1\sim N\)\(q\) 的倍数有 \(N/q\) 个。若我们将这 \(N/p+N/q\) 个数去掉,那么 \(p*q\) 的倍数被排除了两次,需要加回来一个。因此,根据容斥原理, \(1\sim N\) 中不与 \(N\) 含公共质因子 \(p\)\(q\) 的数的个数为:

\(N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}=N(1-\frac{1}{p})(1-\frac{1}{q})\)

​ 类似的,我们对于 \(N\) 的全部质因子使用容斥原理,即可得到 \(\varphi(N)\)

  • 性质
    1. \(\forall n>1,1\sim n\) 中与 \(n\) 互质的数之和为 \(n*\varphi(n)/2\)
    2. \(a,b\) 互质,则 \(\varphi(ab)=\varphi(a)\varphi(b)\)
    3. \(p\) 为质数,若 \(p\mid n\)\(p^2\mid n\) ,则 \(\varphi(n)=\varphi(n/p)*p\)
    4. \(p\) 为质数,若 \(p\mid n\)\(p^2\not|n\) ,则 \(\varphi(n)=\varphi(n/p)*(p-1)\)
    5. \(\sum\limits_{d|n}\varphi(d)=n\)

证明:

​ 因为 \(gcd(n,x)=gcd(n,n-x)\) ,所以与 \(n\) 不互质的数 \(x,n-x\) 成对出现,平均值为 \(n/2\) 。因此,与 \(n\) 互质的数的平均值也是 \(n/2\) ,性质 \(1\) 成立。

​ 根据欧拉函数的计算式,因为 \(gcd(a,b)=1\) ,所以它们没有除了 \(1\) 以外的公约数,计算时不会重复出现 \((1-\frac{1}{p})\) ,性质 \(2\) 成立。

​ 若 \(p\mid n\)\(p^2\mid n\) ,则 \(n,n/p\) 包含相同的质因子,按照欧拉函数的计算公式,两者相除商为 \(p\) ,性质 \(3\) 成立。

​ 若 \(p\mid n\)\(p^2\not|n\) ,则 \(gcd(n,n/p)=1\) ,由 \(\varphi\) 是积性函数得 \(\varphi(n)=\varphi(n/p)*\varphi(p)\) 。其中 \(\varphi(p)=p-1\) ,性质 \(4\) 成立。

​ 设 \(f(n)=\sum\limits_{d|n}\varphi(d)\) 。用乘法分配率展开比较,再利用 \(\varphi\) 是积性函数,得到:若 \(gcd(n,m)=1\) ,则 \(f(nm)=\sum\limits_{d|nm}\varphi(d)=(\sum\limits_{d|n}\varphi(d))*(\sum\limits_{d|m}\varphi(d))=f(n)*f(m)\) 。即 \(f\) 是积性函数,对于单个质因子, \(f(p^m)=\sum\limits_{d|p^m}\varphi(d)=\varphi(1)+\varphi(p)+\varphi(p^2)+\cdots+\varphi(p^m)\) 是一个等比数列求和再加 \(1\) ,结果为 \(p^m\) 。所以 \(f(n)=\prod\limits_{i=1}^m f(p_i^{c_i})=\prod\limits_{i=1}^m p_i^{c_i}=n\) ,性质 \(5\) 成立。

例题

题面

Luogu P2158 [SDOI2008]仪仗队

Solution

分析题目可以发现,除了 \((1,0)\)\((0,1)\)\((1,1)\) 三个点之外,一个钉子 \((x,y)\) 能被看到,当且仅当 \(gcd(x,y)=1\) 时成立。

由于能看到的钉子明显是关于 \(y=x\) 这条直线对称的,所以我们只需要求其中一半即可。对于该坐标系的右下方可以看到的钉子,满足对于每个 \(2\leq x\leq N\) 都有 \(1\leq y<x,gcd(x,y)=1\) 。这样的 \(y\) 的数量恰好就是 \(\varphi(x)\)

综上所述,本题的答案就是 \(3+2*\sum\limits_{i=2}^N\varphi(i)\) 。我们要做的就是求出 \(2\sim N\) 中每个数的欧拉函数。

Code

#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
template<class T>void read(T &x)
{
 	x=0;char k=getchar();int f=1;
	for(;k>'9'||k<'0';k=getchar()) if(k=='-') f=-1;
	for(;k>='0'&&k<='9';k=getchar()) x=x*10+k-'0';
	x*=f;
}
int n,ans;
int prime[40005],tot,phi[40005];
bool is_not_pr[40005];
inline void prepare()
{
	phi[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!is_not_pr[i])
		{
			prime[++tot]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=tot&&i*prime[j]<n;j++)
		{
			is_not_pr[i*prime[j]]=1;
			if(i%prime[j]==0)
			{
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			else phi[i*prime[j]]=phi[i]*phi[prime[j]];
		}
	}
}
int main()
{
	read(n);
	if(n==1) printf("0");
	else
	{
		prepare();
		for(int i=2;i<n;i++) ans+=phi[i];
		printf("%d\n",ans*2+3);
	}
	return 0;
}

总结

这一部分的题要善于问题转化,将问题化简为可做的模式,同时它的拓展——欧拉反演也是比较重要的一类题,要抽时间去看一下。

posted @ 2019-08-23 17:26  TheShadow  阅读(389)  评论(0编辑  收藏  举报