updata on 2020.4.3

添加了欧拉\(\varphi\)函数为积性函数的证明和它的计算方式


1.积性函数

设\(f(n)\)为定义在正整数上的函数,若\(f(1)=1\),且对于任意正整数\(a,b\),若a,b互质就有:

\[f(ab)=f(a)f(b)
\]

则\(f(n)\)为积性函数

若不要求a,b互质,则\(f(n)\)为完全积性函数

2.计算

求出n的分解式 \(n=\prod_{i=1}^m {p_i}^{k_i}\),则有:

\(f(n)=\prod_{i=1}^k f({p_i}^{k_i})\)

3.约数函数

\(\sigma_x(n)\)为n的所有约数的\(x\)次方和:

\(\sigma_x(n)=\sum_{d\mid{n}} d^x\)

则\(\sigma_0(n)\)为n的约数个数,记为\(d(n)\)或\(\tau(n)\)。\(\sigma_1(n)\)为n的约数和,记为\(\sigma(n)\)

\(\sigma_x(n)\)为积性函数

3.1x=0时的证明

\[n=\prod_{i=1}^m {p_i}^{k_i}
\]

\[\tau(n)=\prod_{i=1}^m(k_i+1)
\]

\[\tau({p_i}^{k_i})=k_i+1
\]

故\(\tau(n)\)为积性函数

3.2计算

\(\sigma_x(p^k)=\sum_{i=0}^k (p^i)^x=\sum_{i=0}^k (p_x)^i\)

当\(x\neq{0}\),根据等比数列求和,有:

\(\sigma_x(p^k)=\frac{(p^x)^{k+1}-1}{p^x-1}\)

4.欧拉\(\varphi\)函数

积性函数\(\varphi(n)\)为不大于n的正整数中与n互质的数的个数:

\[\varphi(n)=\sum_{i=1}^n[gcd(i,n)=1]=n\prod(1-\frac{1}{p_i})
\]

其中\(p_i\)为\(n\)的各项质因数

关于第二个等号是如何得出的,可以这样理解

\(\prod(1-\frac{1}{p_i})\)实际上就是在\([1,n]\)中任取一个数,这个数不是\(n\)任何一个质约数的倍数的概率

那么这个概率再乘上\(n\)就是与\(n\)互质的个数

其实这个也可以用它的积性性质来证,再结合\(\varphi(p^k)=p^k-p^{k-1}=p^{k-1}(p-1)\)这个性质(下面有)

不过这样证明积性的时候就不能用这个式子了,会变得比较麻烦

4.1性质

  • 对于质数p和正整数k:

    不大于\(p^k\)的数中,不与\(p^k\)互质的数一定为p的倍数,有\(\frac{p^k}{p}=p^{k-1}\)个,所以有:

    \(\varphi(p^k)=p^k-p^{k-1}=p^{k-1}(p-1)\)
  • 当\(n>2\),\(\varphi(n)\)总为偶数,因为和它互质的数总是成对出现
  • 若n为偶数,则\(\varphi(n) \leq \frac{n}{2}\),因为有一半的数是二的倍数,和他不互质
  • \(\sum_{d\mid n}\varphi(d)=n\)

    有个挺妙的证法,列举出如下分数:

    \(\dfrac{1}{n},\dfrac{2}{n},\cdots,\dfrac{n}{n}\)

    然后把他们化简

    当且仅当\(d\mid n,\gcd(a,d)=1\),分数\(\frac{a}{d}\)出现在其中

    那么,以\(d\)为分母的分数有\(\varphi(d)\)个,\(d\)可以取遍\(n\)的所有因数

    又因为这些分数的个数是\(n\),所以\(n=\sum_{d\mid n}\varphi(d)\)

有些题要是不知道这些还是不好做的

4.2它是积性函数

对于任意\(n,m,\gcd(n,m)=1\),有\(\varphi(nm)=\varphi(n)\varphi(m)\)

展开等号右边的式子为:

