欧拉函数概念与应用拓展 - 数论

概念

欧拉函数(作用:欧拉函数是求小于n的正整数中与n互质的数的数目(φ(1)=1)。);
欧拉函数通式:这里写图片描述
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。
注意:每种质因数只一个。 比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4

应用实例

hdu - 找新朋友

Problem Description

新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。

Input

第一行是测试数据的组数CN(Case number,1

Output

对于每一个N,输出一行新朋友的人数,这样共有CN行输出。

Sample Input

2
25608
24027

Sample Output

7680
16016

代码/模版

#include
#include 
#include 
using namespace std;
int eular(int n)//欧拉函数
{
    int m=sqrt(n+0.5);
    int res=n;
    for(int i=2;i<=m;i++){
        if(n%i==0){
            res=res/i*(i-1);
            while(n%i==0){
                n/=i;
            }
        }
    }
    if(n>1) res=res/n*(n-1);
    return res;
}
int main()
{

    int N;
    scanf("%d",&N);
    while(N--){
        int n;
        scanf("%d",&n);
        printf("%d\n",eule(n));
    }
    return 0;
}

拓展:hdu - GCD Again

Problem Description

Given an integer N(1< N< 100000000), please count the number of the integers M (0< M< N) which satisfies GCD (N,M)>1.
A test case containing 0 terminates the input and this test case is not to be processed.

Sample Input

2
4
0

Sample Output

0
1

题解

本题题意是求gcd(m,n)>1的数量,而euler函数可以求1-n中gcd(m,n)=1的数量。So,输出的是n-euler(n)-1;

区间内与其互质数之和: Phi(x)∗x/2

对于在 [1,x] 中与 x 互素的数的和为: Phi(x)∗x/2 的简单证明:
对于 gcd(x,i)=gcd(x,x−i)
那么就是成对出现的,不会出现相同的结果, 即i=x−i
假设这个成立那么有 x=2∗i, gcd(x,i)=i,与已知矛盾,所以不成立,
那么显然 gcd(x,i)=1 的个数为 Phi(x) 个,然后gcd(x,i)=1 的与 gcd(x,x−i)=1 的合并就有:
与 x 互素的和就是 Phi(x)∗x/2。
参考自这里

你可能感兴趣的:(C/C++,数论)