上午

关键词:欧拉函数。

欧拉函数

定义

对于正整数$n$,欧拉函数是指不大于$n$的数中与$n$互质的正整数的数目。例如$\phi (8)=4$,因为$1,3,5,7$均和$8$互质。

公式

$$\phi (a)=a \times \prod_{i=1}^n 1-\cfrac{1}{p_1} (a \in N_+)$$

特别的,$\phi (1)=1$。

其中$p_1,p_2,\cdots,p_n$为$a$的所有质因数,每种质因数有且只有一个。如$12=2^2*3$那么$\phi(12)=12 \times (1-\cfrac12) \times (1-\cfrac13)=4$

性质

  • $\phi (n)=p^k-p^{k-1}$
  • $\phi (mn)=\phi (m) \times \phi (n)$,欧拉函数是积性函数。

代码

int oula( int n ) {
    for ( int i = 1; i <= n; i++ ) {
        phi[i] = i;
    }
    for ( int i = 2; i <= n; i++ ) {
        if ( phi[i] == i ) {
            for ( int j = i; j <= n; j++ ) {
                phi[j] = phi[j] / i * ( i - 1 );
            }
        };
    }
    return phi[n];
}
int oula2( int n ) {
    vis.set();
    phi[1] = 1;
    for ( int i = 2; i <= n; i++ ) {
        if ( vis[i] ) {
            prime[++cnt] = i;
            phi[i] = i - 1;
        }
        for ( int j = 1; j <= cnt && prime[j] * i <= n; j++ ) {
            vis.reset( i * prime[j] );
            if ( !( i % prime[j] ) ) {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            else {
                phi[i * prime[j]] = phi[i] * phi[prime[j]];
            }
        }
    }
    return phi[n];
}
int oula3( int n ) {
    int ans = n, i;
    for ( i = 2; i * i <= n; i++ ) {
        if ( !( n % i ) )
            ans = ans / i * ( i - 1 );
        while ( !( n % i ) )
            n /= i;
    }
    if ( n > 1 ) {
        ans = ans / n * ( n - 1 );
    }
    return ans;
}

以上是三种不同的求法。

变化

与$n$互质的所有数的和

$$sum=n \times \phi (n) \div 2$$

晚上

评论区有一些问题。

玄学

Last modification:July 9th, 2019 at 07:55 pm
如果您觉得我的文章有用,请赏一颗糖糖。