Создать поток чисел, которые имеют только определенные простые факторы
Я хочу взять бесконечный поток чисел 1, 2, 3, 4 ... и отфильтровать его так, чтобы в нем находились только числа с простыми множителями 7 и 13. (т.е. 7, 13, 49, 91, 169, 343, ...)
У меня запущена следующая функция, но я запутался в том, как правильно отфильтровывать числа только с этими конкретными простыми факторами.
(define function
(stream-filter
(lambda (x)
(or
(= (/ x 7) 1)
(= (/ x 13) 1)
)
)
numbers
)
)
Где stream-filter - та же самая функция от SICP.
1 ответ
Вот одна идея: найдите главные факторы числа и проверьте, есть ли другие факторы, кроме 7
а также 13
:
(define (factor number)
(let loop ((divisor 2) (number number))
(cond ((> (* divisor divisor) number) (list number))
((zero? (modulo number divisor))
(cons divisor (loop divisor (/ number divisor))))
(else (loop (add1 divisor) number)))))
(stream-filter
(lambda (x)
(null?
(filter (lambda (e) (not (or (= e 7) (= e 13))))
(factor x))))
numbers)