home *** CD-ROM | disk | FTP | other *** search
- ; Beispiele für die Primfaktorzerlegungsroutinen
-
- (require 'primzahl)
-
- ; (primwurz x p) stellt fest, ob x eine Primitivwurzel mod p ist, p Primzahl.
- (defun primwurz (x p)
- (and (not (zerop (mod x p)))
- (dolist (j (primteiler (1- p)) t)
- (unless (/= 1 (exptmod x (/ (1- p) j) p))) (return nil))
- ) ) )
-
- ; (invphi m) bestimmt für m>0 eine Liste aller n>0 mit phi(n)=m.
- (defun invphi (m &optional (s 1))
- ; bestimmt nur die n, bei denen alle Primfaktoren > s sind.
- (append
- (if (= m 1) '(1)) ; n=1 liefert m=1
- (mapcan ; n>1 hat einen kleinsten Primfaktor p
- #'(lambda (d &aux (p (1+ d)))
- (if (and (> p s) (isprime p))
- (do ((pj p (* pj p)) ; pj=p^j, j=1,2,...
- (m1 (/ m d) (/ m1 p)) ; m1=m/(p-1)p^(j-1)
- (accu nil (append
- (mapcar #'(lambda (n1) (* n1 pj))
- (invphi m1 p)
- )
- accu
- )) )
- ((not (integerp m1)) accu)
- ) ) )
- (pdivisors m)
- ) ) )
-
- (defun test (S)
- (with-open-file (f "invphi.dat" :direction :output :if-exists :new-version)
- (let ((stream (make-broadcast-stream *standard-output* f)))
- (do ((i 1 (1+ i)))
- ((> i S))
- (format stream "~%phi^-1(~D) = ~S" i (sort (invphi i) #'<))
- ))) )
-
- ; (tau n) ergibt die Anzahl aller positiven Teiler von n>0.
- ; (defun tau (n) (length (pdivisors n)))
- (defun tau (n)
- (reduce #'* (mapcar #'(lambda (pe) (1+ (cdr pe))) (pfzv n)) )
- )
-
- ; (sigma n) ergibt die Summe aller positiven Teiler von n>0.
- ; (defun sigma (n) (reduce #'+ (pdivisors n)))
- (defun sigma (n)
- (reduce #'* (mapcar #'(lambda (pe &aux (p (car pe)) (e (cdr pe)))
- (do* ((i 0 (1+ i))
- (q 1 (* q p))
- (s 1 (+ s q)))
- ((= i e) s)
- ) )
- (pfzv n)
- ) ) )
-
- #-CLISP (require 'fak)
- #+CLISP (defun fak (n) (! n))
-
- (defun f (i) ; zerlegt i!-1 in Primfaktoren
- (if (>= i 2)
- (time (format t "~%~D!-1 = ~S" i (pfz (1- (fak i)))))
- ) )
-
-