您的位置:首页 > 其它

Eratosthenes筛法的F#实现

2008-11-11 12:14 330 查看
什么是Eratosthenes筛法

考虑一个常见的数论问题,指定一个整数,求出不大于该数的所有质数。我们可以先写一个函数来判断某个整数是否为质数,然后用它逐一判断每个整数,而Eratosthenes筛法比这种方法高效得多。

下面举例来说明它的原理。观察下面的彩图(来自wikipedia),这里是检查120以内的所有质数。首先去掉1,因为1既不是质数也不是合数;然后2是质数,那么2的倍数都肯定不是质数了,所以把2的倍数都涂成红色(它们出局了,这里是质数的游戏...);接下来3没有被涂掉,所以3是质数,同理把3的倍数涂成绿色;下一个未涂掉的是5,所以5也是质数,同理把5的倍数涂掉;然后再涂掉7的倍数,剩下的就都是质数了。

F# Code - Eratosthenes筛法
#light
open System

let generatePrimes n =
match n with
| _ when n < 2 -> [||]
| _ ->
// Init sieve.
let sieve = [| for i in 0 .. n do yield true |]

let isPrime index = sieve.[index]

// Check it.
let upperBound = Convert.ToInt32(Math.Sqrt((float)n))
for i = 2 to upperBound do
if isPrime i then
for j in [i * 2 .. i .. sieve.Length - 1] do
sieve.[j] <- false

let mutable count = 0
for i = 2 to sieve.Length - 1 do
if isPrime i then
count <- count + 1

let primes = Array.create count 0
let mutable index = 0
for i = 2 to sieve.Length - 1 do
if isPrime i then
primes.[index] <- i
index <- index + 1

primes

let getInt() =
Convert.ToInt32(Console.ReadLine())

let main() =
let i = getInt()
let primes = generatePrimes i
Console.WriteLine("find {0} prime(s)", primes.Length)
print_any primes

main()

Console.Read()[/code]

这两段代码也就勉强能实现算法吧,有时间再考虑优化一下。

(要了解本人所写的其它F#随笔请查看 F#系列随笔索引

参考:

Sieve of Eratosthenes
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: