数论——素数筛选法与整数的素因子分解
来源:互联网 发布:java继承的定义 编辑:程序博客网 时间:2024/06/05 14:34
筛选法
求出n以内的素数,最快的应该是筛选法。
筛选法的思路是:
要求10000以内的素数,把1-10000都列出来,1不是素数,划掉;2是素数,所有2的倍数都不是素数,划掉;取出下一个幸存的数,划掉它的所有倍数;直到所有素数找完为止。
这种做法的空间复杂度是O(n),时间复杂度O(n/logn)。
const int Max = 1000005; bool prime[Max]={0};//0表示素数,1为非素数 //筛选n以内的素数 void getPrime(int n) { int i,j; int t; for(i = 2; i <= n; i++) { if(!prime[i]) { for(j = 2; (t=j*i) <= n; j++) prime[t] = 1; } } }
分解素因子
唯一质因子分解定理:任意一个合数a仅能以一种方式,写成如下的乘积形式:
a = p1^e1*p2^e2*...*pr^er
其中pi为素数,p1<p2<...<pr,且ei为正整数。例如数6000=2^4*3*5^3。
素因子的分解技巧:首先a的某两个素因子不可能同时大于sqrt(a),这样,先用筛选法求出sqrt(a)以内的所有素数,然后用a依次去mod这些素数,若能整除,则找到素因子,将素因子去掉,再继续找。最后若a>1,则a也是它的素因子。
const int Max = 100005; int isPrime[Max]={0}; int prime[Max/5],num=0; int factors[100],s=0; void getPrime(int n) { int i,j; int t; for(i = 2; i <= n; i++) { if(!isPrime[i]) { prime[num++] = i; for(j = 2; (t=i*j) <= n; j++) isPrime[t] = 1; } } } void decompose(int n, int* factors) { int te = (int)sqrt(n*1.0); for(int i = 0; i<num&&prime[i]<=te; i++) { if(n%prime[i]==0) { factors[s++] = prime[i]; while(n%prime[i]==0) n = n/prime[i]; } } if(n > 1) factors[s++] = n; }
- 数论 素数筛选法与整数的素因子分解
- 数论--素数筛选法与整数的素因子分解
- 数论——素数筛选法与整数的素因子分解
- 数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)
- 【数论】【素数】素数相关基础——整数分解
- poj1811——Prime Test//素数判断+整数分解因子
- 素数筛选,整数的唯一分解,整数所有因子之和,递归求等比数列前n项和
- HDU 1695(数论,筛选+素因子分解+容斥)
- HDU 1695(数论,筛选+素因子分解+容斥)
- 整数的素因子分解
- 整数的素因子分解
- Find Terrorists(素数筛选+素因子分解)
- 分解素因子(数论)
- 分解素因子(数论)
- 初等数论——整数的分解
- poj1811(Miller-Rabin(素数测试)与Pollard rho(整数的因子分解))
- Poj 1811 Prime Test 素数测试 Miller-Rabin 与 整数的因子分解 Pollard rho
- 整数因子的分解
- java连接数据库
- \webapps\bookstore does not exist or is not a readable directory的问题决解
- http://tangyanbo.iteye.com/blog/1503957
- C# 打印PDF文件
- IBOutlet造成的内存泄漏
- 数论——素数筛选法与整数的素因子分解
- C#中LaseIndexOf方法的作用(简述)
- 利用Google Chart服务生成二维码
- WCF开发实战系列一:创建第一个WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm)
- 拷贝Python 对象-----浅拷贝和深拷贝
- Android RalativeLayout 详解
- Android Wi-Fi Display(Miracast)介绍
- inux kernel 里面打印堆栈的函数
- win7安装tomcat