;; GAMMA GAMMA GAMMA GAMMA GAMMA GAMMA GAMMA ;; GAMMA GAMMA GAMMA GAMMA GAMMA GAMMA GAMMA ;; GAMMA GAMMA GAMMA GAMMA GAMMA GAMMA GAMMA (IN-PACKAGE "COMMON-LISP-USER") (provide "gamma") ;; TYPES (DEFUN SGM-P (object) ;; SGM = SiGMa (declare (type any object)) (the boolean (and (consp object) (typep (car object) 'fixnum) (typep (cdr object) 'cmbn)))) (DEFTYPE SGM () '(satisfies sgm-p)) (DEFUN IGAMMA-P (object) ;; IGAMMA = Internal GAMMA, ;; without the keyword and the degree (declare (type any object)) (the boolean (and (listp object) (every #'sgm-p object)))) (DEFTYPE IGAMMA () '(satisfies igamma-p)) (DEFUN GAMMA-P (object) (declare (type any object)) (the boolean (and (consp object) (eql (car object) :gamma) (consp (cdr object)) (typep (second object) 'fixnum) (typep (cddr object) 'igamma)))) (DEFTYPE GAMMA () '(satisfies gamma-p)) ;; MACROS (DEFMACRO SGM (sgop cmbn) `(cons ,sgop ,cmbn)) (DEFMACRO -SGM (mark) `(car ,mark)) (DEFMACRO SGOP (sgm) `(car ,sgm)) (DEFMACRO -SGOP (mark) `(caar ,mark)) (DEFMACRO SGCM (sgm) `(cdr ,sgm)) (DEFMACRO -SGCM (mark) `(cdar ,mark)) (DEFMACRO WITH-SGM ((sgop-var sgcm-var) sgm . body) `(let ((,sgop-var (sgop ,sgm)) (,sgcm-var (sgcm ,sgm))) (declare (fixnum ,sgop-var) (type cmbn ,sgcm-var)) ,@body)) (DEFMACRO WITH--SGM ((sgop-var sgcm-var) mark . body) `(let ((,sgop-var (-sgop ,mark)) (,sgcm-var (-sgcm ,mark))) (declare (fixnum ,sgop-var) (type cmbn ,sgcm-var)) ,@body)) (DEFMACRO SGM-NON-ZERO-P (sgm) `(cmbn-non-zero-p (sgcm ,sgm))) (DEFMACRO SGM-ZERO-P (sgm) `(cmbn-zero-p (sgcm ,sgm))) (DEFMACRO MAKE-GAMMA (&key degr list) `(cons :gamma (cons ,degr ,list))) (DEFMACRO GAMMA-DEGR (gmm) `(cadr ,gmm)) (DEFMACRO GAMMA-LIST (gmm) `(cddr ,gmm)) (DEFMACRO WITH-GAMMA ((degr list) gmm . body) `(let ((,degr (gamma-degr ,gmm)) (,list (gamma-list ,gmm))) (declare (fixnum ,degr) (list ,list)) ,@body)) (DEFMACRO SGM-GAMMA (degr sgop sgcm) `(cons :gamma (cons ,degr (cons (cons ,sgop ,sgcm) nil)))) (DEFMACRO GAMMA-NON-ZERO-P (gmm) `(gamma-list ,gmm)) (DEFMACRO GAMMA-ZERO-P (gmm) `(null (gamma-list ,gmm))) #|(DEFMETHOD PRINT-KEYCONS ((key (eql :sgm)) cdr stream) (setf cdr (cons :sgm cdr)) (format stream "" (hyphenize-list (dgop-int-ext (sgop cdr))) (sgcm cdr)) cdr) |# ;; METHODS (DEFMETHOD PRINT-KEYCONS ((key (eql :gamma)) cdr stream) (declare (list cdr) (stream stream)) (the (eql t) (let ((degr (first cdr)) (list (rest cdr))) (declare (fixnum degr) (list list)) (format stream "" (hyphenize-list (dgop-int-ext (sgop (car mark)))) (sgcm (car mark)))) (format stream "~%>" ) t))) ;; ELEMENTARY OPERATIONS WITH GAMMA ELEMENTS (DEFUN GAMMA-ELT (degr &rest rest) (declare (fixnum degr)) (the gamma (let ((rslt (list degr :gamma))) (do ((mark rest (cddr mark))) ((endp mark) (nreverse rslt)) (declare (list mark)) (push (sgm (car mark) (cadr mark)) rslt))))) (DEFUN CHECK-GAMMA (gmm) (declare (type gamma gmm)) (the boolean (with-gamma (degr glist) gmm (declare (fixnum degr) (list glist)) (do ((mark2 glist mark1) (mark1 (rest glist) (cdr mark1))) ((endp mark1) t) (declare (list mark1 mark2)) (unless (= degr (+ (length (dgop-int-ext (-sgop mark2))) (cmbn-degr (-sgcm mark2)))) (error "In CHECK-GAMMA, bad degre; the element:~@ ~A~@ has a degree different to:~@ ~A." (-sgm mark2) degr)) (unless (< (-sgop mark2) (-sgop mark1)) (error "In CHECK-GAMMA, bad order; the degeneracy operator:~@ ~A~@ is not less than the degeneracy operator:~@ ~A." (dgop-int-ext (-sgop mark2)) (dgop-int-ext (-sgop mark1)))))))) #| (setf g1 (gamma-elt 5 3 (cmbn 3 8 'a) 1 (cmbn 4 3 'b))) (check-gamma g1) (setf g2 (gamma-elt 5 3 (cmbn 4 3 'b) 1 (cmbn 3 8 'a))) (check-gamma g2) (setf g3 (gamma-elt 5 1 (cmbn 4 3 'b) 3 (cmbn 3 8 'a))) (check-gamma g3) (setf g4 (gamma-elt 5)) (check-gamma g4) |# (DEFUN ZERO-GAMMA (degr) (declare (fixnum degr)) (the gamma (make-gamma :degr degr :list +empty-list+))) #| (setf g0 (zero-gamma 3)) (check-gamma g0) |# (DEFUN GAMMA-OPPS (gmm) (declare (type gamma gmm)) (the gamma (with-gamma (degr glist) gmm (make-gamma :degr degr :list (mapcar #'(lambda (sgm) (declare (type sgm sgm)) (with-sgm (sgop cmbn) sgm (sgm sgop (cmbn-opps cmbn)))) glist))))) #| (setf g (gamma-elt 5 1 (cmbn 4 3 'b 8 'c) 3 (cmbn 3 8 'a -9 'b))) (gamma-opps g) |# (DEFUN 2GAMMA-ADD (cmpr gmm1 gmm2) (declare (type cmprf cmpr) (type gamma gmm1 gmm2)) (the gamma (with-gamma (degr1 list1) gmm1 (with-gamma (degr2 list2) gmm2 (declare (fixnum degr1 degr2) (list list1 list2)) (unless (= degr1 degr2) (error "In 2GAMMA-ADD, the gamma elements have different degrees ~D and ~D." degr1 degr2)) (unless list1 (return-from 2gamma-add gmm2)) (unless list2 (return-from 2gamma-add gmm1)) (let ((pre-rslt +empty-list+)) (declare (list pre-rslt)) (do ((mark1 list1) (mark2 list2)) ((or (endp mark1) (endp mark2)) (if mark1 (setf pre-rslt (nreconc pre-rslt mark1)) (if mark2 (setf pre-rslt (nreconc pre-rslt mark2)) (setf pre-rslt (nreverse pre-rslt))))) (declare (list mark1 mark2)) (with--sgm (sgop1 cmbn1) mark1 (with--sgm (sgop2 cmbn2) mark2 (declare (fixnum sgop1 sgop2) (type cmbn cmbn1 cmbn2)) (if (= sgop1 sgop2) (let ((cmbn (2cmbn-add cmpr cmbn1 cmbn2))) (declare (type cmbn cmbn)) (unless (cmbn-zero-p cmbn) (push (sgm sgop1 cmbn) pre-rslt)) (setf mark1 (cdr mark1) mark2 (cdr mark2))) (if (< sgop1 sgop2) (progn (push (-sgm mark1) pre-rslt) (setf mark1 (cdr mark1))) (progn (push (-sgm mark2) pre-rslt) (setf mark2 (cdr mark2)))))))) (make-gamma :degr degr1 :list pre-rslt)))))) #| (setf g1 (gamma-elt 5 1 (cmbn 4 3 'b -5 'd) 3 (cmbn 3 8 'a -7 'c))) (setf g2 (gamma-elt 5 0 (cmbn 5 3 'a 8 'c) 1 (cmbn 4 2 'b 9 'c) 2 (cmbn 4 -5 'a) 3 (cmbn 3 -4 'a 8 'b))) (setf g3 (2GAMMA-ADD #'s-cmpr g1 g2)) (setf g4 (gamma-elt 5 0 (cmbn 5 -3 'a -8 'c) 1 (cmbn 4 -2 'b 8 'c) 3 (cmbn 3 5 'a -8 'b 7 'c))) (setf g5 (2GAMMA-ADD #'s-cmpr g3 g4)) (setf g6 (gamma-elt 5 1 (cmbn 4 -3 'b -17 'c 5 'd) 2 (cmbn 4 5 'a) 3 (cmbn 3 -9 'a))) (2GAMMA-ADD #'s-cmpr g5 g6) |# (defun ADD-SGM-TO-GAMMA (cmpr sgm gmm) (declare (type cmprf cmpr) (type sgm sgm) (type gamma gmm)) (the gamma (with-sgm (sgop sgcm) sgm (declare (fixnum sgop) (type cmbn sgcm)) (with-gamma (degr glist) gmm (declare (fixnum degr) (list glist)) (let ((pre-rslt +empty-list+)) (declare (list pre-rslt)) (do ((mark glist (cdr mark))) ((or (endp mark) (equal nil sgop)) (if sgop (progn (push sgm pre-rslt) (setf pre-rslt (nreverse pre-rslt))) (setf pre-rslt (nreconc pre-rslt mark)))) (declare (list mark)) (with--sgm (sgop2 sgcm2) mark (declare (fixnum sgop2) (type cmbn sgcm2)) (if (= sgop sgop2) (let ((cmbn (2cmbn-add cmpr sgcm sgcm2))) (declare (type cmbn cmbn)) (unless (cmbn-zero-p cmbn) (push (sgm sgop cmbn) pre-rslt)) (setf sgop nil)) (if (< sgop sgop2) (progn (push sgm pre-rslt) (setf sgop nil) (push (-sgm mark) pre-rslt)) (push (-sgm mark) pre-rslt))))) (make-gamma :degr degr :list pre-rslt)))))) #| (setf g1 (gamma-elt 5 1 (cmbn 4 3 'b -5 'd) 3 (cmbn 3 8 'a -7 'c))) (setf g2 (add-sgm-to-gamma cmpr (sgm 7 (cmbn 2 -8 'd)) g1)) (setf g3 (add-sgm-to-gamma cmpr (sgm 7 (cmbn 2 8 'd)) g2)) (setf g4 (add-sgm-to-gamma cmpr (sgm 3 (cmbn 3 -8 'a 7 'c 8 'd)) g2)) (setf g5 (add-sgm-to-gamma cmpr (sgm 11 (cmbn 2 9 'a )) g4)) (setf g6 (add-sgm-to-gamma cmpr (sgm 9 (cmbn 3 8 'b)) g5)) (setf g7 (add-sgm-to-gamma cmpr (sgm 9 (cmbn 3 -8 'b 8 'c)) g6)) (setf g8 (add-sgm-to-gamma cmpr (sgm 9 (cmbn 3 -8 'b )) g6)) |# (DEFUN NSGM-ADD (cmpr degr &rest rest) (declare (type cmprf cmpr) (fixnum degr) (list rest)) (unless rest (return-from nsgm-add (zero-gamma degr))) (the gamma (let ((rslt (list (first rest)))) (declare (list rslt)) (dolist (sgm (rest rest)) (declare (type sgm sgm)) (with-sgm (sgop sgcm) sgm (do ((mark1 rslt (cdr mark1)) (mark2 nil mark1)) ((endp mark1) (setf (cdr mark2) (list sgm))) (ecase (funcall #'f-cmpr sgop (-sgop mark1)) (:less (if mark2 (push sgm (cdr mark2)) (push sgm rslt)) (return)) (:equal (let ((cmbn2 (2cmbn-add cmpr (-sgcm mark1) sgcm))) (setf (-sgcm mark1) cmbn2)) (return)) (:greater ))))) (make-gamma :degr degr :list (flet ((sgm-zero-p (sgm) (let ((sgcm (sgcm sgm))) (cmbn-zero-p sgcm)))) (remove-if #'sgm-zero-p rslt)))))) #| (setf cmpr #'s-cmpr) (setf degr 5) (progn (setf sgm1 (sgm 7 (cmbn 2 3 'a 5 'b))) (setf sgm2 (sgm 4 (cmbn 4 7 'a 8 'c))) (setf sgm3 (sgm 12 (cmbn 3 -5 'a 8 'b))) (setf sgm4 (sgm 4 (cmbn 4 -7 'a 9 'c 12 'd))) (setf sgm5 (sgm 6 (cmbn 3 8 'a))) (setf sgm6 (sgm 12 (cmbn 3 6 'a))) (nsgm-add cmpr degr sgm1 sgm2 sgm3 sgm4 sgm5 sgm6)) (progn (setf sgm1 (sgm 7 (cmbn 2 3 'a 5 'b))) (setf sgm2 (sgm 4 (cmbn 4 7 'a 8 'c))) (setf sgm3 (sgm 12 (cmbn 3 -5 'a 8 'b))) (setf sgm4 (sgm 4 (cmbn 4 -7 'a 9 'c 12 'd))) (setf sgm5 (sgm 6 (cmbn 3 8 'a))) (setf sgm6 (sgm 12 (cmbn 3 6 'a))) (setf sgm7 (sgm 12 (cmbn 3 -6 'a))) (nsgm-add cmpr degr sgm1 sgm2 sgm3 sgm4 sgm5 sgm6 sgm7)) (progn (setf sgm1 (sgm 7 (cmbn 2 3 'a 5 'b))) (setf sgm2 (sgm 4 (cmbn 4 7 'a 8 'c))) (setf sgm3 (sgm 12 (cmbn 3 -5 'a 8 'b))) (setf sgm4 (sgm 4 (cmbn 4 -7 'a 9 'c 12 'd))) (setf sgm5 (sgm 6 (cmbn 3 8 'a))) (setf sgm6 (sgm 12 (cmbn 3 6 'a))) (setf sgm7 (sgm 7 (cmbn 2 -3 'a -5 'b))) (nsgm-add cmpr degr sgm1 sgm2 sgm3 sgm4 sgm5 sgm6 sgm7)) (progn (setf sgm1 (sgm 7 (cmbn 2 3 'a 5 'b))) (setf sgm2 (sgm 7 (cmbn 2 -3 'a -5 'b))) (nsgm-add cmpr degr sgm1 sgm2)) |# (DEFUN SGM-NDGNR (dgop sgm) (declare (fixnum dgop) (type sgm sgm)) (the sgm (with-sgm (sgop sgcm) sgm (sgm (dgop*dgop dgop sgop) sgcm)))) #| (setf sgm (sgm 5 (cmbn 2 5 'a))) (sgm-ndgnr 2 sgm) (sgm-ndgnr 1 sgm) (sgm-ndgnr 5 sgm) |# (DEFUN GAMMA-NDGNR (dgop gmm) (declare (fixnum dgop) (type gamma gmm)) (the gamma (with-gamma (degr glist) gmm (let ((pre-rslt (mapcar #'(lambda (sgm) (sgm-ndgnr dgop sgm)) glist)) (degr2 (+ degr (length (dgop-int-ext dgop))))) (make-gamma :degr degr2 :list pre-rslt))))) #| (setf g (gamma-elt 5 3 (cmbn 3 7 'a) 11 (cmbn 2 -4 'b))) (gamma-ndgnr 2 g) (gamma-ndgnr 8 g) (gamma-ndgnr 3 g) |# ;; FUNCTIONS FOR THE CONSTRUCTION OF THE SIMPLICIAL ABELIAN GROUP ;; \GAMMA(C) (DEFUN GAMMA-TO-ABSM (gmm) (declare (type gamma gmm)) (the absm (with-gamma (degr glist) gmm (declare (fixnum degr) (list glist)) (if (endp glist) (let ((dgop (dgop-ext-int (reverse (= dgop1-ext indx) (let ((smhmt-i (rslt indx (1- dmns) (sgm dgop2 sgcm)))) (declare (type gamma smhmt-i)) (gamma-ndgnr (dgop-ext-int (list (1+ dgop1-ext))) smhmt-i)) (let ((smhmt-i-1 (rslt (1- indx) (1- dmns) sgm2))) (declare (type gamma smhmt-i-1)) (gamma-ndgnr (dgop-ext-int (list dgop1-ext)) smhmt-i-1))))))))) (the hintr #'rslt))) #| (setf d3 (delta 3)) (setf d (dffr d3)) (setf h (lh (efhm d3))) (setf cmpr #'f-cmpr) (setf sgm-smhmt (sgm-hintr cmpr h d)) (setf sgm (sgm 5 (cmbn 3 -7 15))) (dotimes (indx 6) (print (funcall sgm-smhmt indx 5 sgm))) (setf sgm2 (sgm 11 (cmbn 2 7 7))) (dotimes (indx 6) (print (funcall sgm-smhmt indx 5 sgm2))) |# (defun gamma-hintr (cmpr h d) (declare (type morphism h d) (type cmprf cmpr)) (let ((s-hintr (sgm-hintr cmpr h d))) (flet ((rslt (indx dmns gmsm) (declare (type fixnum indx dmns) (type gamma gmsm)) (let ((rslt (gamma-elt (1+ dmns)))) (do ((mark (gamma-list gmsm) (cdr mark))) ((endp mark) (gamma-to-absm rslt)) (setf rslt (2gamma-add cmpr rslt (funcall s-hintr indx dmns (-sgm mark)))))))) (the hintr #'rslt)))) #| (setf d3 (delta 3)) (setf d (dffr d3)) (setf h (lh (efhm d3))) (setf gmm (gamma-elt 5 5 (cmbn 3 -7 15) 11 (cmbn 2 7 7))) (setf cmpr #'f-cmpr) (setf g-hintr (gamma-hintr cmpr h d)) (dotimes (indx 6) (print (funcall g-hintr indx 5 gmm))) |# (defun gamma-hmtp (h) (declare (type morphism h)) (the simplicial-hmtp (let* ((cc (sorc h)) (gamma-cc (gamma-chcm cc)) (degr (degr h)) (cmpr (cmpr cc)) (dffr (dffr cc)) (orgn (orgn cc))) (declare (type chain-complex cc) (type ab-simplicial-group gamma-cc) (fixnum degr) (type cmprf cmpr) (type morphism dffr)) (unless (= degr 1) (error "In GAMMA-HMTP, the morphism has degree ~D different to +1." degr)) (build-smhmt :sorc gamma-cc :trgt gamma-cc :degr 1 :hintr (gamma-hintr cmpr h dffr) :orgn `(GAMMA ,orgn))))) #| (setf d3 (delta 3)) (setf h (lh (efhm d3))) (setf gamma-h (gamma-hmtp h)) (setf gmm (gamma-elt 5 5 (cmbn 3 -7 15) 11 (cmbn 2 7 7))) (dotimes (i 6) (print (? gamma-h i 5 gmm)) ) (setf i 0) (? gamma-h i 5 gmm) (? gamma-h 5 gmm) |# #| (defun deltan-h (n) (the morphism (let ((delta-n (delta n))) (build-mrph :sorc delta-n :trgt delta-n :degr +1 :intr #'(lambda (degr gmsm) (if (oddp gmsm) (zero-cmbn (1+ degr)) (term-cmbn (1+ degr) 1 (1+ gmsm)))) :strt :gnrt :orgn `(homotopy for delta ,n))))) (setf h5 (deltan-h 5)) (? h5 3 15) (? h5 3 30) (? h5 3 39) (setf gmm-d5-h (gamma-hmtp h5)) (setf g1 (gamma-elt 3 0 (cmbn 3 1 15))) (dotimes (indx 4) (print (? gmm-d5-h indx 3 g1))) (setf g2 (gamma-elt 3 0 (cmbn 3 1 46))) (dotimes (indx 4) (print (? gmm-d5-h indx 3 g2))) (setf g3 (gamma-elt 5 5 (cmbn 3 -7 15))) (dotimes (indx 6) (print (? gmm-d5-h indx 5 g3))) (dotimes (i 6) (dotimes (j 7) (format t "i= ~D, j= ~D" i j) (print (? gmm-d5-h j 6 (? gmm-d3-h i 5 g3))))) (setf g4 (gamma-elt 5 11 (cmbn 2 1 14))) (dotimes (indx 6) (print (? gmm-d5-h indx 5 g4))) (setf g5 (2gamma-add #'f-cmpr g3 g4)) (dotimes (indx 6) (print (? gmm-d5-h indx 5 g5))) (setf g6 (2gamma-add #'f-cmpr g5 (gamma-elt 5 0 (cmbn 5 2 63)))) (dotimes (indx 6) (print (? gmm-d5-h indx 5 g6))) |# (defun gamma-rdct (rdct) (declare (type reduction rdct)) (the reduction (let ((f (f rdct)) (g (g rdct)) (h (h rdct)) (orgn (orgn rdct))) (declare (type morphism f g h) (list orgn)) (build-rdct :f (gamma-mrph f) :g (gamma-mrph g) :h (gamma-hmtp h) :orgn `(gamma ,orgn))))) #| (setf d3 (delta 3)) (setf rdct (lrdct (efhm d3))) (setf grdct (gamma-rdct rdct)) (setf d5 (delta 5)) (setf z (z-chcm)) (setf f (build-mrph :sorc d5 :trgt z :degr 0 :intr #'(lambda (dmns gnrt) (if (and (= dmns 0) (= gnrt 1)) (cmbn 0 1 :zgnrt) (cmbn dmns))) :strt :gnrt :orgn `(trivial-morphism from ,d5 to ,z))) (setf g (build-mrph :sorc z :trgt d5 :degr 0 :intr #'(lambda (dmns gnrt) (if (equal gnrt :z-gnrt) (cmbn 0 1 1) (cmbn dmns))) :strt :gnrt :orgn `(trivial-morphism from ,z to ,d5))) (setf h (deltan-h 5)) (setf rdct5 (build-rdct :f f :g g :h h :orgn `(contraction-homotopy ,d5))) (setf grdct5 (gamma-rdct rdct5)) (pre-check-rdct grdct5) (setf *tc* (cmbn 5 1 (gamma-elt 5 0 (cmbn 5 2 63) 5 (cmbn 3 -7 15) 11 (cmbn 2 1 14)))) (setf *bc* (cmbn 0 1 (gamma-elt 0 0 (cmbn 0 1 :z-gnrt)))) (check-rdct) (setf *tc* (cmbn 3 1 (gamma-elt 3 0 (cmbn 3 -6 27 2 43) 5 (cmbn 1 8 9) 7 (cmbn 0 7 8 1 32)) 6 (gamma-elt 3 0 (cmbn 3 1 15) 5 (cmbn 1 -7 5 6 18) 6 (cmbn 1 6 12 -3 18 4 20) 7 (cmbn 0 8 16 -3 32)) )) (check-rdct) |# (DEFMETHOD GAMMA ((chcm chain-complex)) (gamma-chcm chcm)) (DEFMETHOD GAMMA ((rdct reduction)) (gamma-rdct rdct))