素数 约数 欧拉函数 筛法
2011-12-17 09:57
260 查看
1.1.4素数and筛法
素数就是只能被1和自身整除的数,素数是有无穷多个的,因为设x1,x2,x3..xn为已知的前面所有素数,则x1*x2...*xn+1显然不能被前面任何数整除,于是它也是素数,如此构造下去即可。对于p是质数,则2^p-1也是质数,我们称之为梅森素数。素数有很多很奇特的应用:素数近来被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入素数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找素数的过程(分解质因数)过久,使即使取得信息也会无意义。在汽车变速箱齿轮的设计上,相邻的两个大小齿轮齿数最好设计成素数,以增加两齿轮内两个相同的齿相遇啮合次数的最小公倍数,可增强耐用度减少故障。在害虫的生物生长周期与杀虫剂使用之间的关系上,杀虫剂的素数次数的使用也得到了证明。实验表明,素数次数地使用杀虫剂是最合理的:都是使用在害虫繁殖的高潮期,而且害虫很难产生抗药性。以素数形式无规律变化的导弹和鱼雷可以使敌人不易拦截。(和数字打交道的随机选择时我喜欢选素数--||)。下面介绍素数筛法c数组保留当前是否被最小素因子筛去,A集合存放素数
Begin i=2 to n
If(当前c[i]未被过滤)将i加入素数集合A
Begin j=0 to A.size()
将c[p[j]*i]过滤 (1)
If p[j]整除i 跳出(2)
End
End
该算法复杂度为O(n) 为何?关键在第(2)步,算法的核心思想是任何一个数都存在最小质因子,每个数只会被自己的最小质因子筛去,所以总得复杂度为O(n),保证这一条件的是i%p[j]==0 由于我们从小到大枚举素数去过滤,故 p[j]是i的最小质因子记为miy[i]=p[j](miy[i]记录i的最小质因子),设k=i/p[j],w=i*p[j]=p[j]*p[j]*k,将来所有的p[jj]*i(jj>j)都会被某个p[jj]*k剔除,故没i什么事了,可以不必执行下去了(笔者建议这里画个实例有助理解),所以在整个过程中我们顺带把每个数的最小质因子也计算出来了,在这个过程中同样可以把欧拉函数给计算出来只需要对(1)和(2)分别添加操作即可
1.1.5约数
约数,对于一个数x,若存在y使得y|x,则y是x的一个约数。约数个数num及约数和sum均有相应的公式,比如设f(x)表示x的约数个数,h(x)表示的是约数和,对于任何一个x我们总能表示成x=a[1]^b[1]*a[2]^b[2].....a*b
其中a[1],a[2]...a
为x的质因子,那么约数个数为num=(b[1]+1)*(b[2]+1)*....*(b
+1),为什么呢?我们可以用组合数学的知识来解释,对于任何一个约数,其实都可以描述成从这些质因子中取若干个,幂次也是任意的不超过b[i]即可,那么这种约数的构造个数结果为,对于单个质因子a[i],有b[i]种选法,然后还有一种是不选,于是对于任何种约数而言,在该质因子的表达上总共有b[i]+1表示,那么由于质因子互不相同,选择他们是相互是独立的“事件”,于是就取乘积,得证。对于约数和也可以采用类似的方法sum=(1+a[1]^1+...a[1]^b[1])*(1+a[2]^1+...a[2]^b[2])...(1+...a
^b
),对于单个质因子,约数的和也可以理解成以质因子为维度来贡献,对于单个质因子,没贡献的话就当做是1(为什么呢,1这个约数要算入和内,保持乘法,相当于单位元,做乘法不影响其他量的贡献,离散数学),那么依次的贡献是a[i]^1....a[i]^b[i],以加法的形式组合成一个约数的贡献,那么可以以质因子为分离维度抽取,由于贡献的相互独立性,所以按“事件”做乘法,对应着相应的加法组合的累加而已,得证。另外要说明一点这个h(x)是积性函数即x=a*b则h(x)=h(a)*h(b),其本质已经蕴藏在刚才的证明中了,将加法中公共部分抽取出来,等价成为了乘法,易知a和b明显互素,那么关于约数和的贡献是完全相互独立的。我们按质因子维度逐个来看,对于h(x)的某个质因子a[i],(1+a[i]^1+...a[i]^b[i])
等价于(a[i]^(b[i]+1)-1)/(a[i]-1)由于约数和膨胀起来很快所有通常情况下我们还会有一个模数mod,这里有两个思路,第一个直接一个二分幂,然后根据除数和mod,用扩展欧几里得来求逆元,当然这个逆元也不是一定存在的。还有一个办法就是对于 1+p+p^2+...+p^(2n-1) 则我们可以规约成(1+p+...p^(n-1))(1+p^n),把问题规模折半等价成一个子问题,对于1+p+p^2+....+p^(2n) 规约成(1+p+...p^(n-1))*(1+p^(n+1))+p^n,可以认为是二分里面又套了一个二分。
1.1.6欧拉函数
欧拉函数的定义:E(k)=([1,n-1]中与n互质的整数个数)。有如下几个性质:(1) phi(n)= n(1-1/p1)(1-1/p2)... (1-1/pk) n=p1^a1*p2^a2…pk^ak p1,p2…pk都是素数
可以利用类似约数的组合事件来证明。
(2) phi(ab)=phi(a)*phi(b) (a,b)=1;
证明:利用中国剩余定理建立一一对应关系(a,b)<->x
(a,m)=1 (0<a<m) (b,n)=1 (0<b<n) 存在x<m*n, (x,n*m)=1
a) 由中国剩余定理得若(n,m)=1,关于未知量x的方程组x%m=a,x%n=b 当0<=x<n*m时存在唯一解,下面证明这个推论,如果两个这样的方程组n,m一样,但是a,b不同,则x一定不同。
b) 必要性证明:(a,m)=1,(b,n)=1是(x,n*m)=1必要条件,假设(a,m)=k>1 a=a`*k,m=m`*k得x=k`*m+a=k`*k*m`+k*a`=k*(k`*m`+a`) 故(x,m)>1 同理推论对于(b,n)>1,(x,n)>1.
c) 充分性证明:由x%m=a得x=k*m+a,由欧几里得算法我们得(x,m)=(m,a)同理得(x,n)=(n,b) ,于是易知(x,n*m)=1对于(a,m)=1和(b,n)=1
d) 有充分性和必要性得证。
(3) 欧拉定理:对于互质的正整数 a 和 n ,有 a^phi(n) ≡1 mod n 。
证明:定义Z={x[1],x[2]…x[phi(n)]},S={a*x[1]%n,….a*x[phi
]%n},则Z=S
a) 由于(a,n)=1,(x[i],n)=1(1<=i<=phi
) 故(a*x[i],n)=1故a*x[i]%n属于Z
b) (a*x[1])*(a*x[2])….(a*x[phi
])%n=a^phi[i]*(x[1]*x[2]…x[phi
])%n =(x[1]*x[2]…x[phi
])%n,于是得a^phi
%n=1
(4) 费尔马定理:若(a,p)互质且p是素数则a^(p-1)%p=1
(5) 若(n%a==0&&(n/a)%a==0)则phi(n)=phi(n/a)*a;
(6) 若(n%a==0&&(n/a)%a!=0)则phi(n)=phi(n/a)*(a-1);
欧拉筛法如下:
Begin i=2 to n
If(i是素数) phi[i]=i-1
Begin j=0 to A.size()
将c[p[j]*i]过滤 (1)
If p[j]整除i
phi[t]=phi[i]*p[j];跳出(2)
Else
phi[t]=phi[i]*(p[j]-1);
End
End
相关文章推荐
- 欧拉函数 + 约数 + 素数表 + 欧拉函数表
- 素数筛,单点的欧拉函数,筛法求欧拉函数
- HDU 3441 Rotation(polay计数+欧拉函数+素数约数)
- 【数论】线性筛素数,线性筛欧拉函数,求前N个数的约数个数
- 【数论内容】线性筛素数,线性筛欧拉函数,求前N个数的约数个数
- 线性时间 筛素数,求前n个数的欧拉函数值,求前n个数的约数个数
- 数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)
- poj 2478 Farey Sequence(欧拉函数是基于寻求筛法素数)
- 利用积性函数的优化(线性时间:筛素数、求1~n的欧拉函数、约数个数)
- 线性时间 筛素数,求前n个数的欧拉函数值,求前n个数的约数个数
- 利用积性函数的优化(线性时间:筛素数、求1~n的欧拉函数、约数个数)
- 【数论内容】线性筛素数,线性筛欧拉函数,求前N个数的约数个数
- hdu 1695 综合数论 欧拉函数 分解质因子 容斥原理 打印素数表 帅呆了的一个题目 详解
- 【转】用筛法求之N内的素数。(N < 1000000)
- “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 G Prime [ 容斥原理 + 数论 + 求约数 + 素数筛 ]
- 1029: 用筛法求之N内的素数。(附常见的四种解决方案)
- UVA10200-Prime Time/HDU2161-Primes,例题讲解,费马小定理和欧拉函数判素数。
- poj 3361 Gaussian Prime Factors 高斯素数约数
- poj 2689 Prime Distance (素数二次筛法)
- 【数论】【Polya定理】【枚举约数】【欧拉函数】【Java】poj2154 Color