关闭

线性筛法相关

标签: 线性筛法欧拉函数约数个数
373人阅读 评论(0) 收藏 举报
分类:

基本证明可以看这里,懒得多写。
一个藓的证明
最关键部分
(iU)=P1P2P3...Pm1PmU(U>P1)
=UP2P3...Pm1PmP1
=i'P1(i'>i) 且i’与P1互质.

其实还可以筛其他东西
他们的本质都是要求的ix的值与最小质因子x有关系.
下面所有的分析与证明都要与线性筛法代码结合,不然读不懂.

筛出约数个数

dh写的
首先吧,肯定要维护这个玩意Ansii有多少约数
然后再维护一个Ei表示i的最小质因子的指数 (因为线筛的本质就是每个数只会被他最小的质因子筛去)
*Ansi=(a1+1)(a2+1)...(at+1) 其中ai表示第i个质因数的指数。

还有一个质数表p.
那我们来分类讨论一下。
ipj=k,

i mod pj!=0时,

pj是k的最小质因子,且这个质因子指数为1,这个由线筛的基本证明可以得到。
就说明k相对于i多了一个质因子pj
Ansk=Ansi(Epj+1)
Ek=1
其中Epj=1,因为pj是质数。

i|pj时,

pj同样是k的最小质因子,但指数不为1,这个是废话。
就说明k相对于i又多了一个质因子pj,不难推出:
Ek+=1
Ansk=Ansk/Ek(Ek+1)

于是我们就完成了这个艰巨的任务: 筛出每个数有多少约数。

void get_prime()  
{  
    int i,j,k;  
    memset(flag,false,sizeof(flag));  
    k=0;  
    for(i=2;i<M;i++){  
        if(!flag[i]){                              
                prime[k++]=i;  
                e[i]=1;  
                Ans[i]=2;                       //素数的约数个数为2  
            }  
            for(j=0;j<k&&i*prime[j]<M;j++){  
                    flag[i*prime[j]]=true;              
                    if(i%prime[j]==0){  
                        Ans[i*prime[j]]=Ans[i]/(e[i]+1)*(e[i]+2);  
                        e[i*prime[j]]=e[i]+1;  
                        break;  
                    }  
                    else{  
                        Ans[i*prime[j]]=Ans[i]*Ans[prime[j]];  
                        e[i]=1;  
                    }  
            }  
        }  
}  

筛出欧拉函数φ

读作φ(fai1),写作phi
φ(n)为小于等于n并与n互质的数的个数,他是积性函数 φ(a*b)=φ(a)*φ(b),gcd(a,b)=1

一个性质:
显然当x是素数时φ(x)=x1,
φ(xk)=xkxkx=xk1(x1)
因为显然只有有x这个因子的数(x的倍数)才不互质xk

现在我们来考虑一个数
由积性函数得,φ(x)=φ(p1a1)φ(p2a2)....φ(pkak)
pj为x的第j个质因子,aj为其对应的指数.
那我们之前得的那一个性质就有用了.
设x为i的第1个质因子(任意一个也可,这里方便表述),则

φ(xk)=xk1(x1)得,
φ(xk+1)=xk(x1).
φ(xk+1)=φ(xk)x

φ(xi)
=φ(xa1+1)φ(p2a2)....φ(pkak)
=xφ(xa1)φ(p2a2)....φ(pkak)
=xφ(i)

结论
x是素数,
φ(ix)=φ(i)xx|i
否则φ(ix)=φ(i)φ(x)=φ(i)(x1)由积性函数得

int prime[M/3],phi[M];  
bool flag[M];  
void get_prime()  
{  
    int i,j,k;  
    memset(flag,false,sizeof(flag));  
    k=0;  
    for(i=2;i<M;i++){  
        if(!flag[i]){                              
            prime[k++]=i;  
            phi[i]=i-1;  
        }  
        for(j=0;j<k&&i*prime[j]<M;j++){  
            flag[i*prime[j]]=true;              
            if(i%prime[j]==0){  
                phi[i*prime[j]]=phi[i]*prime[j];  
                    break;  
            }  
            else  
                phi[i*prime[j]]=phi[i]*(prime[j]-1);  
        }  
    }  
}
1
0
查看评论

