Проблемы реализации сита Эратосфена в Котлине — почему отсутствует 4?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Проблемы реализации сита Эратосфена в Котлине — почему отсутствует 4?

Сообщение Anonymous »

Я реализовал Решето Эратосфена в Котлине для генерации простых чисел. Я заметил проблему, из-за которой вторая версия моего кода работает неправильно, и недоумеваю, почему в выводе отсутствует цифра 4.
Вот код, который работает правильно:

Код: Выделить всё

val primes: Sequence = sequence {
var numbers = generateSequence(2) { it + 1 }
Log.d("testsss", "Initial numbers: ${numbers.take(10).toList()}")  // Initial numbers

while (true) {
val prime = numbers.first()
Log.d("testsss", "Current prime: $prime")
yield(prime)
numbers = numbers.drop(1).filter { it % prime != 0 }
Log.d("testsss", "After filtering with prime $prime: ${numbers.take(10).toList()}")  // After filtering
}
}

val primesList = primes.take(10).toList()
Log.d("testsss", "Final primes: $primesList")
println(primesList)
Журналы рабочего кода следующие:

Код: Выделить всё

Initial numbers: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Current prime: 2
After filtering with prime 2: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
Current prime: 3
After filtering with prime 3: [5, 7, 11, 13, 17, 19, 23, 25, 29, 31]
Current prime: 5
After filtering with prime 5: [7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
Current prime: 7
After filtering with prime 7: [11, 13, 17, 19, 23, 29, 31, 37, 41, 43]
Current prime: 11
After filtering with prime 11: [13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
Current prime: 13
After filtering with prime 13: [17, 19, 23, 29, 31, 37, 41, 43, 47, 53]
Current prime: 17
After filtering with prime 17: [19, 23, 29, 31, 37, 41, 43, 47, 53, 59]
Current prime: 19
After filtering with prime 19: [23, 29, 31, 37, 41, 43, 47, 53, 59, 61]
Current prime: 23
After filtering with prime 23: [29, 31, 37, 41, 43, 47, 53, 59, 61, 67]
Current prime: 29
Final primes: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
А вот код, который работает неправильно:

Код: Выделить всё

val primes: Sequence = sequence {
var numbers = generateSequence(2) { it + 1 }
Log.d("testsss", "Initial numbers: ${numbers.take(10).toList()}")  // Initial numbers

var prime: Int
while (true) {
prime = numbers.first()
Log.d("testsss", "Current prime: $prime")
yield(prime)
numbers = numbers.drop(1).filter { it % prime != 0 }
Log.d("testsss", "After filtering with prime $prime: ${numbers.take(10).toList()}")  // After filtering
}
}

val primesList = primes.take(10).toList()
Log.d("testsss", "Final primes: $primesList")
println(primesList)
Журналы проблемного кода:

Код: Выделить всё

Initial numbers: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Current prime: 2
After filtering with prime 2: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
Current prime: 3
After filtering with prime 3: [5, 7, 8, 10, 11, 13, 14, 16, 17, 19]
Current prime: 5
After filtering with prime 5: [6, 7, 8, 9, 11, 12, 13, 14, 16, 17]
Current prime: 6
After filtering with prime 6: [7, 8, 9, 10, 11, 13, 14, 15, 16, 17]
Current prime: 7
After filtering with prime 7: [8, 9, 10, 11, 12, 13, 15, 16, 17, 18]
Current prime: 8
After filtering with prime 8: [9, 10, 11, 12, 13, 14, 15, 17, 18, 19]
Current prime: 9
After filtering with prime 9: [10, 11, 12, 13, 14, 15, 16, 17, 19, 20]
Current prime: 10
After filtering with prime 10: [11, 12, 13, 14, 15, 16, 17, 18, 19, 21]
Current prime: 11
After filtering with prime 11: [12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
Current prime: 12
Final primes: [2, 3, 5, 6, 7, 8, 9, 10, 11, 12]
Я понимаю, что из-за ленивой оценки последовательностей Kotlin часть фильтра ссылается на неправильные простые значения. Однако если ленивая оценка фильтра происходит для всех простых чисел, то должно появиться 4. Если фильтр был применен правильно для простого числа = 2, последующие числа, кратные 2, например 6, 8, 10 и 12, не должны появляться в результатах. Какую ошибку я могу допустить в своем понимании?


Подробнее здесь: https://stackoverflow.com/questions/786 ... -4-missing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»