本文主要是介绍欧拉函数,欧拉定理,费马小定理介绍及模板,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
介绍
欧拉函数的定义:对于正整数 n n ,欧拉函数是小于等于的数中,与 n n 互质的数的数目
欧拉函数又称函数,例如 ϕ(8)=4 ϕ ( 8 ) = 4 ,因为1,3,5,7均和8互质
定理:
- 如果 n n 为某一个素数,则: ϕ(p)=p−1 ϕ ( p ) = p − 1
- 如果 n n 为某一个素数的幂次 pa p a ,则: ϕ(pa)=(p−1)∗pa−1 ϕ ( p a ) = ( p − 1 ) ∗ p a − 1
- 如果 n n 为任意两个互质的数的乘积,则: ϕ(a∗b)=ϕ(a)∗ϕ(b) ϕ ( a ∗ b ) = ϕ ( a ) ∗ ϕ ( b )
- 设 n=pa11∗pa22∗...∗pakk n = p 1 a 1 ∗ p 2 a 2 ∗ . . . ∗ p k a k 为正整数 n n 的素数幂分解,那么
推论: 当 n n 为奇数时,有
以下是两个常用的定理:
- 欧拉定理:对于任何两个数值的正整数 a,m a , m (m>=2),有 aϕ(m)≡1(mod m) a ϕ ( m ) ≡ 1 ( m o d m )
- 费马小定理: 当 m m 是质数时,
模板
返回小于等于n且与n互质的数的个数
int euler_phi(int n)
{ int res = n; int m = (int)sqrt(n); for(int i = 2; i <= m; 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;
}
筛选法求欧拉函数
void euler_phi()
{ for(int i = 1; i < N; i++) phi[i] = i; for(int i = 2; i < N; i++) if(phi[i] == i) //成立说明i是素数for(int j = i; j < N; j += i) //j要从i开始,这样可以处理素数的情况 phi[j] = phi[j] / i * (i-1);
}
这篇关于欧拉函数,欧拉定理,费马小定理介绍及模板的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!