为了展示如何用卢卡斯序列检查素数,让我们看一个例子。考虑卢卡斯序列中的前几个数字:1,3,4,7,11,18,29,47,76,123,...
如果我们想知道一个特定的数字,比如 7,是否是素数,我们将卢卡斯数列中的第 7 个数字减去 1。第 7 个卢卡斯数是 29。减去 1,我们得到 28。现在,如果这个结果是能被 7 整除,7 可能是素数。在我们的示例中,28 可以被 7 整除,因此它可能是素数。我们称这些数为Lucas 伪素数。
如果我们对另一个数字感兴趣,比如 8,我们将取第 8 个卢卡斯数并减去 1。在这种情况下,我们得到 46,它不能被 8 整除。所以,8绝对不是素数。此方法对于过滤出合数很有用。
因此,确定整数p是否可能是素数的一般过程如下:
- 找到第p个卢卡斯数
- 减 1
- 检查p是否将结果均分
定义一个 SCHEME 函数,命名
(lucas-pseudoprime p)
它使用这种方法来确定整数p是否是 Lucas 伪素数。
到目前为止我有这个:
(define (lucas-pseudoprime p)
(define (helper-lucas goal current next)
(if (= goal current)
(head next)
(helper-lucas goal (+ current 1) next))
(let ((solution (- p 1))
(if (= (module solution p) 0) #t
#f)))))
不知道这有什么问题。