欧拉函数(转)

相关题目:
 http://acm.hdu.edu.cn/showproblem.php?pid=2824 pku 2478(与前n个数互质的个数的求和)
 http://acm.hdu.edu.cn/showproblem.php?pid=3508 素因子的积
 http://acm.hdu.edu.cn/showproblem.php?pid=2710 题目很简单,就是输出N个数素数因子最大的那一个
 http://acm.hdu.edu.cn/showproblem.php?pid=3307 (欧拉 + 推导公式 + gcd)
 http://acm.hdu.edu.cn/showproblem.php?pid=1299 (求因子个数) 
 http://acm.pku.edu.cn/JudgeOnline/problem?id=2480 欧拉求所有因子的和
 http://acm.pku.edu.cn/JudgeOnline/problem?id=2407 很水的欧拉 
 http://acm.hdu.edu.cn/showproblem.php?pid=1787 典型 欧拉函数
http://acm.hdu.edu.cn/showproblem.php?pid=3501 欧拉函数求小于N且与N不互质的正整数之和

在数论中,欧拉定理(也称费马-欧拉定理)是一个关于同余的性质。欧拉定理表明,若n,a为正整数
,且n,a互素,(a,n) = 1,则 a^φ(n) ≡ 1 (mod n)
推论:对于互质的数a、n,满足a^(φ(n)+1) ≡ a (mod n)
费马定理:   a是不能被质数p整除的正整数,则有a^(p-1) ≡ 1 (mod p)
  证明这个定理非常简单,由于φ(p) = p-1,代入欧拉定理即可证明。
  同样有推论:对于不能被质数p整除的正整数a,有a^p ≡ a (mod p)
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
  欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
  特殊性质:当n为奇数时,φ(2n)=φ(n), 证明于上述类似。
欧拉性质:
phi(n) >= sqrt(n / 2) n > 0
n > 6  phi(n) >= sqrt(n)
n 为合数  phi(n) <= n - sqrt(n)
推论一:欧拉函数ψ(N)的值为偶数。
推论二:对于任意素数p有ψ(p)=p-1
推论三:设N为质数P的平方,即N=P×P,则ψ(N)=(P-1)×P。
推论四:设N为质数p的n次方(n≥2)则ψ(N)=N×(1-1/p)
推论五:设N为两个不同质数p,q之积,N=p ×q,则ψ(N)=(p-1)×(q-1)。
推论六:对一切正整数n,有φ(p^n)=[p^(n-1)]*(p-1)

欧拉函数的定义:E(k)=([1,n-1]中与n互质的整数个数). 因为任意正整数都可以唯一表示成如下形式:
                     k=p1^a1*p2^a2*……*pi^ai;(即分解质因数形式)
    可以推出:E(k)=(p1-1)(p2-1)……(pi-1)*(p1^(a1-1))(p2^(a2-1))……(pi^(ai-1))
               =k*(p1-1)(p2-1)……(pi-1)/(p1*p2*……pi);
               =k*(1-1/p1)*(1-1/p2)....(1-1/pk)
     ps:在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(a为N的质因素)
若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;
若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);
跟据上面的公式,可以得到关于欧拉函数的递推关系:
假设素数p能整除n,那么
如果p还能整除n / p, PHI(n) = PHI(n / p) * p;
如果p不能整除n / p, PHI(n) = PHI(n / p) * (p - 1);

得数学结论:一个整数的所有因子数等于其每个素因子的个数加一之后的乘积(1+p1)(1+p2)…(1+pn)
因子和: 若 k=p1^a1*p2^a2...*pi^ai   F(k) = (p1^0+...+p1^a1)*(p2^0+...+p2^a2)*...*(pi^0 + ... + pi^ai)  
,其中p1、p2、...、pn分别为该整数的所有n个素因子P1、P2、...Pn的相应个数。
思想:得到一个整数所有素因子。由素因子的组合构造其所有的因子。
一个整数的素因子还有一个特点,就是超过其平方根值的素因子最多只有一个

