一、欧拉函数

欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。

通式:

 

其中p1, p2……pn为x的所有质因数,x是不为0的整数。
  • 比如x=12,拆成质因数为12=2*2*3,
  • 12以内有1/2的数是2的倍数,那么有1-1/2的数不是2的倍数(1,3,5,7,9,11),
  • 这6个数里又有1/3的数是3的倍数,
  • 只剩下(1 - 1/2 - 1/3)的数既不是2的倍数,也不是3的倍数(1,5,7,11)。
  • 这样剩下的12*(1 - 1/2 - 1/3)=4,即4个数与12互质,所以φ(12)=4。

证明:对于正整数x,

  • 如果x=1,则 φ(1) = 1。

    • 1与任何数(包括自身)都构成互质关系。
  • 如果x是质数,则 φ(x)=x-1 。

    • 质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
  • 如果n只有一个质因数p,即x = p^k(p为质数,k>=1),则φ(pk)=pk(1-1/p)=pk-pk-1 。

    • 从1~x中,p的倍数共有x/p个,共占了1/p,则减去这些数后,还剩下x*(1-1/p)个。
    • 可以看出,上一种情况是 k=1 时的特例。
  • 如果n可以分解成两个互质的整数之积,即n = p1 * p2,则φ(x) = φ(p* p2) = φ(p1) * φ(p2)。

    • φ(a)=m,φ(b)=n,φ(a*b) = a(1-p1)(1-p2)...*b(1-q1)(1-q2)... = m*n
    • 欧拉函数是积性函数(若当m与n互质时,f(m∗n)=f(m)∗f(n) f(m*n)=f(m)*f(n)f(m∗n)=f(m)∗f(n),那么f是积性函数。)
  • 任意一个大于1的正整数,都可以写成一系列质数的积。
  • 可以得到,φ(x) = φ(p1)*φ(p2)*...*φ(pn) = x(1-1/p1)*(1-1/p2)*...*(1-1/pn).

一些(目前不需要的)性质:

  • 当n>2时,φ(n)是偶数。
  • 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。
  • n的因数(包括1和它自己)的欧拉函数之和等于n。
  • 若n为奇数时,φ(2n)=φ(n)。
  • 对于任何两个互质的正整数a,n(n>2)有:aφ(n)≡1(mod n)此公式即 欧拉定理。
  • 当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: an-1≡1(mod n)此公式即 费马小定理。


求欧拉函数:

1.埃拉托斯特尼筛

求1~n所有数的欧拉函数:每次找到一个质数,就把它的倍数更新掉。复杂度大概是O(nlognlogn)。

void euler(int n) {for (int i=1; i<=n; i++) phi[i]=i;for (int i=2; i<=n; i++)if (phi[i]==i)//i是质数for(int j=i; j<=n; j+=i)phi[j]=phi[j]/i*(i-1);
}

2.欧拉筛

求n的欧拉函数:每次找到一个最小的因数(一定为质因数),求出x*(1 - 1/p)。复杂度为O(n)。

int euler(int n) {int res=n,a=n;for(int i=2; i*i<=a; i++) {if(a%i==0) {res=res/i*(i-1);while(a%i==0) a/=i;}}if(a>1) res=res/a*(a-1); //有质数剩余 return res;
}

对于x = p1k1 * p2k2...,只需要求一次(1-p1)(1-p2)...就可以了,

为了保证每个质因数只被使用一次,通过以上的while循环把x中的p1除尽。

二、素数筛法

这里直接上欧拉算法了。关于埃氏和其他算法

int Prime(int N) {for(i=2; i<=N; i++) {if(!check[i])prime[cnt++]=i;for(j=0; j<cnt && prime[j]*i<=N; j++) { check[prime[j]*i]=1;if(i%prime[j]==0)break;}}
}

每次遇到未标记的素数就记录,然后用当前的素数或合数与记录下的素数表依次相乘。

蓝色的这一句,保证了每个合数只被筛去一次(如下表),也是欧拉筛法优化的核心思想。

  例如12 = 4*3 = 6*2,

  将它拆分成 (2*2)*3 和 (2*3)*2,

  因为素数之积显然不是素数,所以在继续筛的过程中一定会遇到2*3,

  说明4=2*2所筛掉的合数2*2*prime[i](除了prime[0]=2本身),一定会在以后重复算一次。

  那么先保留2的一列,3只要遇到2的倍数一定可以在2的一列出现,5只要遇到2、3的倍数一定可以在前两列出现...

更新于19/2/11

在浙江集训刚好学了这个qwq其实这个线性筛素数是这样的,

因为当前枚举的合数是i*pj,且pj|i(即i%pj=0),那么下一个枚举的是i*pj+1,

因为i已经是pj的倍数了,那么i*任何正整数一定也是pj的倍数,

说明i*pj+1在后面一定会被更小的素数(pj)筛去。

