欧拉函数详解

欧拉函数

我们用$\phi(n)$表示欧拉函数

定义:$\phi(n)$表示对于整数$n$,小于等于$n$中与$n$互质的数的个数

性质

1.$\phi(n)$为积性函数

2.$\sum_{d|n}\phi(d)=n$

3.$1$到$n$中与$n$互质的数的和为$n*\dfrac{\phi(n)}{2}(n>1)$

计算方法

$\sqrt(n)$计算单值欧拉函数

假设我们需要计算$\phi(n)$

分情况讨论

1.当$n=1$时

很明显,答案为$1$

2.当$n$为质数时

根据素数的定义,答案为$n-1$

(仅有$n$与$n$不互质)

3.当$n$为合数时

我们已经知道了$n$为素数的情况

不妨对$n$进行质因数分解

设$n=a_1^{p_1}*a_2^{p_2}...*a_k^{p_k}$

假设$k=1$

那么$\phi(p^k)=p^k-p^{k-1}$

证明:

考虑容斥,与一个数互素的数的个数就是这个数减去与它不互素的数的个数

因为$p$是素数,所以在$p^k$中与其不互素的数为$1*p$,$2*p$....$p^{k-1}*p$,有$p^{k-1}$个

得证

当$k\neq 1$时

$$\phi(n)$$

$$=\varphi \left( a^{p_{1}}_{1}a^{p_{2}\ldots }_{2}a^{Pk}_{k}\right)$$

$$=\prod ^{k}_{i=1}a^{P_i}-a^{P_{i}-1}_{i}$$

$$=\prod ^{k}_{i=1}a^{Pi}_{i}(1-\dfrac {1}{p_{i}})$$

$$=n*\prod ^{k}_{i=1}(1-\dfrac {1}{p_{i}})$$

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define LL long long
using namespace std;
int main()
{
    LL N;
    while(cin>>N&&N!=0)
    {
        int limit=sqrt(N),ans=N;
        for(int i = 2; i <= limit ; ++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);
        printf("%d\n",ans);
    }
    return 0;
}

线性筛

因为欧拉函数是积性函数

因此可以使用线性筛法

性质1

若$p$为素数,则$\varphi \left( p\right) =p-1$

证明:

在$1-p$中,只有$(p,p)\neq1$

性质2

若$i mod p \neq  0$,且$p$为素数

则$\varphi \left( i*p\right) =\varphi \left( i\right) *\varphi \left( p\right)$

$=\varphi \left( i\ast p\right) =\varphi \left( i\right) \ast \left( p-1\right)$

这一步同时利用了性质1和欧拉函数的积性

性质3

若$i mod p = 0$,且$p$为素数,

则$\varphi \left( i\ast p\right) =\varphi \left( i\right) \ast p$

证明:

没怎么看懂,丢一个链接

http://blog.csdn.net/Lytning/article/details/24432651

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define LL long long
using namespace std;
const int MAXN=1e6+10;
int prime[MAXN],tot=0,vis[MAXN],phi[MAXN],N=10000;
void GetPhi()
{
    for(int i=2;i<=N;i++)
    {
        if(!vis[i])
        {
            prime[++tot]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=tot&&prime[j]*i<=N;j++)
        {
            vis[ i*prime[j] ] = 1;
            if(i%prime[j]==0)
            {
                phi[ i*prime[j] ]=phi[i]*prime[j];
                break;
            }
            else phi[ i*prime[j] ]=phi[i]*(prime[j]-1);
        }
    }
}
int main()
{
    GetPhi();
    cin>>N;
    printf("%d\n",phi[N]);
    return 0;
}

例题

放两道水题

http://poj.org/problem?id=2407

题解

http://poj.org/problem?id=2478

题解

原文地址:https://www.cnblogs.com/zwfymqz/p/8215259.html

时间: 2024-10-16 17:24:12

欧拉函数详解的相关文章

poj 3696 The Luckiest number 欧拉函数在解a^x=1modm的应用

题意: 给一个L,求长度最小的全8数满足该数是L的倍数. 分析: 转化为求方程a^x==1modm.之后就是各种数学论证了. 代码: //poj 3696 //sep9 #include <iostream> #include <algorithm> using namespace std; typedef long long ll; ll L; ll factor[65536]; ll mul(ll x,ll y,ll p) { ll ret=0; while(y){ if(y&

数学之欧拉函数 &amp;几道poj欧拉题

欧拉函数总结+证明 欧拉函数总结2 POJ 1284 原根 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int Euler(int n) { int res=n; for(int i=2;i*i<=n;i++) { while(n%i==0) { n/=i; res

欧拉函数与欧拉定理

以下内容摘自acdreamer 定理一:设m与n是互素的正整数,那么 定理二:当n为奇数时,有. 因为2n是偶数,偶数与偶数一定不互素,所以只考虑2n与小于它的奇数互素的情况,则恰好就等于n的欧拉函数值. 定理三:设p是素数,a是一个正整数,那么 关于这个定理的证明用到容斥: 由于表示小于与互素数的正整数个数,所以用减去与它不互素的数的个数就行了. 那么小于与不互素数的个数就是p的倍数个数,有个.所以定理得证. 定理四:设为正整数n的素数幂分解,那么 这个定理可以根据定理一和定理三证明,其实用到

【转载】3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解

原文:3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解 3D中z值会影响屏幕坐标系到世界坐标系之间的转换,2D中Z值不会产生影响(而只是屏幕宽高比会产生影响,z值只对深度剔除产生影响).所以U3D中如果用2D摄像机那么屏幕坐标和世界坐标之间的转换需要用指定的2D摄像机才行,如果用主3D摄像机那么UI转换会产生计算结果异常. 一.D3DXMatrixPerspectiveFovLH函数 作用:Builds a left-handed

POJ2407 Relatives(欧拉函数)

题目问有多少个小于n的正整数与n互质. 这个可以用容斥原理来解HDU4135.事实上这道题就是求欧拉函数$φ(n)$. $$φ(n)=n(1-1/p_1)(1-1/p_2)\dots(1-1/p_m)\tag{p为n的质因子}$$ 这个通项公式可以通过容斥原理的解法来验证.那么利用这个通项就能在$O(\sqrt[]n)$下计算出φ(n). 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int phi(

[BZOJ 2705][SDOI 2012]Longge的问题(欧拉函数)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2705 网上的题解都不是很靠谱,我就来YY下自己的思路吧... 首先,对于1<=i<=N,gcd(i,N)的可能性解就是N的约数.那么这个题就是求Σgcd(i,N)=k,k是n的因数,等价于求Σgcd(i/k,N/k)=gcd(i',N/k)=1,即找出所有与N/k互质且小于等于N/k的i'的个数,这就转化到求欧拉函数的问题上来了. 所以这个题的做法是,sqrt(N)复杂度内枚举

数论 - 欧拉函数模板题 --- poj 2407 : Relatives

Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11372   Accepted: 5544 Description Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if ther

POJ2480 Longge&#39;s problem 欧拉函数的应用 &amp;&amp; 积性函数

题意很简单,求sum(gcd(i,n))   1<=i<=n; 这题看到后第一反应并没有里用积性函数的性质,不过也可以做,欣慰的是我反应还是比较快的 设f(n)=gcd(1,n)+gcd(2,n)+....+gcd(n-1,n) + gcd(n,n), 用g(n,i)表示满足 gcd(x,n)=i的 x的个数 (x小于n),则 f(n)=sum{i*g(n,i)}; 同时又利用 扩展欧几里德的性质  gcd(x,n)=i  的充要条件是 gcd(x/i,n/i)==1,所以 满足 x/i的解有

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu