Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 3.11 KB | None | 0 0
  1. function basicsieve(n)
  2.   sieve = trues(n)
  3.   sieve[1] = false
  4.   last = Int(ceil(sqrt(n)))
  5.   @inbounds for p in 2:last
  6.     if sieve[p]
  7.       for i in p*p:p:n
  8.         sieve[i] = false
  9.       end
  10.     end
  11.   end
  12.   sieve
  13. end
  14.  
  15. function sievesegment(sievedprimes,sieve,start) # starts sieving at start + 1
  16.   last = min(Int(ceil(sqrt(start + length(sieve)))) , length(sievedprimes))
  17.   @inbounds for p in 2:last
  18.     if sievedprimes[p]
  19.       for i in (p - start%p):p:length(sieve)
  20.         sieve[i] = false
  21.       end
  22.     end
  23.   end
  24. end
  25.  
  26.  
  27. using ResumableFunctions
  28.  
  29. @resumable function segmentedsieve(n)
  30.     segmentstart = 0
  31.     segmentend = Int(ceil(sqrt(n)))
  32.     initialsieve = basicsieve(segmentend)
  33.     segment = initialsieve
  34.     lastprime = 2
  35.     p = 3
  36.  
  37.     while p <= n
  38.         while p <= segmentend
  39.             if segment[p-segmentstart]
  40.                 @yield lastprime
  41.                 lastprime = p
  42.             end
  43.             p+=1
  44.         end
  45.         segmentstart  += length(segment)
  46.         segmentend += length(segment)
  47.         segmentend = min(segmentend,n)
  48.         segment .= true
  49.         sievesegment(initialsieve,segment,segmentstart)
  50.     end
  51.     lastprime
  52. end
  53.  
  54.  
  55. function segmentedsieve_channel(n)
  56.     Channel() do c
  57.         segmentstart = 0
  58.         segmentend = Int(ceil(sqrt(n)))
  59.         initialsieve = basicsieve(segmentend)
  60.         segment = initialsieve
  61.         lastprime = 2
  62.         p = 3
  63.  
  64.         while p <= n
  65.             while p <= segmentend
  66.                if segment[p-segmentstart]
  67.                    push!(c,lastprime)
  68.                    lastprime = p
  69.                end
  70.                p+=1
  71.             end
  72.             segmentstart  += length(segment)
  73.             segmentend += length(segment)
  74.             segmentend = min(segmentend,n)
  75.             segment .= true
  76.             sievesegment(initialsieve,segment,segmentstart)
  77.         end
  78.         push!(c,lastprime)
  79.     end
  80. end
  81.  
  82.  
  83. mutable struct Siever
  84.     n::Int
  85.     segmentstart::Int
  86.     segmentend::Int
  87.     initialsieve::BitArray{1}
  88.     segment::BitArray{1}
  89. end
  90.  
  91. function segmentedsieve_iterator(n)
  92.     last = Int(ceil(sqrt(n)))
  93.     initialsieve = basicsieve(last)
  94.     Siever(n,0,last,initialsieve,initialsieve)
  95. end
  96.  
  97. function Base.start(s::Siever)
  98.     s.segment .= s.initialsieve
  99.     s.segmentstart = 0
  100.     s.segmentend = length(s.segment)
  101.     2
  102. end
  103.  
  104. function Base.next(s::Siever,lastprime)
  105.     p = lastprime
  106.     p += 1
  107.     while p <= s.n
  108.         while p <= s.segmentend
  109.             if s.segment[p-s.segmentstart]
  110.                 return (lastprime,p)
  111.             end
  112.             p+=1
  113.         end
  114.         if s.segmentend == s.n return (lastprime,s.n + 1) end
  115.         s.segmentstart += length(s.segment)
  116.         s.segmentend += length(s.segment)
  117.         s.segmentend = min(s.segmentend,s.n)
  118.         s.segment .= true
  119.         sievesegment(s.initialsieve,s.segment,s.segmentstart)
  120.     end
  121.     (p-1,s.n+1)
  122. end
  123.  
  124. Base.done(s::Siever,nextprime) = nextprime > s.n
  125.  
  126.  
  127. bench1() = for i in segmentedsieve(n) end
  128. bench2() = for i in segmentedsieve_channel(n) end
  129. bench3() = for i in segmentedsieve_iterator(n) end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement