欧拉函数小结

欧拉函数:

φ(n)表示1~n中和n互素的数目

要处理出欧拉函数。先证明φ(p)=p-1.(p为素数)

根据互素的概念。两个数的公约数只有1,那么这两个数互素。再根据素数的定义。公约数除了本身以外只有1的数为素数。所以得证φ(p) = p-1.

再证明欧拉函数为不完全积性函数。

φ(m1*m2) = φ(m1)*φ(m2) 其中 m1和m2互素。即gcd(m1,m2)=1.

证明过程在我另外一篇博文中。我觉得那种证明比较好。当然还有别的比较好的证明方法。

http://www.cnblogs.com/Milkor/p/4464515.html

思考一个这样的经典问题。知道一个函数是积性的(其实只要是在两个互素数中的积性)。

那么根据算术基本定理(任何一个数可以拆分成素数的乘积形式)

φ(m) = φ(p1^k1) * φ(p2^k2) * φ(p3^k3) *...

那么我们只要求出φ(p^k)就可以求出任意数的对应的欧拉函数的对应值。

1~p^k 一共有p^k个数。

其中是p的倍数为 <p,2p,3p...p^k> (最后那个数可以列不等式找出来)。个数为p^k/p = p^(k-1).

所以和p^k互素的数的个数为 p^k - p^(k-1).

那么根据上述。可得

以上便是欧拉公式的来源。

顺便根据我们上述的推论,我们再推导一下线性筛法欧拉函数中。

当i%j==0的时候。也就是j为i的因子的时候。

φ(i*j)=φ(i)*j.这个结论吧。

证明过程:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 100
 4 int prime[N+5];
 5 int num;
 6 bool mark[N+5];
 7 int euler[N+5];
 8 void Euler()
 9 {
10     int i,j;
11     num = 0;
12     memset(mark,0,sizeof(mark));
13     euler[1] = 0;
14     for(i=2;i<=N;i++)
15     {
16         if(!mark[i])
17         {
18             prime[num++] = i;
19             euler[i]=i-1;
20         }
21         for(j=0;j<num;j++)
22         {
23             if(i*prime[j]>N){break;}
24             mark[i*prime[j]] = 1;
25             if(i%prime[j]==0)
26             {
27                 euler[i*prime[j]] = euler[i]*prime[j];
28             }
29             else
30             {
31                 euler[i*prime[j]] = euler[i]*euler[prime[j]];
32             }
33
34         }
35     }
36 }
37 int main()
38 {
39     Euler();
40     int i;
41     for(i=0;i<num;i++)
42     {
43         printf("%d ",prime[i]);
44     }
45     printf("\n");
46     for(i=1;i<=N;i++)
47     {
48         printf("%d=%d ",i,euler[i]);
49     }
50 }

欧拉线性筛

时间: 2024-08-10 23:17:46

欧拉函数小结的相关文章

欧拉函数

void Euler_Sieve_Method(int * euler, int n) { euler[1] = 1; for (int i = 2; i < n; i++) { euler[i] = i; } for (int i = 2; i < n; i++) { if (euler[i] == i) { for (int j = i; j < n; j += i) { euler[j] = euler[j] / i * (i - 1); } } } } void Euler_Si

hdu1695(莫比乌斯)或欧拉函数+容斥

题意:求1-b和1-d之内各选一个数组成数对,问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个可以简化成1-b/k 和1-d/k 的互质有序数对的个数.假设b=b/k,d=d/k,b<=d.欧拉函数可以算出1-b与1-b之内的互质对数,然后在b+1到d的数i,求每个i在1-b之间有多少互质的数.解法是容斥,getans函数参数的意义:1-tool中含有rem位置之后的i的质因子的数的个数. 在 for(int j=rem;j<=factor[i

欧拉函数常用性质

欧拉函数定义:设n 为正整数,则1,2......,n中与n互质的整数个数记作f(n). 1.1 若n为素数,f(n)=n-1; 1.2 整数n=p*q,p,q为不同素数,则f(n)=f(p)*f(q)=(p-1)*(q-1) 1.3 n=p^a*q^b,f(n)=f(p^a)*f(q^b)=n*(1-1/p)*(1-1/q) 1.4 分解质因子相乘,f(n)=n*(1-1/p1)*(1-1/p2)*.......*(1-1/pk). f(100)=f(2^2*5^2)=100*1/2*4/5=

POJ2478(SummerTrainingDay04-E 欧拉函数)

Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16927   Accepted: 6764 Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b)

POJ 2478 欧拉函数(欧拉筛法) HDU 1576 逆元求法

相关逆元求法,我之前有写过,还有欧拉函数的求法,欧拉函数与逆元的关系  点击 POJ 2478 又是一个打表的题目,一眼看出结果就是前n个欧拉函数值的和. 这里直接计算欧拉函数值求和会超时,看见多组数据. 然后就是计算欧拉函数,打表就好了. #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long LL; const int N =

算法复习——欧拉函数(poj3090)

题目: Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass through any other lattice point. For exa

欧拉函数之和(51nod 1239)

对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等.例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质. S(n) = Phi(1) + Phi(2) + ...... Phi(n),给出n,求S(n),例如:n = 5,S(n) = 1 + 1 + 2 + 2 + 4 = 10,定义Phi(1) = 1.由于结果很大,输出Mod 1000000007的结

FZU 1759 欧拉函数 降幂公式

Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a singl

数论&#183;欧拉函数

欧拉函数$phi(n)$表示不超过$n$的正整数中与$n$互质的个数,并且有: $\varphi(n)= n\sum\limits_{p|n}(1-{\frac 1{p}})$ 显然有若$n$素数: $\varphi(n)=n-1$ 并且考虑$mp$,若$p$为素数,则对任意整数$k$: $(mp, k)\Leftrightarrow (m, k)$ 于是在每个模$p$的剩余系中有$\varphi(m)$个数与$mp$互质,因此: $\varphi(mp)=\varphi(m)\varphi(p