• 积性函数初步(欧拉$\varphi$函数)


    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)\)
    • \(\sum_{i=1}^n i[\gcd(i,n)=1]=\frac{n\varphi(n)}{2}\)
      \(n>1\)\(\varphi(n)\) 总为偶数,那么若存在 \(\gcd(i,n)=1\),则必有 \(\gcd(n-i,n)=1\),那么他们的和是 \(n\)
      一共有 \(\frac{\varphi(n)}{2}\) 对这样的数

    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\)

    inline void get_phi(){
    	phi[1]=1;
    	for(reg int i=2;i<=n;i++){
    		if(!notprime[i]) prime[++prime[0]]=i,phi[i]=i-1;
    		for(reg int j=1;j<=prime[0]&&i*prime[j]<=n;j++){
    			notprime[i*prime[j]]=1;
    			if(!(i%prime[j])){
    				//i mod p=0, phi(i*p)=p*phi(i)
    				phi[i*prime[j]]=prime[j]*phi[i];
    				break;
    			}
    			else phi[i*prime[j]]=phi[i]*(prime[j]-1);//i mod p!=0,phi(i*p)=phi(i)*(p-1)
    		}
    	}
    }
    

    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)\)的方法实现
    代码

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    #include<iomanip>
    #include<cstring>
    #define reg register
    #define EN std::puts("")
    #define LL long long
    inline int read(){
    	register int x=0;register int y=1;
    	register char c=std::getchar();
    	while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
    	while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
    	return y?x:-x;
    }
    inline LL power(LL a,LL b,LL mod){
    	LL ret=1;
    	while(b){
    		if(b&1) ret=ret*a%mod;
    		a=a*a%mod;b>>=1;
    	}
    	return ret;
    }
    inline LL get_phi(LL x){
    	LL ret=x;
    	for(reg LL i=2;i*i<=x;i++){
    		if(!(x%i)) ret=ret/i*(i-1);
    		while(!(x%i)) x/=i;
    	}
    	if(x>1) ret=ret/x*(x-1);
    	return ret;
    }
    inline LL read_big(LL phi){
    	register int x=0;
    	register char c=std::getchar();
    	while(c<'0'||c>'9') c=std::getchar();
    	while(c>='0'&&c<='9'){
    		x=x*10+(c^48);c=std::getchar();
    		if(x>phi) x=x%phi+phi;
    	}
    	return x;
    }
    int main(){
    	LL a=read(),m=read();
    	std::printf("%lld",power(a,read_big(get_phi(m)),m));
    	return 0;
    }
    
  • 相关阅读:
    同一个类生成的对象去重
    关于公众号JavaTokings侵权声明
    消息中间件ActiveMQ使用详解
    重定向和转发的分析与理解
    Oracle SqlPlus导出查询结果
    Sql查询一个列对应多个列
    Jsp标签字典开发_基于Spring+Hibernate
    Oracle数据库导入导出简单备份
    JAVA WEB接口开发简述
    NTKO在线office控件使用实例
  • 原文地址:https://www.cnblogs.com/suxxsfe/p/12527200.html
Copyright © 2020-2023  润新知