欧拉函数算法

article/2025/11/10 18:58:53

一、欧拉函数值

欧拉函数又称为Phi函数
欧拉函数的定义为:对于正整数n,他的欧拉函数值是不大于n的正整数中与n互质的正整数的个数(互质:除1外没有其他最大公约数)。
据此,可以得到求某个数欧拉值的代码:

法一:暴力方法求欧拉函数值:

int gcd(int a, int b)
{return b == 0 ? a : gcd(b, a % b);
}
int Phi(int x)
{int ans = 0;for (int i = 1; i <= x; i++){if (gcd(i, x) == 1)ans++;}return ans;
}

这种方法时间复杂度为O(nlogn)

法二、公式法求欧拉函值

公式

p1,p2…pn是n的质因数
比如8,8只有一个质因数2,4是其因数但不是质因数12的质因数为2和3,2的倍数都不是其质因数,有1/2是2的倍数,1/2不是2的倍数;3的倍数也不是其质因数,3的倍数不是其质因数,有1/3,所以2/3是其质因数所以12的质因数有121/22/3 = 4;

1.原理:利用欧拉函数公式 1与任何整数都互质。

#include<bits/stdc++.h>
using namespace std;
int Phi(int n){int ans = n;for(int i = 2; i * i <= n; i++){if(n % i == 0){ans = ans /i*(i - 1);}while(n % i == 0){n = n /i;}}if(n > 1) ans = ans /n*(n -1);return ans;}
int main(){int n;cin >> n;cout << Phi(n);
}

有时候我们不仅仅求某一个数的欧拉函数值,而是要求欧拉函数根据欧拉函数值的定义以及欧拉函数使用筛法求出欧拉函数表
**

二、利用挨氏筛求欧拉函数表⭐⭐⭐

**