转载于:https://www.cnblogs.com/mogeko/p/10134838.html

Euler:欧拉函数&素数筛相关推荐

  1. 中高级数论 [欧拉函数线性筛,二次剩余]

    欧拉函数线性筛 对于素数ppp, φ(p∗i)={p−1i=1p∗φ(i)p∣i(p−1)∗φ(i)p∤i\varphi (p*i)= \begin{cases} p-1& i=1\\ p*\ ...

  2. 线性筛与欧拉函数、莫比乌斯函数

    网上关于素数筛的资料很多,这里只是给出弱鸟整理的几个线性筛和应用. 最朴素的素数筛--埃拉托斯特尼筛法(Sieve of Eratosthenes) 复杂度 Olognlogn int primes[ ...

  3. 欧拉函数/欧拉函数打表 lightoj1370(java/c++ )

    例题 欧拉函数/素数判定 题目链接 题目 Bamboo Pole-vault是Xzhiland的一项大受欢迎的运动. Phi-shoe大师是他成功的非常受欢迎的教练.他需要为他的学生提供一些竹子,所以 ...

  4. UVa-10820 Send a Table 欧拉函数

    题意 交表 由于f(k∗x,k∗y)f ( k*x , k* y ) 可以由f(x,y)f ( x , y )递推出来 让我们求 在x,y都不大于n的情况下 计算最少需要计算多少不同的项 n<= ...

  5. 筛表合集(素数筛 欧拉函数筛 莫比乌斯函数筛)

    [目录] 一.素数筛 1.素数判断 2.素数普通筛 3.素数线性筛 4.素数区间筛 二.欧拉函数筛 三.莫比乌斯函数筛 [素数筛] 1.直接判定质数 bool judgePrime( int num ...

  6. 【数学知识】三种方法求 [1,n] 中所有数欧拉函数(线性筛欧拉函数优化至 O(n) )

    整理的算法模板合集: ACM模板 ①直接求小于或等于n,且与n互质的数个数(求[1,n]中所有数的欧拉函数时间复杂度:O(nn)O(n\sqrt{n})O(nn​)) ②求[1,n]之间每个数的质因数 ...

  7. 欧拉函数+狄利克雷卷积+莫比乌斯函数+莫比乌斯反演+整除分块+杜教筛

    Powered by:NEFU AB-IN 文章目录 欧拉函数 狄利克雷卷积 莫比乌斯函数 莫比乌斯反演 P3455 [POI2007]ZAP-Queries 整除分块 P2522 [HAOI2011 ...

  8. 一欧拉函数(Euler‘s totient function)

    算法总结 一欧拉函数(Euler's totient function) 欧拉函数的定义: 在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,记作φ(n). φ ...

  9. XTU OJ 1355 Euler‘s Totient Function(欧拉函数)

    XTU OJ 1355 Euler's Totient Function(欧拉函数) 题目描述 对于整数n,定义ϕ(n)ϕ(n)ϕ(n)为小于或等于n,并与n互质的整数的个数,比如6,比它小的和它互质 ...

最新文章

  1. android o wifi 感知,Android上的Wifi感知与Wifi P2P之间有何区别?
  2. Redis进阶-5.x 单节点 及Redis Cluster 3主3从集群部署
  3. VTK:可视化之OrientedGlyphs
  4. ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录
  5. 访问linux服务主机,如何把Linux配置为日志服务主机。
  6. bat循环执行带参数_wxappUnpacker的bingo.bat脚本逐行解读
  7. 2018.09.19python学习第七天part1
  8. crt安装mysql安装包_Linux安装MySQL步骤
  9. 对话框:创建对话框模板和修改对话框属性
  10. Raid0、Raid0+1、Raid1、Raid5四者的区别
  11. [Giveaway] 来自AnyBizSoft、4Media、EASEUS的限时免费软件
  12. vr视频制作软件哪个好?Nibiru creator是企业的标配
  13. 阿里70后程序员的 26 个职场感悟
  14. java linux 消息队列_我的第一个Linux程序----利用消息队列来实现IPC
  15. Windows 下编译 OpenSSL
  16. 信源编码技术作业(1)——使用Audacity软件绘制清浊音频谱图并进行分析
  17. C# CheckedListBox控件的用法 .
  18. 什么是幂等性、幂等性解决方案
  19. Photoshop 速写效果
  20. python 出现报错 pm2 �����ڲ����ⲿ���Ҳ���ǿ����еij��� ���������ļ���

热门文章

  1. cf13C Sequence(DP)
  2. 关于VerifyError
  3. 使用javascript打开模态对话框
  4. 从今开始,好好学习一下算法!
  5. LINQ to SQL学习的几个问题
  6. 史上最详细的js日期正则表达式分享
  7. 前端安全之token
  8. Android Monkey压力测试
  9. centos安装jenkins
  10. 递归函数(九):最小不动点定理