Создать поток чисел, которые имеют только определенные простые факторы

Я хочу взять бесконечный поток чисел 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)
Другие вопросы по тегам