欧拉定理及其拓展

 

•参考资料

  [1]:BZOJ.3884.上帝与集合的正确用法(扩展欧拉定理)

  [2]:[Codeforces]906D Power Tower

•抛出问题

  如何快速求解 $\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(欧拉函数求解)

  欧拉函数.cpp

•实战1

  上面所涉及的都是理论,放到题目中该如何做呢?

  首先来看这道题 [BZOJ 3884: 上帝与集合的正确用法];

  让求的是 $\underbrace{2^{2^{2^{\dots\dots}}}}_{\infty}\ mod \ p$;

  因为有无穷个2,所以满足上述 $b \le \varphi(p)$ 的情况,那么,直接调用 $Calc(2,\infty,p)$ 即可;

•Code

  BZOJ3884.cpp

•实战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

  CodeForces906D.cpp

 

posted @ 2019-09-03 09:50  HHHyacinth  阅读(353)  评论(0编辑  收藏  举报