Rebol3 Code Examplex


The sieve of Sundaram

A prime-generating algorithm that finds odd primes by removing numbers in a specific pattern.

Rebol [
    title: "Rosetta code: The sieve of Sundaram"
    file:  %The_sieve_of_Sundaram.r3
    url:   https://rosettacode.org/wiki/The_sieve_of_Sundaram
]

sieve-of-sundaram: function [
    "Finds primes using the Sieve of Sundaram up to the nth prime"
    nth [integer!] "Which prime to find"
    /verbose       "Print all primes found"
][
    assert [nth > 0  "nth must be a positive integer"]
    k: (2.4 * nth * log-e nth) // 2 ;; nth prime is at about n * log(n)
    composites: make bitset! k      ;; defaults to all false
    for i 1 k - 1 1 [
        j: i
        while [(p: 2 * i * j + i + j) < k] [
            composites/:p: true
            ++ j
        ]
    ]
    pcount: 0
    for i 1 k 1 [
       unless composites/:i [       ;; it's prime
            ++ pcount
            if verbose [
                prin [pad (2 * i + 1) -4 ""]
                if zero? pcount % 10 [print ""]
            ]
            if pcount = nth [
                print rejoin [
                    "^/Sundaram primes start with 3. The " nth
                    "th Sundaram prime is " 2 * i + 1 "."
                ]
                break
            ]
        ]
    ]
]

sieve-of-sundaram/verbose 100
sieve-of-sundaram 1000000

Output:

   3    5    7   11   13   17   19   23   29   31 
  37   41   43   47   53   59   61   67   71   73 
  79   83   89   97  101  103  107  109  113  127 
 131  137  139  149  151  157  163  167  173  179 
 181  191  193  197  199  211  223  227  229  233 
 239  241  251  257  263  269  271  277  281  283 
 293  307  311  313  317  331  337  347  349  353 
 359  367  373  379  383  389  397  401  409  419 
 421  431  433  439  443  449  457  461  463  467 
 479  487  491  499  503  509  521  523  541  547 

Sundaram primes start with 3. The 100th Sundaram prime is 547.

Sundaram primes start with 3. The 1000000th Sundaram prime is 15485867.