我想写一个在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