数论基础_素数相关
2011-08-09 10:38
190 查看
1.素数判定
普通的算法即O(sqrt(N))的试除法,高级些的Miller_Rabin素数测试.
但NOIP似乎用不着Miller_Rabin,试除法又非常简单,就不在这里写了.
2.求素数
筛法是比较常见的方法.埃拉托色尼斯筛法可以对付一般的题目了.
但我想写写线性筛法.
先给code:
算法的核心在于while循环内的语句.
首先,prime[j]一定是i的最小质因子,因此也是i*prime[j]的最小质因子.
然后又有了这句话:if i mod prime[j]=0 then break;
于是算法就保证了每个合数只被它的最小质因子筛去,且仅筛去一次.
那么会不会漏掉某些合数没有筛去呢?不会.
因为i*prime[j'](j'>j)一定被prime[j]乘上以后的某个更大的i'筛去。
∵i'*prime[j]=i*prime[j']
∴i'=i/prime[j]*prime[j']>i
所以是O(N)效率的.
线性筛法的作用不只是求素数,以后还会写到其他的应用.
普通的算法即O(sqrt(N))的试除法,高级些的Miller_Rabin素数测试.
但NOIP似乎用不着Miller_Rabin,试除法又非常简单,就不在这里写了.
2.求素数
筛法是比较常见的方法.埃拉托色尼斯筛法可以对付一般的题目了.
但我想写写线性筛法.
先给code:
const MAX=1000000; var Prime:array[0..MAX] of longint; v:array[0..MAX] of boolean; procedure GetPrime; var i,j,tmp,size:longint; begin size:=0; fillchar(v,sizeof(v),0); for i:=2 to MAX do begin if not v[i] then begin inc(size); prime[size]:=i; end; j:=1; while (j<=size)and(prime[j]*i<MAX) do begin v[i*prime[j]]:=true; if i mod prime[j]=0 then break; inc(j); end; end; end; begin GetPrime; end.
算法的核心在于while循环内的语句.
首先,prime[j]一定是i的最小质因子,因此也是i*prime[j]的最小质因子.
然后又有了这句话:if i mod prime[j]=0 then break;
于是算法就保证了每个合数只被它的最小质因子筛去,且仅筛去一次.
那么会不会漏掉某些合数没有筛去呢?不会.
因为i*prime[j'](j'>j)一定被prime[j]乘上以后的某个更大的i'筛去。
∵i'*prime[j]=i*prime[j']
∴i'=i/prime[j]*prime[j']>i
所以是O(N)效率的.
线性筛法的作用不只是求素数,以后还会写到其他的应用.
相关文章推荐
- 【数论】【素数】素数相关基础——基础操作
- 【数论】【素数】素数相关基础——获得素数与判别素数
- 【数论】【素数】素数相关基础——欧拉函数与欧拉定理
- 【数论】【素数】素数相关基础——整数分解
- [未完待续][笔记]数论相关---基础
- hdu 2582(数论相关定理+素数筛选+整数分解)
- 基础数论算法(六) 素数的筛法与质因数分解
- [kuangbin带你飞]专题十四 数论基础 C - Aladdin and the Flying Carpet (线性素数筛,分解质因数)
- [kuangbin带你飞]专题十四 数论基础 F - Goldbach`s Conjecture (线性素数筛)
- 求质数表 素数筛求素数 效率比较 数论相关
- hdu1262 数论基础 寻找素数对
- 基础数论算法(5) 素数的判定
- 求质数表 素数筛求素数 效率比较 数论相关
- [数论]素数相关整理
- 数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】
- 理论: 数论(3):素数基础
- (数论)素数和因式分解hdu-2136;hdu-1492;hdu-1215;hdu1452;hdu-1005;hdu-1852
- IP相关的基础知识
- UVa 10290 {Sum+=i++} to Reach N (数论-整数和素数,组合数学-排列组合)
- Java基础之Java简介、变量、数据类型、运算符及其相关配置