原理:挨氏筛求欧拉函数表,利用欧拉函数公式,时间复杂度为O(nlogn)只需要开一个phi数组phi数组具有两个最用,标记是不是素数,同时在程序运行过程中求出欧拉函数值

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int phi[N]; //phi[i] 为0时是素数
void GetPhi(int maxn){memset(phi,0,sizeof(phi));phi[1] = 1;for(int i = 2; i < maxn; i++){if(!phi[i]){for(int j = i; j < maxn; j = j + i){  //把i的倍数全处理了if(!phi[j]) phi[j] = j;phi[j] = phi[j]/i * (i - 1);}}}return;
}
int main(){int x;cin >> x;GetPhi(100);cout << phi[x];}

三、利用欧拉筛求欧拉函数表

线性筛求欧拉函数表的原理是利用欧拉函数递推式,时间复杂度为O(n)

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
bool isprime[N];
int primes[N],pn;
int phi[N];
void FastPhi(int maxn){memset(isprime,true,sizeof(isprime));isprime[0] = isprime[1] = false;phi[1] = 1;pn = 0;for(int i = 2; i < maxn; i ++){if(isprime[i]){primes[pn++] = i;phi[i] = i - 1;}for(int j = 0; j < pn && i * primes[j] < maxn; j++){isprime[i * primes[j]] = false;if(i % primes[j] == 0){phi[i * primes[j]] = phi[i] * primes[j];break;}phi[i * primes[j]] = phi[i] * (primes[j] - 1);}}return;
}
int main(){}

例题

Farey Sequence (POJ 2478) Description

The Farey Sequence Fn for any integer n with n >= 2 is the set of
irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1
arranged in increasing order. The first few are F2 = {1/2} F3 = {1/3,
1/2, 2/3} F4 = {1/4, 1/3, 1/2, 2/3, 3/4} F5 = {1/5, 1/4, 1/3, 2/5,
1/2, 3/5, 2/3, 3/4, 4/5}

You task is to calculate the number of terms in the Farey sequence Fn.
Input There are several test cases. Each test case has only one line, which contains a positive integer n (2 <= n <= 106). There are
no blank lines between cases. A line with a single 0 terminates the
input.
Output For each test case, you should output one line, which contains N(n) ---- the number of terms in the Farey sequence Fn.
Sample Input 2 3 4 5 0 Sample Output 1 3 5 9

思路
求解小于N的互质组数,相当于求欧拉函数值的和在(2<=i<=n),直接用打表法算出欧拉函数表。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e6 + 100;
int phi[N]; //phi[i] 为0时是素数
void getPhi(int maxn){memset(phi,0,sizeof(phi));phi[1] = 1;for(int i = 2; i < maxn; ++i){if(!phi[i]) //满足该条件为素数{for(int j = i ; j < maxn; j = j + i){if(!phi[j]) phi[j] = j;phi[j] = phi[j] /i * (i - 1);}}}return;
}
int main(){getPhi(N);int n;while(cin >> n){if(n == 0) break;long long  sum = 0;for(int i = 2; i <=n; i++){sum += phi[i];}cout << sum <<endl;}  }

注意sum的取值范围,用int的话可能导致结果不正确,需要使用int,或者是—__int64 sum = 0;在提交POJ时不能使用万能头文件


http://chatgpt.dhexx.cn/article/51Gb4MSu.shtml

相关文章

数学知识:欧拉函数

文章目录 前言一、欧拉函数&#xff0c;欧拉定理二、例题&#xff0c;代码AcWing 873. 欧拉函数AC代码 AcWing 874. 筛法求欧拉函数本题解析AC代码 三、时间复杂度 前言 复习acwing算法基础课的内容&#xff0c;本篇为讲解数学知识&#xff1a;欧拉函数&#xff0c;关于时间复…

欧拉函数相关概念

一、欧拉函数 给定正整数n&#xff0c;欧拉函数φ(n)不大于n且和n互质的正整数的个数(包括1)。φ(1)1 φ ( n ) Σ i 1 n [ g c d ( i , n ) 1 ] \varphi \left( n \right) \varSigma_{i1}^{n}\left[ gcd\left( i,n \right) 1 \right] φ(n)Σi1n​[gcd(i,n)1] 完全余数集…

欧拉函数与欧拉定理

转载请说明出处&#xff1a;http://blog.csdn.net/leader_one/article/details/77619762 说在前面 按照惯例&#xff0c;出于尊重&#xff0c;还是简单介绍一下这位多产的学术伟人 莱昂哈德欧拉&#xff08;Leonhard Euler &#xff0c;1707年4月15日&#xff5e;1783年9月1…

欧拉函数及模板

欧拉函数 什么是欧拉函数怎么计算欧拉函数欧拉函数三种常用模板素因数分解求欧拉函数欧拉函数值打表欧拉筛型欧拉函数 什么是欧拉函数 欧拉函数是小于等于x的整数中与x互质的数的个数&#xff0c;一般用φ(x)表示。特殊的&#xff0c;φ(1)1。 例如&#xff0c;φ(12)4 {1,5,7…

如何求欧拉函数~转载

三、欧拉函数 请思考以下问题&#xff1a; 任意给定正整数n&#xff0c;请问在小于等于n的正整数之中&#xff0c;有多少个与n构成互质关系&#xff1f;&#xff08;比如&#xff0c;在1到8之中&#xff0c;有多少个数与8构成互质关系&#xff1f;&#xff09; 计算这个值的方法…

欧拉函数公式证明

请思考以下问题&#xff1a; 任意给定正整数n&#xff0c;请问在小于等于n的正整数之中&#xff0c;有多少个与n构成互质关系&#xff1f;&#xff08;比如&#xff0c;在1到8之中&#xff0c;有多少个数与8构成互质关系&#xff1f;&#xff09; 计算这个值的方法就叫做欧拉函…

欧拉函数

原文链接&#xff1a;https://zh.m.wikipedia.org/zh/%E6%AC%A7%E6%8B%89%E5%87%BD%E6%95%B0 欧拉函数 本文介绍的是小于或等于 n的正整数中与 n 互质的数的数目。关于形式为 的函数&#xff0c;详见「 欧拉函数(复变函数)」。 当 n为1至1000的整数时 的值 在数论中&#xff0…

数学知识——欧拉函数

1. 欧拉函数 定义&#xff1a;欧拉函数ψ(n) 表示1~n中与n互质的数的个数 公式&#xff1a;如果一个数可以被分解质因式为N p1α1 *p2α2……pkαk 则ψ(n) n(1 - 1/p1)(1 - 1/p2)…(1 - 1/pk) 公式由容斥原理证明&#xff0c;证明略 算法实现思路&#xff1a; 利用求一个数…

数论基础——欧拉函数

欧拉函数&#xff1a; 就是对于一个正整数n&#xff0c;小于n且和n互质的正整数&#xff08;包括1&#xff09;的个数&#xff0c;记作φ(n) 。 欧拉函数的通式&#xff1a;φ(n)n*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)……(1-1/pn) 其中p1, p2……pn为n的所有质因数&#xff…

欧拉函数——数学知识(c++)

定义&#xff1a;欧拉函数表示1-N中与N互质的数的个数&#xff1b; 给定一个数n&#xff0c;求在[1,n]这个范围内两两互质的数的个数 对于这个范围内的每一个数&#xff0c;我们只要找到不超过这个数且与这个数互质的数的个数就可以了 欧拉函数用希腊字母φ表示,φ(N)表示N的欧…

欧拉函数(Euler_Function)

一、基本概述 在数论&#xff0c;对正整数n&#xff0c;欧拉函数varphi(n)是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名&#xff0c;它又称为Eulers totient function、φ函数、欧拉商数等。 二、计算公式 三、基本性质 欧拉函数用希腊字母φ表示,φ…

欧拉函数最全总结

文章目录 欧拉函数的内容一、欧拉函数的引入二、欧拉函数的定义三、欧拉函数的性质四、欧拉函数的计算方法&#xff08;一&#xff09;素数分解法&#xff08;二&#xff09;编程思维1.求n以内的所有素数2.求φ(n)3.格式化输出0-100欧拉函数表&#xff08;“x?”代表十位数&am…

什么是时间复杂度

什么是算法 算法可以理解就是一系列被控制的步骤&#xff0c;你通过按序执行这些步骤可以实现一些目标或者产生一些输出。 时间复杂度 时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数.时间复杂度常用大O表述表述&#xff0c…

算法的时间复杂度和空间复杂度详解

通常&#xff0c;对于一个给定的算法&#xff0c;我们要做 两项分析。第一是从数学上证明算法的正确性&#xff0c;这一步主要用到形式化证明的方法及相关推理模式&#xff0c;如循环不变式、数学归纳法等。而在证明算法是正确的基础上&#xff0c;第二部就是分析算法的时间复杂…

一文详解时间复杂度

一文详解时间复杂度&#xff0c;从里到外清晰认识 1. 什么是时间复杂度2. 关于大O3. 不同数据规模的差异4. 复杂表达式的化简5. O ( l o g n ) O(logn) O(logn)中的 l o g log log是以什么为底&#xff1f;举一个例子 总结 1. 什么是时间复杂度 时间复杂度是一个函数&#xff…

时间复杂度分析

该节知识点引用机械工业出版社数据结构和算法分析第2章内容 以及极客时间数据结构和算法部分知识点 时间复杂度基础分析 算法执行时间分析 时间复杂度分析更多的是对要编写的代码进行一个事前预估分析的一个过程&#xff0c;通过事前大致分析出算法执行的时间和所需要的空间…

算法时间复杂度

在 算法基础 中&#xff0c;我们简单介绍了什么是算法、对算法的要求&#xff0c;以及说了评断算法效率的两大类方法。今天我们将重点介绍衡量算法效率的一个概念——时间复杂度。 定义 在进行算法分析的时候&#xff0c;语句的总执行次数 T(n) 是关于问题规模 n&#xff08;输…

java时间复杂度计算_时间复杂度到底怎么算

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题&#xff0c;使用不同的算法&#xff0c;也许最终得到的结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别。 那么我们应该如何去衡量不同算法之间的优劣呢&#xff1f; 主要还是从…

Python 时间复杂度计算

一、时间复杂度 1 常见的时间复杂度 #常量阶O(1)# 对数阶O(logn)# 线性对数阶O(nlogn)# 线性阶O(n)# 平方阶,立方阶....M次方阶O(n^2),O(n^3),O(n^m)# 指数阶O(2^n)# 阶乘阶O(n!) 算法的时间复杂度对比&#xff1a; O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2lo…

树的时间复杂度

时间复杂度是一个函数&#xff0c;它定量描述了该算法的运行时间。常见的时间复杂度有以下几种。 1&#xff0c;log(2)n&#xff0c;n&#xff0c;n log(2)n &#xff0c;n的平方&#xff0c;n的三次方&#xff0c;2的n次方&#xff0c;n! 1指的是常数。即&#xff0c;无论算法…