欧拉定理

​ 欧拉定理其实是费马小定理的一个推广,首先来回顾一下费马小定理。

费马小定理

​ p为质数,且a不是p的倍数,则有
a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \quad (mod \quad p) ap−1≡1(modp)

欧拉定理

​ 设p是任意大于1的整数,且(a, m)=1,则有
a φ ( p ) ≡ 1 ( m o d p ) a^{\varphi(p)}\equiv 1 \quad (mod \quad p) aφ(p)≡1(modp)
​ φ \varphi φ§指的是从1到p-1中,与p互素的元素的个数。

​ 举个例子来深度理解一下欧拉定理,假如p = 20, a = 3,可知a与p互素,则有

a 0 ≡ 1 a 1 ≡ 3 a 2 ≡ 9 a 3 ≡ 7 a 4 ≡ 1 a^{0} \equiv 1 \\a^{1} \equiv 3 \\a^{2} \equiv 9 \\a^{3} \equiv 7 \\a^{4} \equiv 1 a0≡1a1≡3a2≡9a3≡7a4≡1
不难发现当取到 a 4 a^{4} a4时再次出现了1的情况,因此以后都是以4为一个循环,那再假如p = 20,a = 2,则有
a 0 ≡ 1 a 1 ≡ 2 a 2 ≡ 4 a 3 ≡ 8 a 4 ≡ 16 a 5 ≡ 12 a 6 ≡ 4 a^{0} \equiv 1 \\a^{1} \equiv 2 \\a^{2} \equiv 4 \\a^{3} \equiv 8 \\a^{4} \equiv 16 \\a^{5} \equiv 12 \\a^{6} \equiv 4 a0≡1a1≡2a2≡4a3≡8a4≡16a5≡12a6≡4
此时,发现 a 2 ≡ a 6 a^{2} \equiv a^{6} a2≡a6显然,循环不是从第一个元素开始,是先经过一段不循环的数,然后再进入到循环当中。

综上,可以得出结论,当 ( a , p ) = 1 (a, p)=1 (a,p)=1时,从一开始就进入了循环当中,当 ( a , p ) ≠ 1 (a, p)\neq 1 (a,p)=1时,是先经过一段不循环的数,然后再进入到循环当中。

扩展欧拉定理

扩展欧拉定理一般用来欧拉降幂

