数学知识--(欧拉函数,快速幂,扩展欧几里得算法)

2024-04-06 13:44

本文主要是介绍数学知识--(欧拉函数,快速幂,扩展欧几里得算法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文用于记录个人算法竞赛学习,仅供参考

目录

一.欧拉函数

 二.欧拉函数模板

三.用筛法求每个数的欧拉函数

 四.快速幂

 五.扩展欧几里得算法

 六.用扩展欧几里得算法求线性同余方程


一.欧拉函数

 即有一个数n, n通过质因数分解得到n=^{​{_{\rho 1}}^{\alpha 1} \cdot {_{\rho 2}}^{\alpha 2} ... {_{\rho k}}^{\alpha k}}

通过欧拉函数有\phi (n) = n(1-\frac{1}{\rho 1})(1-\frac{1}{\rho 2})...(1-\frac{1}{\rho k})

证明:容斥原理

 二.欧拉函数模板

\phi (n) = n(1-\frac{1}{\rho 1})(1-\frac{1}{\rho 2})...(1-\frac{1}{\rho k})

实际上就是分解质因数

时间复杂度:O(n^{\frac{1}{2}})

//计算一个数的欧拉函数的值
int phi(int x)
{int result = x;//分解质因数for (int i = 2; i <= x / i; i++){if (x % i == 0){//注意变形result = result / i * (i - 1);//将质数i除干净while (x % i == 0)x /= i;}}if (x > 1)result = result / x * (x - 1);return result;
}

三.用筛法求每个数的欧拉函数

求一个数的欧拉函数是O(n^{\frac{1}{2}}), 用遍历每个数的方法来求每个数欧拉函数时间复杂度是O(n*n^{\frac{1}{2}}),用筛法求每个数的欧拉函数只需要O(n)

//筛法求欧拉函数const int N = 100;
int primes[N], cnt; //primes存储素数,cnt用于计数
int eulers[N];       //存储每个数的欧拉函数
bool st[N];         //st判断该数是否被筛掉void get_eulers(int n)
{eulers[1] = 1;for (int i = 2; i <= n; i++){if (!st[i]){primes[cnt++] = i;eulers[i] = i - 1;}for (int j = 0; primes[j] <= n / i; j++){int t = primes[j] * i;st[t] = true;if (i % primes[j] == 0){eulers[t] = eulers[i] * primes[j];break;}eulers[t] = eulers[i] * (primes[j] - 1);}}
}

 四.快速幂

 

//求 m^ k mod p,时间复杂度 O(logk)。int qmi(int m, int k, int p)
{int result = 1;int t = m;while (k){if (k & 1)result = result * t % p;t = t * t % p;k >>= 1;}return result;
}

 五.扩展欧几里得算法

 

 

//扩展欧几里得算法
//ax + by = gcd(a,b),求x,y
//注意xy是&
int exgcd(int a, int b, int& x, int& y)
{//递归终点if (!b){x = 1, y = 0;return a;}int d = exgcd(b, a % b, y, x);y -= (a / b) * x;return d;
}

 六.用扩展欧几里得算法求线性同余方程

//扩展欧几里得算法
//ax + by = gcd(a,b),求x,y
//注意xy是&
int exgcd(int a, int b, int& x, int& y)
{//递归终点if (!b){x = 1, y = 0;return a;}int d = exgcd(b, a % b, y, x);y -= (a / b) * x;return d;
}int main()
{int n;scanf("%d", &n);while (n--){int a, b, m;scanf("%d %d %d", &a, &b, &m);int x = 0, y = 0;int d = exgcd(a, m, x, y);if (b % d != 0)printf("impossible\n");elseprintf("%d\n", (b / d) * x % m);}return 0;
}

 

这篇关于数学知识--(欧拉函数,快速幂,扩展欧几里得算法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/880025

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析