这里是乘法顺序的定义 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))))))
答案 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,v
,r
的当前功效,从r
开始,并在每次迭代时增加先前值乘以r
(因此在每次迭代时,不变量为 v = r k )。当我们达到k
的值,使 v mod n = 1时,我们会终止返回k
的迭代。
有关loop
的详细说明,请参阅真实有用的书籍formal definition中的Practical Common Lisp或实际解释(见第7章和第22章)(“必须阅读“学习Common Lisp。”