您的位置:首页 > 其它

素数 约数 欧拉函数 筛法

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