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
考虑一个常见的数论问题,指定一个整数,求出不大于该数的所有质数。我们可以先写一个函数来判断某个整数是否为质数,然后用它逐一判断每个整数,而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
相关文章推荐
- Eratosthenes筛法--Haskell实现
- Eratosthenes筛法求1-100之间的素数
- Eratosthenes筛法
- 数论初步——Eratosthenes筛法
- Eratosthenes筛法
- 找质数算法(Sieve of Eratosthenes筛法)
- Eratosthenes筛法的粗糙汇编源代码
- 用Eratosthenes筛法查找质数
- Eratosthenes筛法,求素数
- Eratosthenes筛法
- Eratosthenes(埃拉托色尼)筛法
- 埃拉托斯特尼筛法(Sieve of Eratosthenes)简单c实现
- 利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化
- 埃拉托色尼(Eratosthenes)筛法
- Eratosthenes筛法求素数
- 用 Eratosthenes筛法构造1-n的素数表.
- 利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化
- C++ 数论-Eratosthenes筛法
- Eratosthenes筛法(埃氏筛法)
- Sieve of Eratosthenes(埃拉托斯特尼素数筛选法)--java实现