关于欧拉定理

欧拉定理

a φ ( n ) 1 ( m o d n ) , g c d ( a , n ) = 1

对于正整数 n ,代表小于等于 n 的与 n 互质的数的个数,记作 φ ( n )
比如 φ ( 6 ) = 2 ,因为与 6 互质并且小于等于 6 的正整数有 1 , 5

扩展欧拉定理(降幂公式)

a b { a b % φ ( p ) , gcd(a,p) = 1 a b , gcd(a,p) 1, b φ (p) a b % φ ( p ) + φ ( p ) , gcd(a,p) 1, b   φ (p) ( m o d p )


除此之外呢,欧拉定理有以下几个性质,
1. 如果 n 为某一素数 p ,则有 φ ( p ) = p 1 。因为 p 为素数,因子只有 1 p ,而 p p 不互质,所以 φ ( p ) = p 1

实际上呢,欧拉定理是费马小定理的一种推广,我们利用性质 1 就可以很容易证明。
费马小定理: a p 1 1 ( m o d p ) , g c d ( a , p ) = 1 。因为 p 为质数,所以有 φ ( p ) = p 1 ,代入欧拉定理即可。
推论: a p a ( m o d p ) ,如果 a 能被 p 整除。

2. 如果 n 为某一素数 p 的幂次,则有 φ ( p a ) = ( p 1 ) p a 1 。因为比 p a 小的正整数有 p a 1 个,能被 p 整除的数有 p a 1 1 个(将 1 p a 1 之间 p 的倍数筛去),所以 φ ( p a ) = p a 1 ( p a 1 1 ) = ( p 1 ) p a 1

3. 如果 n 为任意两个正整数 a b 的乘积( a b 互质),那么有 φ ( a b ) = φ ( a ) φ ( b ) 。我们设 x = ϕ ( i ) (即和 a b 互质的数),那么就有

( S ) : { x 1 t 1 ( m o d a ) ( g c d ( t 1 , a ) = 1 ) x 2 t 2 ( m o d b ) ( g c d ( t 2 , b ) = 1 )
那么我们根据 中国剩余定理可知,对于任意 t 1 , t 2 ,方程组 ( S ) 的解在区间 [ 1 , a b ) 有唯一解与之对应。 t 1 的取值有 φ ( a ) 个, t 2 的取值有 φ ( b ) 个。
所以 φ ( a b ) = φ ( a ) φ ( b )

4. n = p 1 e 1 p 2 e 2 p 3 e 3 . . . . . . p k e k p i 为素数),则有
φ ( n ) = n ( 1 1 p 1 ) ( 1 1 p 2 ) ( 1 1 p 3 ) . . . . . . ( 1 1 p k )
根据性质 2 和性质 3 就可以很好的推出:因为 p i 都为素数,所以每一个 p i 都是互质的,所以同样 p i e i 也是互质的。因此由性质 2 φ ( p i e i ) = p i e i 1 ( p i e i 1 1 ) = p i e i ( 1 1 p i ) ,和性质 3 φ ( p 1 e 1 p 2 e 2 p 3 e 3 . . . . . . p k e k ) = φ ( p 1 e 1 ) φ ( p 2 e 2 ) φ ( p 3 e 3 ) . . . . . . φ ( p k e k ) ,可以推出 φ ( n ) = n ( 1 1 p 1 ) ( 1 1 p 2 ) ( 1 1 p 3 ) . . . . . . ( 1 1 p k )

欧拉函数的线性筛法

根据如下三个性质可以完成线性筛法。
1. φ ( p ) = p 1
2. φ ( p i ) = p φ ( i ) ( p % i = 0 )
3. φ ( p i ) = ( p 1 ) φ ( i ) ( p % i 0 )
(具体证明就不证啦啦~作为模板使用就好啦^_^)

void initPhi(int n)
{
    phi[1] = 1; //φ(1) = 1
    for(int i = 2; i <= n; ++i){
        if(!vis[i]){
            phi[i] = i - 1; //性质1
            prime[++cnt] = i;
        }
        for(int j = 1; j <= cnt; ++j){
            if(i * prime[j] > n) break;
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0){ //性质2
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * phi[prime[j]]; //性质3
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Eternally831143/article/details/81478720
今日推荐