先给出公式:
a m ≡ { a m , if  m < φ ( p ) a m % φ ( p ) + φ ( p ) , if  m ≥ φ ( p ) a^{m} \equiv \begin{cases} a^{m},& \text{if $m < \varphi(p)$}\\ a^{m \% \varphi(p) + \varphi(p)},& \text{if $m \geq \varphi(p)$} \end{cases} am≡{am,am%φ(p)+φ(p),​if m<φ(p)if m≥φ(p)​
当 m < φ ( p ) m<\varphi(p) m<φ(p)时,说明m只在第一个循环或者甚至不在循环当中,直接快速幂求解即可。

当 m ≥ φ ( p ) m \geq \varphi(p) m≥φ(p)时,说明m已经在循环当中,需要确定的就是他在循环当中的哪个数,a的幂次是 m % φ ( p ) + φ ( p ) m\% \varphi(p)+\varphi(p) m%φ(p)+φ(p)实际上是化简后的 ( m − φ ( p ) ) % φ ( p ) + φ ( p ) (m-\varphi(p))\%\varphi(p)+\varphi(p) (m−φ(p))%φ(p)+φ(p),加上一个 φ ( p ) \varphi(p) φ(p)就是为了让其先进入循环中,然后再去确定他在循环当中的哪个数。

模板题

Notepad

题意易懂,因为没有前导0,所以第一位只有(b-1)种情况,所以答案其实就是 a n s ≡ ( b − 1 ) ∗ b n − 1 m o d c ans\equiv (b-1)*b^{n-1}\mod\ c ans≡(b−1)∗bn−1mod c,因为b和n的位数特别多,需要高精度减法预处理出(b - 1)和(n - 1),就可以得到
a n s ≡ { ( ( b − 1 ) % c ) ∗ ( b % c ) n − 1 , if  n − 1 < φ ( c ) ( ( b − 1 ) % c ) ∗ ( b % c ) ( n − 1 ) % φ ( c ) + φ ( c ) , if  ( n − 1 ) ≥ φ ( c ) ans \equiv \begin{cases} ((b - 1)\% c) * (b \% c)^{n - 1},& \text{if $n - 1 < \varphi(c)$}\\ ((b - 1)\% c) * (b \% c)^{(n - 1) \% \varphi(c) + \varphi(c)},& \text{if $(n - 1) \geq \varphi(c)$} \end{cases} ans≡{((b−1)%c)∗(b%c)n−1,((b−1)%c)∗(b%c)(n−1)%φ(c)+φ(c),​if n−1<φ(c)if (n−1)≥φ(c)​
答案就显而易见了。

AC代码:

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
LL qp(LL a, LL b, LL mod) {LL res = 1;for (; b; b >>= 1, a = a * a % mod) {if (b & 1) {res = res * a % mod;}}return res;
}
LL phi(LL p) {if (p == 1) {return 0;}LL phip = p, q = p;for (int i = 2; i * i <= q; i++) {if (q % i == 0) {phip = phip / i * (i - 1);while (q % i == 0) {q /= i;}}}if (q != 1) {phip = phip / q * (q - 1);}return phip;
}
string calc(string x) {int len = x.size();string ans = "";vector<int> z;for (int i = 0; i < len; i++) {z.emplace_back(x[i] - '0');}z[len - 1]--;for (int i = len - 1; i >= 0; i--) {if (z[i] < 0) {z[i - 1]--;z[i] += 10;}}int first = 0;while (z[first] == 0) {first++;}for (int i = first; i < len; i++) {ans += ('0' + z[i]);}return ans;
}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string b, n;LL c;cin >> b >> n >> c;if (c == 1) {cout << "1\n";return 0;}LL phic = phi(c);int len1 = b.size(), len2 = n.size();string bb = calc(b), nn = calc(n);LL b1 = 0, bb1 = 0, c1 = 0;int len3 = bb.size();for (int i = 0; i < len3; i++) {b1 = (b1 * 10 + (bb[i] - '0')) % c;}for (int i = 0; i < len1; i++) {bb1 = (bb1 * 10 + (b[i] - '0')) % c;}int len4 = nn.size();bool ok = true;for (int i = 0; i < len4; i++) {c1 = (c1 * 10 + (nn[i] - '0'));if (c1 >= phic) {ok = false;break;}}if (ok) {c1 = 0;for (int i = 0; i < len4; i++) {c1 = (c1 * 10 + (nn[i] - '0'));}LL ans = b1 * qp(bb1, c1, c) % c;if (ans == 0) {ans = c;}cout << ans << '\n';} else {c1 = 0;for (int i = 0; i < len4; i++) {c1 = (c1 * 10 + (nn[i] - '0')) % phic;}LL ans = b1 * qp(bb1, c1 + phic, c) % c;if (ans == 0) {ans = c;}cout << ans << '\n';}return 0;
}

Exponial

欧拉降幂模板题,只需要求出
n ( n − 1 ) ( n − 2 ) ⋯ 2 1 m o d m n^{(n - 1)^{(n - 2)^{\cdots^{2^{1}}}}}\mod\ m n(n−1)(n−2)⋯21mod m
像这种幂次特别多的,分解一下就是要分别求
( n − 1 ) ( n − 2 ) ⋯ 2 1 m o d φ ( m ) + φ ( m ) ( n − 2 ) ( n − 3 ) ⋯ 2 1 m o d φ ( φ ( m ) ) + φ ( φ ( m ) ) ⋯ (n - 1)^{(n - 2) \cdots^{2^{1}}}\mod\ \varphi(m) + \varphi(m)\\ (n - 2)^{(n - 3) \cdots^{2^{1}}}\mod\ \varphi(\varphi(m)) + \varphi(\varphi(m))\\ \cdots (n−1)(n−2)⋯21mod φ(m)+φ(m)(n−2)(n−3)⋯21mod φ(φ(m))+φ(φ(m))⋯
因为 φ ( m ) \varphi(m) φ(m)经过logm次大概就成为1了,所以这个递归只需要logm次左右,并且要确保 x ≥ φ ( m ) x \geq \varphi(m) x≥φ(m),x是幂次,来保证扩展欧拉定理的运行,因为 m ≤ 1 0 9 m \leq 10^{9} m≤109,所以当 n ≥ 5 n \geq 5 n≥5时均符合扩展欧拉定理的要求,当 n < 5 n<5 n<5时直接返回模m后的值,因为值都是在可以暴力计算的范围内。

AC代码:

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define int long long
LL qp(LL a, LL b, LL mod) {LL res = 1;for (; b; b >>= 1, a = a * a % mod) {if (b & 1) {res = res * a % mod;}}return res;
}
LL solve(LL n, LL m) {if (n == 1) {return 1 % m;}if (n == 2) {return 2 % m;}if (n == 3) {return 9 % m;}if (n == 4) {return (1 << 18) % m;}if (m == 1) {return 0;}if (n == 0) {return 1;}LL phim = m, q = m;for (int i = 2; i * i <= q; i++) {if (q % i == 0) {phim = phim / i * (i - 1);while (q % i == 0) {q /= i;}}}if (q != 1) {phim = phim / q * (q - 1);}return qp(n, solve(n - 1, phim) + phim, m);
}
signed main() {ios::sync_with_stdio(false);cin.tie(nullptr);LL n, m;cin >> n >> m;cout << solve(n, m) % m << '\n';return 0;
}

再附上几个练习题

Power Tower

上帝与集合的正确用法

浅谈欧拉定理及其扩展相关推荐

  1. 计算机在地理测绘领域的应用,浅谈地理信息系统在测绘领域的扩展应用

    摘 要:随着经济的增长,对国民经济各领域发展的先行者――测绘提出了更高.更迫切的要求,而传统意义的测绘方式已经不能满足测绘精度和效率的要求.而地理信息系统(GIS)在测绘领域的广泛应用,大大提高测绘工 ...

  2. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

  3. 浅谈GCC预编译头技术

    浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...

  4. catia三维轴承_浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文

    浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文 一.概述 单排四点接触球转盘轴承是一种能够同时承受较大轴向负荷.径向负荷和倾覆力矩等综合载荷,集支承.旋转.传动.固定等多种功能于一身的特殊 ...

  5. php 爬虫去重,浅谈动态爬虫与去重(续)

    作者:Fr1day@0keeTeam 0x00 前言 在 浅谈动态爬虫与去重 中,分享了动态爬虫中触发事件.监控节点变动.URL去重等的实现方法.在接近一年的线上运行与迭代更新过程中,处理了很多bug ...

  6. 浅谈网络游戏的设计——服务器端编程 (3)

    关键词: 网络游戏 构思 策划 创意 竞争机制 竞争系统 本系列文章始终以浅谈二字开头,所以内容简单,不够深入,希望大家谅解. 但是,正如人类的学习过程一样,是一个由浅入深的过程.市面上很多昂贵的图书 ...

  7. 浅谈 UC 国际信息流推荐

    导读:本次分享的主题是浅谈UC国际信息流推荐.会跟大家探讨下发链路中常见的一些问题,主要包括两个场景: 列表页排序,包括:目标确定.多目标任务以及混排组合优化. 内容冷启问题,如果不做内容理解,能否做 ...

  8. java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...

    浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...

  9. JDK与JRE的关系和path的作用浅谈

    JDK与JRE的关系和path的作用浅谈 摘要:JDK与JRE的关系以及path的配置对于初学者是要明白的问题,那么具体的JDK与JRE的关系是什么呢?那么本文讲给你简单介绍. 标签:JDK与JRE关 ...

最新文章

  1. Python源码学习:Python函数浅析-函数闭包
  2. centos下面搭建svn服务器详细流程
  3. python异常处理时所使用的保留字_Python中,下列哪个保留字不用于异常处理______________。_学小易找答案...
  4. 浅析Hibernate映射(一)——基本映射
  5. 谁在窥屏_TheShy直播被窥屏搞怕了,为了防止被窥屏,这个做法绝了
  6. [转]揭开正则表达式的神秘面纱
  7. SOCKET通信的基本步骤
  8. 毕设日志——Linux中相对路径和文件的移动和常用指令
  9. ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程
  10. 二叉树层级打印(分层次和不分层次)
  11. Spring beans配置方案(二) 学习笔记
  12. 为什么物联网与云计算是天作之合
  13. 目标检测(一)--Objectness算法总体理解,整理及总结
  14. Chrome谷歌浏览器登入指引
  15. 水系图一般在哪里找得到_天津大学钟澄ESM综述:高能量密度水系电池的核心组件盐包水电解质...
  16. 「职称」2022年度中高级职称线下申报材料组卷要求(下)
  17. java-net-php-python-69jspm高校在线课程平台计算机毕业设计程序
  18. 香橙派 Ubuntu修改系统时间
  19. linux3.0字符设备驱动,linux字符设备驱动的 ioctl 幻数
  20. c语言——常见占位符(格式说明)

热门文章

  1. 打开苹果电脑浏览器的代码
  2. 【微客云】机器人怎么赚钱运营及功能介绍
  3. Pytest注册使用自定义mark标签
  4. 肯德基收款打印小票功能
  5. python输入一个字符串、计算其中小写字符的个数_利用键盘录入,输入一个字符串,统计该字符串中各个字符的数量,并输出(c/c++实现)...
  6. apollo配置中心
  7. mysql命令查看表内容
  8. 最长公共子序列 【DP】+【最长公共子序列】
  9. 关于oracle导入数据出现字符集问题及一点点解决办法!
  10. 天融信虚拟企业防火墙学习