A simple sieve in Phobos?

Chris Williams yoreanon-chrisw at yahoo.co.jp
Wed Mar 19 11:51:34 PDT 2014


On Wednesday, 19 March 2014 at 18:40:49 UTC, Chris Williams wrote:
> enum uint MAX_N = 10_000_000U;
>
> void calcPrimes() pure nothrow {
>     uint[][uint] markers;
>
>     for (uint L = 2; L < MAX_N; L++) {
>         uint[]* pList = (L in markers);
>         if (pList is null) {
>             markers[L + L] = [L];
>         }
>         else {
>             uint[] list = *pList;
>             size_t len = list.length - 1;
>             for (uint L2 = 0; L2 < len; L2++) {
>                 uint val = list[L2];
>                 markers[ L + val ] ~= val;
>             }
>
>             // reuse the current list for the last item to save 
> allocations
>             list[0] = list[len];
>             list.length = 1;
>             markers[ L + list[len] ] = list;
>         }
>     }
> }
>
> void main() {
>     calcPrimes;
> }

Well bummer, my quick and easy optimization broke the result for 
some reason. Here's a version that actually produces the correct 
answers, while I try and debug:

enum uint MAX_N = 10_000_000U;

void calcPrimes() {
     uint[][uint] markers;

     for (uint L = 2; L < MAX_N; L++) {
         uint[]* pList = (L in markers);
         if (pList is null) {
             markers[L + L] = [L];
         }
         else {
             uint[] list = *pList;
             for (uint L2 = 0; L2 < list.length; L2++) {
                 uint val = list[L2];
                 markers[ L + val ] ~= val;
             }
         }
     }
}

void main() {
     calcPrimes;
}


More information about the Digitalmars-d mailing list