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

我想写一个在lisp中查找乘法顺序的程序,但我不知道我的程序出了什么问题,lisp,Lisp,这是乘法顺序的定义 这是节目单 (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

这是乘法顺序的定义

这是节目单

    (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)))))) 

这里是一个可能的解决方案,不使用幂函数。请注意,这样的函数已经在Common Lisp中定义

要计算模n的乘法阶数,应该调用ord为n的函数。例如:

(ord 7 10) ; => 6
106年以来≡ 1模7

函数首先检查这两个参数是否为coprimes,否则返回0。然后使用扩展循环形式在两个变量上执行循环,k为结果,从1开始,每次迭代增加1,v为r的当前幂,从r开始,每次迭代增加前一个值乘以r,因此每次迭代的不变量为v=rk。当我们达到k的值,使得v mod n=1时,我们终止返回k的迭代


有关循环的详细说明,请参阅《学习通用Lisp的必读读物》一书第7章和第22章中的说明或实际说明。

我将从更好的格式开始。现在你的代码是不可读的。接下来你需要写一个错误描述:哪里出了问题,怎么出的问题!然后你需要问问自己DEFVAR构造在这个上下文中是否有用……谢谢,因为我是lisp新手,所以肯定有很多mistakes@ThuậnNguyễn、 我添加了一个解释以及链接。
(ord 7 10) ; => 6