浅谈欧拉函数

引言

我们知道,欧拉函数是一个非常有用的函数,要想学好数论,就必须要学懂欧拉函数(自己也没怎么学好)

话不多说,直接步入正题。


欧拉函数的基本定义

欧拉函数用符号\varphi \left ( \right )表示,如\varphi (8) = 4

那么就会有一个问题,欧拉函数得出的值的意义是:\varphi (n)得出的结果即 n 以内与 n 互质的整数的个数

\varphi (8)的结果是4,与8互质的数的个数为4,有 1 , 3 , 5 , 7 与 8 互质。

一个正整数 n ,可以分解为若干个质数的w次方乘积,设 m 为其质因子的个数,则有

           n = {p_{1}}^{w_{1}}*{p_{2}}^{w_{2}}*{p_{3}}^{w_{3}}*......*{p_{m}}^{w_{m}}

欧拉函数的通解为

\varphi (n)=n*(1-\frac{1}{p_{1}})*(1-\frac{1}{p_{2}})*(1-\frac{1}{p_{3}})*......*(1-\frac{1}{p_{m}})=n\prod_{i=1}^{m}(1-\frac{1}{p_{i}})

若 n 为 p 的 x 次方,则一定有\varphi (n)=\varphi(p^{x})=p^{x}-p^{x-1}=(p-1)*(p^{x-1})

所以

\varphi (n)=(p_{1}-1)*{p_{1}}^{w_{1}-1}*(p_{2}-1)*{p_{2}}^{w_{2}-1}*(p_{3}-1)*{p_{3}}^{w_{3}-1}*......*(p_{m}-1)*{p_{m}}^{w_{m}-1}


欧拉函数的性质

1. 若 p 为质数,则\varphi (p) = p -1

因为 p 是质数,则 p 以内的所有数都与其互质

2. 若 p > 2,则\varphi (p)一定是偶数

因为互质数是成对出现的,如 p - a 与 p 互质,则 a 也会与 p 互质

3.当N为奇数时,φ(2*N)=φ(N)


代码

求出欧拉函数的代码实现

方法一

scanf("%lld", &n );
        if( n == 0 )
            return 0;
        long long m = n ;
        for(int i = 2 ; i * i <= m ; ++ i )//分解为质数乘积
        {
            if( m % i == 0 )
            {
                cnt ++ ;
                p[cnt] = i ;
                while( m % i == 0 )
                {
                    m = m / i ;
                    w[cnt] ++ ;
                } 
            }
        }
        if( m != 1 )
        {
            cnt ++ ;
            p[cnt] = m ;
            w[cnt] = 1 ;
        }
        long long ans = 1 ;
        for(int i = 1 ; i <= cnt ; ++ i )
        {
            ans = ans * (p[i] - 1 ) ;
            for(int j = 1 ; j < w[i] ; j ++ )
            {
                ans = ans *p[i] ;
            }
        }

方法二

ph[1] = 1 ;//结合欧式筛法,可以求出 n 以内每一个数的欧拉函数值
    scanf("%d", &n );
    for(int  i = 2 ; i <= n ; ++ i ) {
        if(!vis[i]) {
            cnt ++ ;
            pr[cnt] = i ;
            ph[i] = i - 1 ;
        }
        for(int j = 1 ; j <= cnt && i * pr[j] <= n ; ++ j ) {
            vis[ i * pr[j] ] = 1 ;
            if( i % pr[j] == 0 ) {
                ph[ pr[j] * i ] = ph[i] * pr[j] ;
                break;
            }
            else
                ph [ pr[j] * i] = ph[i] * (pr[j] - 1 );
        }
    }

希望这篇文章对大家有一定帮助

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值