\[n\prod(1-\frac{1}{p_i})\cdot m\prod(1-\frac{1}{p_i'})
\]

有因为\(\gcd(n,m)=1\),则他们没有公因数,所以\(p_1,p_2,\cdots,p_r,p_1',\cdots,p_w'\)互不相等,且乘积之和就是\(nm\)

所以上面的式子就等于\(\varphi(nm)\)

4.3用线性筛求\(\varphi\)

先用线性筛枚举\(i\)

考虑如果\(i\)是质数,\(\varphi(i)=i-1\)

如果不是,就是在枚举每个质数\(p\)的过程中,一边标记和数(这是常规线性筛的过程),一边计算出

\(i \bmod p=0\Rightarrow \varphi(i\cdot p)=p\cdot\varphi(i)\)

证明很简单,这里设\(p_k\)为\(i\)的各项质因数:

\(p\cdot\varphi(i)=p\cdot i\prod\frac{p_k-1}{p_k}\)

然后\(\varphi(i\cdot p)\)也是这个式子

因为\(i\bmod p=0\)可以得出\(i\)是\(p\)的倍数,所以\(p_k\)中已经包含了\(p\),所以它就也是\(p\cdot i\prod\frac{p_k-1}{p_k}\)

\(i \bmod p\neq 0\Rightarrow \varphi(i\cdot p)=(p-1)\cdot \varphi(i)\)

这个很显然,就是\(\varphi\)的积性性质

所以有了这两个我们就可以求\(\varphi\)了

  1. inline void get_phi(){
  2. phi[1]=1;
  3. for(reg int i=2;i<=n;i++){
  4. if(!notprime[i]) prime[++prime[0]]=i,phi[i]=i-1;
  5. for(reg int j=1;j<=prime[0]&&i*prime[j]<=n;j++){
  6. notprime[i*prime[j]]=1;
  7. if(!(i%prime[j])){
  8. //i mod p=0, phi(i*p)=p*phi(i)
  9. phi[i*prime[j]]=prime[j]*phi[i];
  10. break;
  11. }
  12. else phi[i*prime[j]]=phi[i]*(prime[j]-1);//i mod p!=0,phi(i*p)=phi(i)*(p-1)
  13. }
  14. }
  15. }

5.欧拉定理

5.1欧拉定理

设\(n \geq 2\)为整数,\(gcd(a,n)=1\),则有:

\[a^{\varphi(n)} \equiv 1 \pmod n
\]

若n为质数,有\(\varphi(n)=n-1\),可得费马小定理

很显然这东西也可以用来求逆元

证明

考虑两个数列\(x,m\),长度均为\(\varphi(n)\)

\(x_i\)是\([1,n]\)中第\(i\)个不与\(n\)互质的数,也就是说这\(\varphi(n)\)个数构成了数列\(x\)

然后\(m_i=ax_i\)


首先要证明两个定理

  • 对于任意的\(\gcd(m_i\bmod n,n)=1\)

这个很简单,就按照\(m_i\)的定义展开,然后再按辗转相除求\(\gcd\)的方法往回倒推一步就行

\[\gcd(m_i\bmod n,n)=\gcd(ax_i\bmod n,n)=\gcd(n,ax_i)=1
\]

\(a\)和\(x_i\)分别与\(n\)互质,那么\(ax_i\)也和\(n\)互质

  • 不存在\(m_i\equiv m_j \pmod n\)

这个用一下反证法,假设\(m_i\equiv m_j\pmod n\)

那么肯定有一个正整数\(k\),使得\(m_i-m_j=kn\),这里不妨设\(m_i>m_j\)

用\(x\)表示\(m\):

\[a(x_i-x_j)=m_i-m_j=kn
\]

然后把这个式子放在\(\bmod n\)意义下,就是

\[a(x_i-x_j)\equiv 0\pmod n
\]

又因为\(\gcd(a,n)=1\),所以上式等价于

\[x_i-x_j\equiv 0\pmod n
\]

又因为\(x_i<x_j\leq n\),所以\(x_i-x_j<n,x_i-x_j\neq 0\)

所以不成立


总结一下上面两个定理的作用,由于定理2,任意的两个\(m_i\bmod n\)都不想等

又由于定理2,\(m_i\bmod n\)的取值值能有\(\varphi(n)\)种

所以,\(m_1\bmod n,m_2\bmod b,\cdots,m_{\varphi(n)}\bmod n\)和\(x_1,x_2,\cdots,x_{\varphi(n)}\)是一一对应的

所以:

\[\prod_{i=1}^{\varphi(n)}m_i\equiv \prod_{i=1}^{\varphi(n)}x_i\pmod n
\]

\[a^{\varphi(n)}\prod_{i=1}^{\varphi(n)}x_i\equiv \prod_{i=1}^{\varphi(n)}x_i\pmod n
\]

又由于\(\gcd(\prod_{i=1}^{\varphi(n)}x_i,n)=1\),也就是它们互质,所以:

\[a^{\varphi(n)}\equiv 1\pmod n
\]

5.2降幂公式

也叫扩展欧拉定理

当\(b>\varphi(n)\):

\[a^b \equiv a^{b\bmod \varphi(n)+\varphi(n)} \pmod n
\]

证明,用到的同余式结论的证明都可以从这篇文章的同余部分中找到

考虑从结论往回想,设\(p_i\)为\(a\)的每一个质因数,\(q_i\)分别是它们的指数

\[(\prod p_i^{q_i})^b\equiv (\prod p_i^{q_i})^{b \bmod \varphi(n)+\varphi(n)}
\]

根据同余式可乘,可以对每一个质因数单独拆开:

\[(p_i^{q_i})^b\equiv (p_i^{q_i})^{b \bmod \varphi(n)+\varphi(n)}
\]

\[(p_i^b)^{q_i}\equiv (p_i^{b \bmod \varphi(n)+\varphi(n)})^{q_i}
\]

还是根据同余式可乘

\[p_i^b\equiv p_i^{b \bmod \varphi(n)+\varphi(n)}
\]

所以现在问题就转换成求证上式了,下文的\(p\)表示\(p_i\)

我们找到一个最大的\(r\),使得\(n=s\times p^r\),显然,此时\(\gcd(s,p)=1\)

所以可以由欧拉定理得到:\(p^{\varphi(s)}\equiv 1\pmod s\)

设\(s\)的质因数序列为\(l_1,l_2,\cdots,l_k\),那么:

\[\varphi(s)=s\prod_{i=1}^k \dfrac{l_i-1}{l_i}
\]

\[\varphi(n)=s\cdot p^r\cdot \dfrac{p-1}{p}\prod_{i=1}^k \dfrac{l_i-1}{l_i}=s\cdot p^{r-1}\cdot (p-1)\prod_{i=1}^k \dfrac{l_i-1}{l_i}
\]

由于\(r>1\),所以\(\varphi(s)\mid\varphi(n)\)

那么还是由于同余式的可乘性,\(p^{\varphi(n)}\equiv 1 \pmod s\)

又根据同余式“放大缩小模数”的性质,给他乘上一个\(p^r\),\(p^{\varphi(n)+r}\equiv p^r\pmod n\)

那么我们找到一个\(c\ge r\)

\[p^c\equiv p^{c-r+r}\equiv p^{c-r+\varphi(n)+r}\equiv p^{c+\varphi(n)}\pmod n
\]

观察一下刚才那个\(\varphi(n)\)的式子,很容易知道\(r\le \varphi(n)\)

所以对于\(c\ge \varphi(n),p^c\equiv p^{c+\varphi(n)}\pmod n\)

那么以此类推:

\[p^c\equiv p^{c+\varphi(n)}\pmod n
\]

\[p^{c+\varphi(n)}\equiv p^{c+2\varphi(n)}\pmod n
\]

\[p^{c+2\varphi(n)}\equiv p^{c+3\varphi(n)}\pmod n
\]

\[\cdots
\]

于是可以令一个\(c'=c+k\varphi(n),c=c'\bmod \varphi(n)\),然后\(p^{c'}\equiv p^c\pmod n\)

但是同于号右边的指数要再加一个\(\varphi(n)\),为了防止它被模成\(0\)

所以就得出:

\[p^c\equiv p^{c\bmod \varphi(n)+\varphi(n)}
\]

最后按开头说的退回去就行了

最终结论

\[a^b \equiv a^{b\bmod \varphi(n)+\varphi(n)} \pmod n,b>\varphi(n)
\]

这东西可算证完了。。。

模板题 洛谷P5091

一般是用边读入边取模并\(+\varphi(n)\)的方法实现

代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<iomanip>
  6. #include<cstring>
  7. #define reg register
  8. #define EN std::puts("")
  9. #define LL long long
  10. inline int read(){
  11. register int x=0;register int y=1;
  12. register char c=std::getchar();
  13. while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
  14. while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
  15. return y?x:-x;
  16. }
  17. inline LL power(LL a,LL b,LL mod){
  18. LL ret=1;
  19. while(b){
  20. if(b&1) ret=ret*a%mod;
  21. a=a*a%mod;b>>=1;
  22. }
  23. return ret;
  24. }
  25. inline LL get_phi(LL x){
  26. LL ret=x;
  27. for(reg LL i=2;i*i<=x;i++){
  28. if(!(x%i)) ret=ret/i*(i-1);
  29. while(!(x%i)) x/=i;
  30. }
  31. if(x>1) ret=ret/x*(x-1);
  32. return ret;
  33. }
  34. inline LL read_big(LL phi){
  35. register int x=0;
  36. register char c=std::getchar();
  37. while(c<'0'||c>'9') c=std::getchar();
  38. while(c>='0'&&c<='9'){
  39. x=x*10+(c^48);c=std::getchar();
  40. if(x>phi) x=x%phi+phi;
  41. }
  42. return x;
  43. }
  44. int main(){
  45. LL a=read(),m=read();
  46. std::printf("%lld",power(a,read_big(get_phi(m)),m));
  47. return 0;
  48. }

积性函数初步(欧拉$\varphi$函数)的更多相关文章

  1. [模板] 积性函数 && 线性筛

    积性函数 数论函数指的是定义在正整数集上的实或复函数. 积性函数指的是当 \((a,b)=1\) 时, 满足 \(f(a*b)=f(a)*f(b)\) 的数论函数. 完全积性函数指的是在任何情况下, ...

  2. POJ 2480 Longge's problem (积性函数,欧拉函数)

    题意:求∑gcd(i,n),1<=i<=n思路:f(n)=∑gcd(i,n),1<=i<=n可以知道,其实f(n)=sum(p*φ(n/p)),其中p是n的因子.为什么呢?原因 ...

  3. poj2480(利用欧拉函数的积性求解)

    题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2, ...

  4. hdu2421-Deciphering Password-(欧拉筛+唯一分解定理+积性函数+立方求和公式)

    Deciphering Password Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. 【模板】埃拉托色尼筛法 && 欧拉筛法 && 积性函数

    埃拉托色尼筛法 朴素算法 1 vis[1]=1; 2 for (int i=2;i<=n;i++) 3 if (!vis[i]) 4 { 5 pri[++tot]=i; 6 for (int j ...

  6. Master of Phi (欧拉函数 + 积性函数的性质 + 狄利克雷卷积)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6265 题目大意:首先T是测试组数,n代表当前这个数的因子的种类,然后接下来的p和q,代表当前这个数的因 ...

  7. POJ_2480 Longge's problem【积性函数+欧拉函数的理解与应用】

    题目: Longge is good at mathematics and he likes to think about hard mathematical problems which will ...

  8. 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和

    只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...

  9. 51nod1040 最大公约数之和,欧拉函数或积性函数

    1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6时,1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 看起来很简单 ...

随机推荐

  1. 这份Java Web必读书单,值得所有Java工程师一看!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! 经过了10多年的发展,Java Web从开发框架到社区都已经非常成熟,而目前市面上最流行的Jav ...

  2. python3(七)dict list

    # dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. # dict内部存放的顺序和key放入的顺序是没有关系的 # 根据同学的名字 ...

  3. [编译] 7、在Linux下搭建安卓APP的开发烧写环境(makefile版-gradle版)—— 在Linux上用命令行+VIM开发安卓APP

    April 18, 2020 6:54 AM - BEAUTIFULZZZZ 目录 0 前言 1 gradle 安装配置 1.1 卸载系统默认装的gradle 1.2 下载对应版本的二进制文件 1.3 ...

  4. 数据结构和算法(Golang实现)(15)常见数据结构-列表

    列表 一.列表 List 我们又经常听到列表 List数据结构,其实这只是更宏观的统称,表示存放数据的队列. 列表List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序号的数 ...

  5. vueCli 运行报错

    error 如下: npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! shopping@0.1.0 serve: `vue-cli-service ...

  6. Java创建线程的三种形式的区别以及优缺点

    1.实现Runnable,Callable Callable接口里定义的方法有返回值,可以声明抛出异常. 继承Callable接口实现线程 class ThreadCall implements Ca ...

  7. (一) Mybatis源码分析-解析器模块

    Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...

  8. work of 12/30/2015

    part 组员                今日工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云   merge UI 与reader     6  丰富re ...

  9. [转载]深度理解Session

    什么是session session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息. 说白了session就是 ...

  10. Springboot:员工管理之添加员工(十(7))

    构建员工添加请求 com\springboot\controller\EmployeeController.java /*调转到员工添加页 携带部门信息 restful风格*/ @GetMapping ...