(это интересно!) Я знаю, предмет хорошо известен. Современное состояние (в Haskell, а также на других языках) для эффективной генерации неограниченной возрастающей последовательности чисел Хэмминга, без дубликатов и без упущений, уже давно является следующим (AFAIK - и btw эквивалентно оригинальный код Edsger Dijkstra):
hamm :: [Integer]
hamm = 1 : map (2*) hamm `union` map (3*) hamm `union` map (5*) hamm
where
union [email protected](x:xs) [email protected](y:ys) = case compare x y of
LT -> x : union xs b
EQ -> x : union xs ys
GT -> y : union a ys
Вопрос, который я задаю, , вы можете найти способ сделать его более эффективным в какой-либо значительной мере? Является ли это по-прежнему актуальным, или на самом деле возможно улучшить это, чтобы работать в два раза быстрее и с лучшим эмпирическим порядком роста для загрузки?
Если ваш ответ "да", пожалуйста, покажите код и обсудите его скорость и эмпирические порядки роста по сравнению с приведенным выше (он работает примерно на ~ n^1.05 .. n^1.10
для первых нескольких сотен тысяч произведенных номеров). Кроме того, если он существует, может ли этот эффективный алгоритм быть расширен до создания последовательности гладких чисел с любым заданным набором простых чисел?