前两天总结了素数筛法,其中就有Eular筛法。现在他又来了→→

φ(n),一般被称为欧拉函数。其定义为:小于n的正整数中与n互质的数的个数。

毕竟是伟大的数学家,所以以他名字命名的东西很多辣。

对于φ(n),我们有这样【三个性质】

(1) 【若n为素数】,则φ(n) = n - 1

显然,由于n为素数,1~n-1与n都只有公因子1,因此φ(n) = n - 1。

比如φ(11)=10={1,2,3,4,5,6,7,8,9,10};

(2) 【若n = p^k】,p为素数(即n为单个素数的整数幂),则φ(n) = (p-1)*p^(k-1)

因为n是p的整数幂,因此所有p的倍数和n都不互质。小于n的p的倍数一共有p^(k-1)-1个,因此和n互质的个数为:

p^k-1 - (p^(k-1)-1) = p^k - p^(k-1) = (p-1)*p^(k-1)

比如3^4=3*3*3*3=3*27,则与他不互质的有3*1,3*2....3*26,共p^(k-1)-1=26个,则φ(n)=(p^k-1)-(p^(k-1)-1)=(p-1)*p^(k-1).

     φ(81)={1,2,4,5,7,8....}

(3) 【若p和q互质】,则φ(p*q) = φ(p) * φ(q)

对于所有小于pq的整数u,可以表示为u=aq+r。(a=0,1,2,...,p-1,r=0,1,...,q-1)。

对于u = aq + r, 设R = u mod p,0≤R<q。对于一个固定的r,设a1, a2满足0 <= a1, a2 < p且a1≠a2,有:

     u1 = a1*q+r, u2 = a2*q+r
u1-u2=(a1-a2)*q

因为p与q互质,且|a1-a2|<p,则|u1-u2|一定不是p的倍数。

所以对于每一个固定的r,其对应的p个u = a*q+r(a=0,1,2,...,p-1)对mod p来说余数都不相同,即u mod p的结果恰好取遍0,1,...,p-1中的每一个数。

下面我证明一个引理:u mod p与p互质 <=> u与p互质,其证明如下:

    假设a,b互质,c = a mod b。
假设c与b不互质,则存在d≥1,使得c=nd, b=md。
由于c = a mod b,因此a = kb + c,
则a = kmd + nd = (kn+m)d
因此d是a,b的公因数,与a,b互质矛盾。
假设不成立,所以c与b互质。

因此对于任意一个确定的r,与其对应的p个u中恰好有φ(p)个与p互质。

同理,由u = aq + r知r与q互质 <=> u与q互质。因此在0..q-1中恰好有φ(q)个r使得u与q互质。

综上,当r与q互质的情况下,固定r可以得到φ(p)个与p和q都互质的数。

满足条件的r一共用φ(q)个,所以一共能找到有φ(p) * φ(q)个与p和q都互质的数。

由此得证:φ(p*q) = φ(p) * φ(q)

这一段证明不是太好理解,一定要自己推导一遍哦。

在上面这些性质的基础上我们能到推导出【两条定理】

若p为质数,n为任意整数:

(1)【 若p为n的约数】,则φ(n*p) = φ(n) * p

若p为n的约数,且p为质数。则我们可以将n表示为p^k*m。m表示其他和p不同的质数的乘积。

显然有p^k与m互质,则:

       φ(n) = φ(p^k)*φ(m) = (p-1)*p^(k-1)*φ(m)
φ(n*p) = φ(p^(k+1))*φ(m) = (p-1)*p^k*φ(m) = (p-1)*p^(k-1)*φ(m) * p = φ(n) * p

(2) 【若p为不为n的约数】,则φ(n*p) = φ(n) * (p-1)

由p不为n的约数,因此p与n互质,所以φ(n*p) = φ(n) * φ(p) = φ(n)*(p-1)

根据这两条定理,当我们得到一个n时,可以枚举质数p来递推的求解φ(n*p)。这一步是不是觉得很眼熟呢?

这是我们使用【欧拉筛法】时一样的算法么?

没错!因此我们只需要在欧拉筛代码的基础上做一个小改动,就可以得到递推求解φ(n)的算法:

int isp[maxn+],phi[maxn+],q[maxn],cnt;
void urlar()
{
for(int i=;i<=maxn;i++) isp[i]=true;
for(int i=;i<=maxn;i++){
if(isp[i]){
phi[i]=i-;
q[++cnt]=i;
}
for(int j=;j<=cnt&&q[j]*i<=maxn;j++){
isp[q[j]*i]=false;
if(i%q[j]==){
phi[i*q[j]]=phi[i]*q[j];
break;
}
else phi[i*q[j]]=phi[i]*(q[j]-);
}
}
}