求素数: 一般线性筛法 + 快速线性筛法

From: http://blog.csdn.net/dinosoft/article/details/5829550 素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功。 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 。。N^(0.5) ,看看能否整除N。 如...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2015-03-11 14:53
  • 1142

几种线性筛法

几种线性筛法 本文出自blog.csdn.net/svitter 写在之前 maker 关于线性筛素数 之前一直没有正视线性筛素数的问题。今天特意来写一个伪证明。 如果当前的i不是素数,那么必然被之前的某个素数筛掉了。i × prime[j]。 一个合数必然可以写成几个素数的乘积...
  • svitter
  • svitter
  • 2014-08-05 15:46
  • 1115

{算法}乱谈线性筛法

指在线性时间O(n)用筛选的方法求一些东西的算法。 伪目录 1. 求质数表 2. 筛出欧拉函数φ As we all know......
  • FarmerJohnOfZS
  • FarmerJohnOfZS
  • 2016-06-17 20:31
  • 2474

浅析线性筛法

今天晚上,在家里自学了一下线性筛法,还是比较容易理解的,并没有想象的那么难。 所谓线性就是O(n)的效率咯,线性筛法较快的一个本质就是他不会干重复的事,例如12——普通的筛法在素数2时候筛一次,素数3时筛一次,很明显这些是不必要的选择,我们可以舍去。 所以,在线性筛法里的优化就是...
  • John_pascal
  • John_pascal
  • 2016-08-05 22:00
  • 238

2016.08.11【初中部 NOIP提高组 】模拟赛C题解

​T1 这题感觉是这套题中最坑的一题了。比赛时用了01背包,时间超限得了50分。后来听说是转换多重背包,转完后还是50分(oAo) 正解: 因为虽然N,M范围很大,但仔细一看Ti和Vi都是≤10的,所以我们可以先用一个二位数组记录每种情况的个数,之后再把每一种背包都拆分成若干份,使得这若干份小背包通...
  • gmh77
  • gmh77
  • 2016-08-11 20:55
  • 165

线性筛法

贾志鹏写的线性筛
  • czysjr
  • czysjr
  • 2014-11-02 08:58
  • 220

快速线性筛法的原理和值得借鉴的方法【解析算法】

快速线性筛法的特点就是不会重复筛除一个数,
  • nuanxin_520
  • nuanxin_520
  • 2014-11-17 12:13
  • 1081

数论 - 线性筛法与积性函数

首先以求1000000以内的素数为例来探讨筛法 Eratosthenes筛法(埃拉托斯特尼筛法)时间复杂度:O(N*loglogN) 空间复杂度:O(N)代码:#include <map> #include <set> #include <list> #incl...
  • u014355480
  • u014355480
  • 2015-08-07 22:01
  • 1121

线性筛法筛素数

// // main.cpp // Richard // // Created by 邵金杰 on 16/8/1. // Copyright © 2016年 邵金杰. All rights reserved. // #include using namespace std;...
  • qq_33901573
  • qq_33901573
  • 2016-08-01 09:57
  • 152

欧拉函数 线性筛法

该算法在可在线性时间内筛素数的同时求出所有数的欧拉函数。     需要用到如下性质( p为质数 ): 1. phi(p)=p-1   因为质数p除了1以外的因数只有p,故1至p的整数只有p与p不互质 2. 如果i mod p = 0, 那么...
  • qq_33583069
  • qq_33583069
  • 2016-10-11 12:03
  • 274
    个人资料
    • 访问:39675次
    • 积分:1921
    • 等级:
    • 排名:千里之外
    • 原创:153篇
    • 转载:1篇
    • 译文:0篇
    • 评论:17条
    最新评论