筛法求素数

  这属于我用于解[url=http://projecteuler.net]Project Euler[/url]问题而写的数学工具的一部分。之前见[url=http://eastsun.iteye.com/admin/blogs/207614]按字典顺序生成所有的排列[/url]
/**
&#Util.scala
utils for mathematical algorithm,include:
# get all primes below bound in order
# generate all permutations in lexicographical order
@author Eastsun
*/
package eastsun.math

object Util {
/**
Get all primes below bound in order
*/
def getPrimes(bound:Int):Array[Int] = {
import scala.math._
if(bound <= 2) return Array()
var sq = sqrt(bound-1)
var half = (bound-1)/2
var flags = new Array[Boolean](half+1)
var prime = 3
while(prime <= sq){
var idx = prime*prime/2
while(idx <= half){
flags(idx) = true
idx += prime
}
do{
prime += 2
}while(flags(prime>>>1))
}
var count = 1
var idx = 1
while(idx <= half){
if(!flags(idx)) count += 1
idx += 1
}
if((bound-1)%2 == 0 && !flags(half)) count -= 1
var primes = new Array[Int](count)
primes(0) = 2
idx =1
var idp = 1
while(idp < count){
if(!flags(idx)){
primes(idp) = 2*idx + 1
idp += 1
}
idx += 1
}
primes
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值