因为欧拉筛的时间复杂度是O(n)的,因此求出一个大区间内所有数的欧拉函数也只用了O(n)的时间。

-------------------------------------------------------------分界线---------------------------------------------------------------

如果我们要求一个大数是不是素数,欧拉筛法是不行的,得用Miller-Rabin算法。

如果我们要求一个大数的互质数数量,普通欧拉函数也是不行的,得用Miller-Rabin Pollard-rho启发式分解。

有空再补

欧拉函数 and 大数欧拉 (初步)的更多相关文章

  1. 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】

    和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...

  2. UVa 10820 (打表、欧拉函数) Send a Table

    题意: 题目背景略去,将这道题很容易转化为,给出n求,n以内的有序数对(x, y)互素的对数. 分析: 问题还可以继续转化. 根据对称性,我们可以假设x<y,当x=y时,满足条件的只有(1, 1 ...

  3. 数学之欧拉函数 &几道poj欧拉题

    欧拉函数总结+证明 欧拉函数总结2 POJ 1284 原根 #include<iostream> #include<cstdio> #include<cstring> ...

  4. A - Bi-shoe and Phi-shoe (欧拉函数打表)

    Description Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a ver ...

  5. NOIP模拟:切蛋糕(数学欧拉函数)

    题目描述  BG 有一块细长的蛋糕,长度为 n. 有一些人要来 BG 家里吃蛋糕, BG 把蛋糕切成了若干块(整数长度),然后分给这些人. 为了公平,每个人得到的蛋糕长度和必须相等,且必须是连续的一段 ...

  6. 数学基础IV 欧拉函数 Miller Rabin Pollard's rho 欧拉定理 行列式

    找了一些曾经没提到的算法.这应该是数学基础系最后一篇. 曾经的文章: 数学基础I 莫比乌斯反演I 莫比乌斯反演II 数学基础II 生成函数 数学基础III 博弈论 容斥原理(hidden) 线性基(h ...

  7. poj2480(利用欧拉函数的积性求解)

    题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2, ...

  8. SGU---102 欧拉函数

    题目链接: https://cn.vjudge.net/problem/SGU-102#author=0 题目大意: 求解小于等于N的且与N互质的数字有多少个 解题思路: 直接求欧拉函数即可 关于欧拉 ...

  9. bzoj2818 Gcd(欧拉函数)

    Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...

随机推荐

  1. LeetCode:搜索旋转排序数组【33】

    LeetCode:搜索旋转排序数组[33] 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]  ...

  2. Django 项目补充知识(JSONP,前端瀑布流布局,组合搜索,多级评论)

    一.JSONP 1浏览器同源策略 通过Ajax,如果在当前域名去访问其他域名时,浏览器会出现同源策略,从而阻止请求的返回 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一 ...

  3. VMware安装Centos7过程

    VMware安装Centos7过程 1.打开VMwear选择新建虚拟机 2.典型安装与自定义安装 典型安装:VMwear会将主流的配置应用在虚拟机的操作系统上,对于新手来很友好. 自定义安装:自定义安 ...

  4. python中类(class)和实例(instance)

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  5. node拦截器设置

    node的拦截器主要目的是用户登录的时候为用户存了一个session,用户登录后的其他操作都要经过拦截器,对比session的值,并把session的过期时间延长. 拦截器主要是在路由文件routes ...

  6. Android系统--Binder系统具体框架分析(一)补充

    Android系统--Binder系统具体框架分析(一)补充 补充:对Binder驱动分析一的代码补充,添加saygoobye和saygoodbye_to服务 test_server.h #ifnde ...

  7. Java基础(7)-集合类3

    list集合的特点 1)有序(存储和取出的元素一直) 2)可重复 List子类的特点 ArrayList 有序,可重复 底层数据结构是数组 查询快,增删慢 线程不安全,效率高 Vector 有序,可重 ...

  8. Mssql 比较好的写法

    DECLARE @date DATETIME= '2016-11-01'; DECLARE @date2 DATETIME= DATEADD(day, 1, @date); Declare @1 Ta ...

  9. poj 1011 :Sticks (dfs+剪枝)

    题意:给出n根小棒的长度stick[i],已知这n根小棒原本由若干根长度相同的长木棒(原棒)分解而来.求出原棒的最小可能长度. 思路:dfs+剪枝.蛮经典的题目,重点在于dfs剪枝的设计.先说先具体的 ...

  10. Python快速学习-高级特性

    1.切片 取一个list或tuple的部分元素是非常常见的操作 L = ['hello','the','world','and','my','love'] 取前三个元素 L[0:3],L[:3] 取倒 ...