Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. fun generatePrimeSequence() = PostponedPrimeIterator().asSequence()
  2.  
  3. class PostponedPrimeIterator() : AbstractIterator<Int>() {
  4. private lateinit var basePrimes: PostponedPrimeIterator
  5. private var basePrime = 0
  6.  
  7. private val sieve = mutableMapOf<Int, Int>()
  8. private val initialPrimes = sequenceOf(2, 3, 5, 7).iterator()
  9. private var value = 0
  10.  
  11. override fun computeNext() {
  12. if (initialPrimes.hasNext()) {
  13. value = initialPrimes.next()
  14. setNext(value)
  15. } else {
  16. value += 2
  17.  
  18. if (value == 9) {
  19. basePrimes = PostponedPrimeIterator()
  20. basePrimes.next()
  21. basePrime = basePrimes.next()
  22. assert(value == basePrime * basePrime)
  23. }
  24.  
  25. while (value > 0) {
  26. val factor = sieve.remove(value) ?:
  27. if (value == basePrime * basePrime) {
  28. basePrime.apply {
  29. basePrime = basePrimes.next()
  30. }
  31. } else {
  32. assert(value < basePrime * basePrime)
  33. setNext(value)
  34. break
  35. }
  36. var j = value + 2 * factor
  37. while (j in sieve) {
  38. j += 2 * factor
  39. }
  40. sieve[j] = factor
  41. value += 2
  42. }
  43. }
  44. }
  45. }
  46.  
  47. generatePrimeSequence().take(20).forEach(::println)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement