2017-06-02 30 views
0

這裏是乘法階 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

我會開始更好的格式。現在你的代碼是不可讀的。接下來,你需要寫一個錯誤描述:出了什麼問題,以及如何!那麼你需要問自己,DEFVAR結構在這種情況下是否有用... –

+0

謝謝,因爲我是lisp新手,所以必須有很多錯誤 –

回答

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

要計算的一個ñ乘法順序,應該調用函數與(ord a n)。例如:

(ord 7 10) ; => 6 

自10 ≡1(MOD 7)

功能首先檢查,查看是否兩個參數是coprimes,否則返回0。然後使用擴展loop形式以從兩個變量k(結果)開始循環,從1開始並在每次迭代時增加1,並且,當前功率爲r,從r開始,並且在每次迭代時增加前一值乘以r(so在每次迭代invar巨型是v = rk)。當我們達到k的值,使得v mod n = 1,我們終止返回k的迭代。

對於loop詳細描述看到的要麼是formal definition,或者真正有用的書Practical Common Lisp的實際解釋(目前在第7章22)(「必須閱讀」學習Common Lisp的)。

+0

這是錯誤的! –

+0

@ThuậnNguyễn,我更正了代碼。 – Renzo

+0

你能解釋一下我是新來的代碼嗎? –

相關問題