算法学习系列(二十七):欧拉函数、欧拉定理、费马小定理

2024-01-27 18:36

本文主要是介绍算法学习系列(二十七):欧拉函数、欧拉定理、费马小定理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 引言
  • 一、欧拉函数
    • 1.概念
    • 2.求每个数的欧拉函数
  • 二、线性筛法求欧拉函数
  • 三、欧拉定理,费马小定理

引言

本文主要介绍欧拉函数、线性筛法求欧拉函数,以及公式是怎样推导出来的,并且介绍了欧拉定理,以及费马小定理是怎样被推导出来的。

一、欧拉函数

1.概念

欧拉函数 ϕ ( N ) : 欧拉函数\phi(N): 欧拉函数ϕ(N) 1 ~ N中与N互质的数的个数,(互质:公约数只有1的两个自然数)
N = p 1 α 1 ⋅ p 2 α 2 ⋅ p 3 α 3 ⋅ ⋯ p k α k , ( p i 为质数 ) N = p_{1}^{\alpha_{1}} \cdot p_{2}^{\alpha_{2}} \cdot p_{3}^{\alpha_{3}} \cdot \cdots p_{k}^{\alpha_{k}},(p_{i}为质数) N=p1α1p2α2p3α3pkαk,(pi为质数) ϕ ( N ) = N ⋅ ( 1 − 1 1 − p 1 ) ⋅ ( 1 − 1 1 − p 2 ) ⋯ ( 1 − 1 1 − p k ) \phi(N)=N\cdot(1-\frac{1}{1-p_{1}})\cdot(1-\frac{1}{1-p_{2}})\cdots(1-\frac{1}{1-p_{k}}) ϕ(N)=N(11p11)(11p21)(11pk1)

2.求每个数的欧拉函数

题目描述:

给定 n 个正整数 ai,请你求出每个数的欧拉函数。欧拉函数的定义
1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
若在算数基本定理中,N=pa11pa22…pamm,则:ϕ(N) = N×p1−1p1×p2−1p2×…×pm−1pm输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。输出格式
输出共 n 行,每行输出一个正整数 ai 的欧拉函数。数据范围
1≤n≤100,1≤ai≤2×109输入样例:
3
3
6
8
输出样例:
2
2
4

示例代码:

#include <cstdio>
#include <iostream>using namespace std;int get_euler(int n)
{int res = n;for(int i = 2; i <= n / i; ++i){if(n % i == 0){res = res / i * (i - 1);  //为避免小数while(n % i == 0) n /= i;}}if(n > 1) res = res / n * (n - 1);return res;
}int main()
{int n;scanf("%d", &n);while(n--){int a;scanf("%d", &a);int res = get_euler(a);printf("%d\n", res);}return 0;
}

二、线性筛法求欧拉函数

当 i 为质数: ϕ ( i ) = i − 1 当i为质数:\phi(i)=i-1 i为质数:ϕ(i)=i1
当 i m o d p r i m e s [ j ] = 0 , 当i \ mod \ primes[j] = 0, i mod primes[j]=0, ϕ ( i ∗ p r i m e s [ j ] ) = i ∗ p r i m e s [ j ] ∗ ( 1 − 1 1 − p 1 ) ∗ ( 1 − 1 1 − p 2 ) ⋯ ( 1 − 1 1 − p k ) = p r i m e s [ j ] ∗ ϕ ( i ) \phi(i*primes[j])= i\ *\ primes[j]\ *\ (1-\frac{1}{1-p_{1}})\ *\ (1-\frac{1}{1-p_{2}})\cdots\ (1-\frac{1}{1-p_{k}}) = primes[j] * \phi(i) ϕ(iprimes[j])=i  primes[j]  (11p11)  (11p21) (11pk1)=primes[j]ϕ(i)
当 i m o d p r i m e s [ j ] ! = 0 , 当i \ mod \ primes[j]\ !=\ 0, i mod primes[j] != 0, ϕ ( i ∗ p r i m e s [ j ] ) = i ∗ p r i m e s [ j ] ∗ ( 1 − 1 1 − p 1 ) ∗ ( 1 − 1 1 − p 2 ) ⋯ ( 1 − 1 1 − p k ) ∗ ( 1 − 1 1 − p r i m e s [ j ] ) = ( p r i m e s [ j ] − 1 ) ∗ ϕ ( i ) \phi(i*primes[j])= i\ *\ primes[j]\ *\ (1-\frac{1}{1-p_{1}})\ *\ (1-\frac{1}{1-p_{2}})\cdots\ (1-\frac{1}{1-p_{k}})\ *\ (1-\frac{1}{1-primes[j]}) = (primes[j]-1)\ *\ \phi(i) ϕ(iprimes[j])=i  primes[j]  (11p11)  (11p21) (11pk1)  (11primes[j]1)=(primes[j]1)  ϕ(i)

题目描述:

给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和。输入格式
共一行,包含一个整数 n。输出格式
共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和。数据范围
1≤n≤106输入样例:
6
输出样例:
12

示例代码:

#include <cstdio>
#include <iostream>using namespace std;typedef long long LL;const int N = 1e6+10;int primes[N], cnt;
int phi[N];
bool st[N];LL get_eulers(int n)
{phi[1] = 1;for(int i = 2; i <= n; ++i){if(!st[i]){phi[i] = i - 1;primes[cnt++] = i;}for(int j = 0; primes[j] * i <= n; ++j){st[primes[j] * i] = true;if(i % primes[j] == 0){phi[i * primes[j]] = phi[i] * primes[j];break;}phi[i * primes[j]] = phi[i] * (primes[j] - 1);}}LL res = 0;for(int i = 1; i <= n; ++i) res += phi[i];return res;
}int main()
{int n;scanf("%d", &n);LL res = get_eulers(n);printf("%lld\n", res);return 0;
}

三、欧拉定理,费马小定理

欧拉定理:若 a 与 n 互质,则 a ϕ ( n ) ≡ 1 ( m o d n ) 欧拉定理:若a与n互质,则a^{\phi(n)} \equiv 1 \pmod n 欧拉定理:若an互质,则aϕ(n)1(modn) 费马小定理: a p − 1 ≡ 1 ( m o d p ) (当 p 为质数,则 ϕ ( p ) = p − 1 ) 费马小定理:a^{p-1} \equiv 1 \pmod p(当p为质数,则\phi(p)=p-1) 费马小定理:ap11(modp)(当p为质数,则ϕ(p)=p1

这篇关于算法学习系列(二十七):欧拉函数、欧拉定理、费马小定理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>