欧拉定理及其拓展
•参考资料
•抛出问题
如何快速求解 $\underbrace{a^{a^{a^{\dots\dots}}}}_{x}\ mod \ p$ ?
•知识支持
$\varphi(x)$:[1,x)中,与 $x$ 互素的数的个数;
定理1:如果 $GCD(a,b) = 1$,那么有 $\varphi(ab)=\varphi(a) \cdot \varphi(b)$;
定理2:如果 $p$ 为素数,那么有 $\varphi(p^k)=(p-1)\cdot p^{k-1}$;
•相关定理
$a^{b}\ mod\ p=\begin{cases}a^{b\%\varphi(p)} \ \ \ \ \ \ \ \ \ \ GCD(a,p)=1_{\cdots\cdots\cdots\cdots\cdots\cdots}(1)\\ a^{b} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ GCD(a,p)\neq 1,b \leqslant \varphi(p)_{\cdots}(2)\\a^{b\%\varphi(p)+\varphi(p)} \ \ \ \ GCD(a,p)\neq1,b\geqslant \varphi(p)_{\cdots}(3) \\ \end{cases}$
•问题的解
暂时不考虑情况(2);
那么根据定理(3)可得:
$\underbrace{a^{a^{a^{\dots\dots}}}}_{x}\equiv a^{\underbrace{{a^{a^{\dots\dots}}}}_{x-1}\% \varphi(p)+\varphi(p)}\ (mod \ p)$;
为了描述方便,现在给出一个新定义:
$Calc(a,x,p)=\underbrace{a^{a^{a^{\dots\dots}}}}_{x}\ mod \ p$;
因为暂时不考虑情况(2),即对于任意情况下,都有 $\underbrace{a^{a^{a^{\dots\dots}}}}_{x} \ge \varphi(p)$;
所以,上式又可以简化为:
$Calc(a,x,p)\equiv a^{Calc(a,x-1,\varphi(p))+\varphi(p)}\ (mod \ p)$;
此时你会发现,$Calc(a,x-1,\varphi(p))$ 又可根据定理(3)递归下去;
而递归的出口为 $if(p == 1)\ return\ 0\ or\ 1;$
为什么返回 0 或者 1 都对呢?
下面就来仔细分析一下;
假设你现在需要计算 $a_1^{a_{2}^{a_3}}\ mod \ p_1$ 的值;
并假设 $\varphi(p_1)=p_2\ ,\ \varphi(p_2)=p_3\ ,\ p_{3}=1$
那么,接下来的递归步骤为:
$\begin{aligned} a_{1}^{a_{2}^{a_{3}}}\ mod\ p_1 &=a_{1}^{\big( a_{2}^{a_{3}}\ mod\ p_{2}\ +\ p_2 \big)}\ mod\ p_1 \\ &=a_{1}^{\big( a_{2}^{( a_{3}\% p_{3}+p_{3} )}\ mod\ p_{2}\ +\ p_2 \big)}\ mod\ p_1 \end{aligned}$
那么,问题就转化为讨论 $a_{3}\% p_{3}==0\ or\ 1$ 对 $a_{2}^{(a_{3}\% p_{3}+p_{3})} \ mod\ p_2$ 的影响;
因为 $p_3=1$,那么必有 $p_2=2$;
而易得 $a \equiv a^{2}\ (mod\ 2)$;
那么,显而易见,$a_{3}\% p_{3}==0\ or\ 1$ 对 $a_{2}^{(a_{3}\% p_{3}+p_{3})} \ mod\ p_2$ 的返回结果无影响;
•$\varphi(x)$快速求解
首先,将 x 质因子分解:
$x=p_{1}^{k_1}\cdot p_{2}^{k_2}\cdots p_{n}^{k_n} ,(p\ is\ prime,k_i \ge 1)$;
根据知识支持的定理 1,2 可得:
$\begin{aligned} \varphi(x)&=\varphi(p_{1}^{k_1})\cdot \varphi(p_{2}^{k_2})\cdots \varphi(p_{n}^{k_n})\\&={(p_{1}-1)\cdot p_{1}^{k_{1}-1}}\cdot {(p_{2}-1)\cdot p_{2}^{k_{2}-1}}\cdots {(p_{n}-1)\cdot p_{n}^{k_{n}-1}}\end{aligned}$
•Code(欧拉函数求解)
•实战1
上面所涉及的都是理论,放到题目中该如何做呢?
首先来看这道题 [BZOJ 3884: 上帝与集合的正确用法];
让求的是 $\underbrace{2^{2^{2^{\dots\dots}}}}_{\infty}\ mod \ p$;
因为有无穷个2,所以满足上述 $b \le \varphi(p)$ 的情况,那么,直接调用 $Calc(2,\infty,p)$ 即可;
•Code
•实战2
但并不是所有的题目都满足指数 $x \le \varphi(p)$ 的情况,这该如何处理呢?
(上述题目定义的 $Calc(a,x,p)=\underbrace{a^{a^{a^{\dots\dots}}}}_{x}\ mod \ p$,接下来,定义 $Calc(a,x,p)=a^x \ mod \ p$)
如这道题 [CodeForces 906D]
给你一个包含 n 个数的数组 w,和一个数 m;
有 q 次询问,每次询问给出两个数 l,r,让你求 $w_{l}^{w_{l+1}^{{\ \cdots\cdots}^{w_r}}}\ mod\ m$;
很显然,对于这种好多次幂的式子,第一反应就是欧拉降幂;
但,此题不同于上一题(BZOJ3884),上一题中,因为有无穷个 2 的幂,所以可以保证 $\underbrace{a^{a^{a^{\dots\dots}}}}_{x} \ge \varphi(p)$,即不用考虑情况(2);
但对于此题来说,并不能保证对于所有的 $Calc(a,x,p)$ 都有 $x \le \varphi(p)$;
那么该怎么办呢?
还是以求解 $a_1^{a_{2}^{a_3}}\ mod \ p_1$ 为例;
并假设 $\varphi(p_i)=p_{i+1}$;
$\begin{aligned} a_{1}^{a_{2}^{a_{3}}}\ mod\ p_1 &=a_{1}^{\big( a_{2}^{a_{3}}\ mod\ p_{2}\ +\ p_2 \big)}\ mod\ p_1 \\ &=a_{1}^{\big( a_{2}^{( a_{3}\% p_{3}+p_{3} )}\ mod\ p_{2}\ +\ p_2 \big)}\ mod\ p_1 \end{aligned}$
假设 $a_3 > p_3$,那么由定理(2),上式应该变为:
$\begin{aligned} a_{1}^{a_{2}^{a_{3}}}\ mod\ p_1 &=a_{1}^{\big( a_{2}^{a_{3}}\ mod\ p_{2}\ +\ p_2 \big)}\ mod\ p_1 \\ &=a_{1}^{\big( a_{2}^{( a_{3}\% p_{3})}\ mod\ p_{2}\ +\ p_2 \big)}\ mod\ p_1 \end{aligned}$
而 $a_3\% p_3 = a_3$,处理的话我们只需要在快速幂里处理即可;
将快速幂改为如下样式:
1 ll modulo(ll x,ll mod) 2 { 3 return x > mod ? x%mod+mod:x; 4 } 5 ll qPow(ll a,ll b,ll mod) 6 { 7 ll ans=1; 8 for(;b;b>>=1) 9 { 10 if(b&1) 11 ans=modulo(ans*a,mod); 12 a=modulo(a*a,mod); 13 } 14 return ans; 15 }其中,modulo(x,mod) 就实现了判断 $x$ 是否大于 $\varphi(p)$;
到这儿,这道题基本就解决了;
只需要提前预处理出 m 的所有的 $\varphi(m)$,然后,从 l 到 r 递归 Calc() 即可;
•Code