欧拉函数知识点及其求法模板


欧拉函数

数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1) 例如φ(8)=4,因为1,3,5,7均和8互质。

欧拉函数有如下基本定理:

一: 是积性函数,设m与n是互素的正整数,那么;

二: :当n为奇数时,有

三: 设p是素数,a是一个正整数,那么

证明:(

由于表示小于互素数的正整数个数,所以用减去与它不互素的数的个数就行了。

那么小于不互素数的个数就是p的倍数个数,有个。所以定理得证。

)

四: 为正整数n的素数幂分解,那么

 

五: 设n是一个正整数,那么

 

六: 设n 是一个大于2 的正整数,则 φ(n)是偶数


常用的两个定理:


费马小定理:

当p是质数时   a(p-1)≡1(mod p)  : 简化幂运算


欧拉定理:

对于和m互素的x,有xφ(m)≡1(mod m)


直接求法: 适用于求单个 phi值时   此时时间复杂小, 且空间小;

int gphi(int n)
{
    int temp=n;
    for(int i=2;i<=n;i++)
    {
        if(n%i==0)
        {
            temp-=temp/i;
            while(n%i==0)
                n/=i;
        }

    }
    if(n>1)
            temp-=temp/n;
    return temp;
}


模板 求 欧拉函数值;

void get_phi(int n)// p是素数
{
cont=0;
	memset(vis,0,sizeof(vis));
    for(int i=2; i<=n; i++)
	{   
        if(!vis[i])
		{
            p[++cont]=i;
            phi[i] = i-1;   
        }
        for(int j=1; j<=cont && p[j]*i<=n; j++)
		{   
            vis[p[j]*i]=1;
            if(i%p[j]==0)
			{
                phi[i*p[j]] = p[j] * phi[i]; //欧拉函数性质
                break;   
            }
			else phi[i*p[j]] = (p[j]-1) * phi[i];
        }
    }
}

递推法求欧拉函数值:


复杂度 O (nln n)
void iinit()
{
	for(int i=1;i<=N;i++) phi[i]=i;
	for(int i=2;i<=N;i+=2)phi[i]>>=1;
	for(int i=3;i<=N;i+=2){
		if(phi[i]==i)
		{
			for(int j=i;j<=N;j+=i)
				phi[j]=phi[j]-phi[j]/i;
		}
	}
}


看一下应用:

例题一:  POJ 2407 http://poj.org/problem?id=2407

最简单的意思:  求 φ(n)    

直接用第一个:其余的打表模板, 空间占有量太大 n的范围是10^9 次方

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;
typedef long long ll;

int gphi(int n)
{
    int temp=n;
    for(int i=2;i<=n;i++)
    {
        if(n%i==0)
        {
            temp-=temp/i;
            while(n%i==0)
                n/=i;
        }

    }
    if(n>1)
            temp-=temp/n;
    return temp;
}
int main()
{
    int n;
    while(cin>>n&&n)
    {
        cout<<gphi(n)<<endl;
    }
    return 0;
}

例题2 :  POJ 1284   http://poj.org/problem?id=1284

原根:  求 x^i mod p = [1,p-1]     p原根的个数;

  这里用到一个结论     如果p 是素数, 则有 φ(p-1)个原根;

直接和上面的代码一样,  输出 gphi(n-1)即可;'

例题3 : POJ 2478  http://poj.org/problem?id=2478

f2= 1,f3 =3 f4=5, f5 =9 f6=11;

而 前10项  φ值为 1 1 2 2 4 2 6 4 6 4   可以发现 f(n)=  从第二项开始 前φ(n)项的和


所以 递推打表 

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;
typedef long long ll;
const int N=1000011;
ll phi[N+10];
void iinit()
{
	for(int i=1;i<=N;i++) phi[i]=i;
	for(int i=2;i<=N;i+=2)phi[i]>>=1;
	for(int i=3;i<=N;i+=2){
		if(phi[i]==i)
		{
			for(int j=i;j<=N;j+=i)
				phi[j]=phi[j]-phi[j]/i;
		}
	}
	for(int i=3;i<=N;i++)
		phi[i]+=phi[i-1];
}

int main()
{

    int n;
	iinit();
    while(cin>>n&&n)
    {
    	cout<<phi[n]<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 欧拉函数也称为欧拉-费马函数或费马函数,用符号φ(n)表示,表示小于等于n且与n互质的正整数的个数。 以下是一个用MATLAB编写的求欧拉函数的代码示例: ```matlab function result = euler_function(n) result = n; % 初始化结果为n p = 2; % 设置初始的素数为2 % 计算欧拉函数 while p^2 <= n if mod(n, p) == 0 result = result * (1 - 1 / p); while mod(n,p) == 0 n = n / p; end end p = p + 1; end % 处理剩余的质因数 if n > 1 result = result * (1 - 1 / n); end end ``` 使用方法: ```matlab n = 12; % 输入要求解欧拉函数的数n result = euler_function(n); % 调用欧拉函数的方法 disp(result); % 输出结果 ``` 这个代码通过迭代计算n的所有质因数,并根据欧拉函数的公式进行计算,最终得到欧拉函数的值。 ### 回答2: 欧拉函数(Euler's totient function)是一个计算小于等于给定正整数n的所有与n互质的正整数的个数。以下是用Matlab实现欧拉函数的代码: ```matlab function euler = euler_function(n) euler = n; % 将结果初始化为n p = 2; % 从最小的素数2开始 while p * p <= n % 当p的平方大于n时结束循环 if mod(n, p) == 0 % 若n能整除p euler = euler - euler / p; % 将结果减去n除以p的值(贡献) while mod(n, p) == 0 % 如果n继续能整除p,则继续除以p n = n / p; end end p = p + 1; % 继续查找下一个素数 end if n > 1 % 若n不为1,则n是一个大于sqrt(n)的质数 euler = euler - euler / n; % 将结果减去n除以n的值(贡献) end end ``` 这个函数接受一个正整数n作为输入,并返回n的欧拉函数值。函数首先将结果初始化为n,然后从最小的素数2开始,一直遍历到sqrt(n)为止。如果n能被p整除,它将以p的贡献减少结果。然后继续查找下一个素数。最后,如果n不等于1,则n是一个大于sqrt(n)的质数,将其贡献减少结果。 希望以上的代码可以满足你的需求。 ### 回答3: 欧拉函数是数论中一个重要的函数,用于计算小于n且与n互质的正整数的个数。欧拉函数的公式为:φ(n)=n×(1-1/p1)×(1-1/p2)×⋯×(1-1/pk)其中p1,p2,...,pk是n的所有质因数。 下面是求欧拉函数的MATLAB代码: ```matlab function result = euler_phi(n) result = n; for i = 2 : round(sqrt(n)) if (n % i == 0) result = result * (1 - 1/i); while (n % i == 0) n = n / i; end end end if (n > 1) result = result * (1 - 1/n); end end ``` 在这段代码中,我们首先将结果初始化为n。然后从2到sqrt(n)遍历,如果n能被i整除,则说明i是n的一个质因数。这时,我们将结果乘以(1-1/i),然后不断将n除以i直到n不能再被i整除为止。最后,如果n大于1,说明n本身也是一个质因数,我们将结果乘以(1-1/n)。 这段代码可以在MATLAB中调用,例如: ```matlab n = 12; result = euler_phi(n); disp(result); ``` 这样就可以得到12的欧拉函数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值