欧拉函数介绍及简单模板

欧拉函数:对于一个正整数n,小于n且与n互质的正整数的个数,记做:φ(n),其中φ(1)被定义为1,但是并没有任何实质的意义。

特殊性质:当n为奇数时,φ(2n)=φ(n)。

当n为素数时:φ(n) = n - 1;

(1)φ(n) = n * (1 - 1/p1) * (1 - 1 / p2) * ... * (1 - 1 / pn)    (pi是n的质因子)

求小于n且与n互质的数有多少个

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

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>

using namespace std;

typedef long long ll;

const ll INF = 0x3f3f3f3f;

int main()
{
    ll n;
    while(~scanf("%lld", &n), n)
    {
        ll ans = n;
        for(ll i = 2 ; i * i <= n ; i++)
        {
            if(n % i == 0)
            {
                ans -= ans / i;
                while(n % i == 0)
                {
                    n /= i;
                }
            }
        }
        if(n > 1)
            ans -= ans / n;
        printf("%lld\n", ans);
    }
    return 0;
}

 

(2)当n = p^k时,φ(n)  = φ(p^k) = p^k - p^(k - 1)

证明:比p^k小的数总共有p^k - 1个,与p^k不互质的数有:

 p*1, p * 2, p * 3, ... , p^k - p(即p(p^(k - 1)- 1))共p^(k - 1)- 1个

所以与p^k互质的数有p^k - 1 - (p^(k - 1)- 1) = p^k - p^(k - 1)个

即φ(n)  = φ(p^k) = p^k - p^(k - 1)

(3)当n = p * q 时,φ(n) = φ(p * q) = φ(p) * φ(q), gcd(p, q) = 1;

 

原根:
 
如果a不被素数p整除,则a模p的阶是指使得a^e=1(mod m)(即a^e % m = 1)的最小指数e>=1;例如2、3、4、5、6模7的阶分别是3、6、3、6、2。
 
一个重要的性质:一个数a模m的阶e总能整除m-1。
 
 
设m是正整数,a是整数,若a模m的阶等于φ(m)(即a^φ(m) % m = 1),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数
 
奇素数p的原根个数 = φ(p - 1)
 
 
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        n = n - 1;
        int ans = n;
        for(int i = 2 ; i * i <= n ; i++)
        {
            if(n % i == 0)
            {
                ans -= ans / i;
                while(n % i == 0)
                    n /= i;
            }
        }
        if(n > 1)
            ans -= ans / n;
        printf("%d\n", ans);
    }
    return 0;
}

 

 
posted @ 2015-10-29 14:20  午夜阳光~  阅读(297)  评论(0编辑  收藏  举报