我想编写一个在lisp中找到乘法顺序的程序,但我不知道我的程序有什么问题

时间:2017-06-02 14:30:28

标签: lisp

这里是乘法顺序的定义 https://en.wikipedia.org/wiki/Multiplicative_order

这是程序

    (defun power (x y)
       (if (= y 0) 1 
           (if (evenp y) (* (power x (/ y 2)) (power x (/ y 2)))
               (* x (power x (/ (- y 1) 2)) (power x (/ (- y 1) 2))))))  
(defun ord (n r)
      (if (> (gcd n r) 1) 0 
          (let ((a 0))(loop (defvar a (+ a 1)) 
               (when (= (mod (- (power r a) 1) n) 0)(return a)))))) 

1 个答案:

答案 0 :(得分:1)

这是一个可能的解决方案,不使用power函数(请注意,这个函数已在Common Lisp中定义,expt)。

(defun ord (n r)
   (if (> (gcd r n) 1)
       0
       (loop for k from 1
         for v = r then (* v r)
         when (= 1 (mod v n))
           do (return k))))

要计算 a n 的乘法顺序,应使用(ord a n)调用该函数。例如:

(ord 7 10) ; => 6

因为10 6 ≡1(mod 7)

函数首先检查两个参数是否是互质,否则返回0.然后,扩展loop形式用于执行两个变量k(结果)的循环,从1开始并在每次迭代时增加1,vr的当前功效,从r开始,并在每次迭代时增加先前值乘以r (因此在每次迭代时,不变量为 v = r k )。当我们达到k的值,使 v mod n = 1时,我们会终止返回k的迭代。

有关loop的详细说明,请参阅真实有用的书籍formal definition中的Practical Common Lisp或实际解释(见第7章和第22章)(“必须阅读“学习Common Lisp。”