结合率	((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p
((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p
交换率	(a + b) mod p = (b+a) mod p 
(a × b) mod p = (b × a) mod p
分配率	((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p
定理(消去律):如果gcd(c,p) = 1 ,则 ac ≡ bc mod p 可以推出 a ≡ b mod p
(拉格朗日四平方和定理)
每个自然数均可表示成4个平方数之和。3个平方数之和不能表示形式如4k(8n+ 7)的数。 如果在
一个正整数的因数分解式中,没有一个数有形式如4k+3的质数次方,该正整数可以表示成两个平方数
之和。
char mark[10000] = {0}; 
int prime[1230];
int size = 0;
int phi[10000];
int main () {
    int i, j;
    /*筛法求素数*/
    for (i = 2; i < 10000; i++) {
        if (!mark[i]) prime[size++] = i;
        for (j = 0; j < size && prime[j] * i < 10000; j++) {
            mark[prime[j] * i] = 1;
            if (i % prime[j] == 0) break;
        }
    }
    /*求欧拉函数*/
    phi[1] = 1;
    for (i = 2; i < 10000; i++) {
        if (!mark[i]) {
            phi[i] = i - 1;
            continue;
        }
        for (j = 0; j < size && prime[j] * prime[j] <= i; j++) {
            if (i % prime[j] == 0) {
                if (i / prime[j] % prime[j] == 0)
                    phi[i] = prime[j] * phi[i / prime[j]];
                else
                    phi[i] = (prime[j] - 1) * phi[i / prime[j]];
                break;
            }
        }
    }
    return 0;
}
从别人那里学到的对求欧拉函数部分的优化,使每个数的欧拉函数只由它的最小素因子求出:
    phi[1] = 1;
    for (i = 1; i < 10000; i++) {
        for (j = 0; j < size && prime[j] * i <= 10000; j++) {
            if (i % prime[j] == 0) {
                phi[prime[j] * i] = prime[j] * phi[i];
                break;
            }
            else {
                phi[prime[j] * i] = phi[i] * (prime[j] - 1);
            }
        }
    }

在实际代码过程可以和搜索质数的"筛子法"相结合, 因为"筛子法"相当于优先找到了每个数的最小质
因子.
const int size = 1000001;
int factor[size];    //factor[n]记录了n的最小质因子
bool visited[size];   
int phy[size];       //phy[n]记录了与n互质且小于n的个数. 
void getPrime()
{
        memset(factor, -1, sizeof(factor));
        memset(visited, false, sizeof(visited));
        for (int i=2; i<size; i++)
        {
                if (visited[i])
                {
			//这部分是递归关系的实现
                        int k = i/factor[i];
                        if (k%factor[i] == 0)
                        {
                                phy[i] = phy[k]*factor[i];
                        }else{
                                phy[i] = phy[k]*(factor[i] - 1);
                        }
                        continue;
                }
                phy[i] = i -1; //i本身是质数, 与i互质的个数为i-1.
                for (int j=i+i; j<size; j+=i)
                {
                        visited[j] = true;
                        if (factor[j] == -1)
                        {
                                factor[j] = i; //用i筛的过程, 就找到了每个以i为最小质因子的数.
                        }
                }
        }
结合率	((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p
((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p
交换率	(a + b) mod p = (b+a) mod p 
(a × b) mod p = (b × a) mod p
分配率	((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p
定理(消去律):如果gcd(c,p) = 1 ,则 ac ≡ bc mod p 可以推出 a ≡ b mod p
(拉格朗日四平方和定理)
  每个自然数均可表示成4个平方数之和。3个平方数之和不能表示形式如4k(8n+ 7)的数。 如果在
一个正整数的因数分解式中,没有一个数有形式如4k+3的质数次方,该正整数可以表示成两个平方数
之和。

http://hi.baidu.com/xiehuixb/blog/item/a14cfd3967df1ffbb211c7dc.html
http://menjitianya2007.blog.163.com/blog/#m=0&t=1&c=fks_095074086095082075083085074064093083080066082080095
http://hi.baidu.com/xiehuixb/blog


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值