;;;  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1
;;;  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1
;;;  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1  K-PI-1

(IN-PACKAGE "COMMON-LISP-USER")

(PROVIDE "k-pi-1")

(DEFUN K-Z-1-CMPR (gnrt1 gnrt2)
   (declare (list gnrt1 gnrt2))
   (the cmpr
   (do ((mark1 gnrt1 (cdr mark1))
    (mark2 gnrt2 (cdr mark2)))
       ((endp mark1) :equal)
       (case (f-cmpr (car mark1) (car mark2))
      (:equal)
      (:less (return-from k-z-1-cmpr :less))
      (:greater (return-from k-z-1-cmpr :greater))))))

#|
  (k-z-1-cmpr '(1 1 2) '(1 2 2))
  (k-z-1-cmpr '(1 1 2) '(1 1 2))
  (k-z-1-cmpr '(1 1 2) '(1 1 -1))
|#

(DEFUN K-Z-1-FACE (indx dmns gmsm)
   (declare
      (fixnum indx dmns)
      (list gmsm))
   (the absm
   (cond ((zerop indx) (absm 0 (rest gmsm)))
     ((= indx dmns) (absm 0 (butlast gmsm)))
     (t
      (do ((rslt +empty-list+ (cons (car mark) rslt))
           (mark gmsm (cdr mark))
           (i 1 (1+ i)))
          ((= i indx) (let ((new-k (+ (car mark) (cadr mark))))
                (declare (fixnum new-k))
                (if (zerop new-k)
                   (absm (2-exp (1- indx)) (nreconc rslt (cddr mark)))
                   (absm 0 (nreconc rslt (cons new-k (cddr mark)))))))
         (declare
            (list rslt mark)
        (fixnum i)))))))

#|
  (k-z-1-face 0 1 '(3))
  (k-z-1-face 1 1 '(3))
  (k-z-1-face 0 3 '(1 2 3))
  (k-z-1-face 1 3 '(1 2 3))
  (k-z-1-face 2 3 '(1 2 3))
  (k-z-1-face 2 3 '(1 2 -2))
  (k-z-1-face 3 3 '(1 2 3))
|#

(DEFUN Z-ABSM-BAR (absm)
  (declare (type absm absm))
  (the list
    (with-absm (dgop bar1) absm
      (do ((dgop dgop (ash dgop -1))
       (rslt +empty-list+))
      ((and (zerop dgop) (endp bar1)) (nreverse rslt))
      (declare
         (fixnum dgop)
         (list rslt))
      (push (if (oddp dgop)
            0
          (pop bar1))
        rslt)))))

#|
  (z-absm-bar (absm 0 '()))
  (z-absm-bar (absm 1 '()))
  (z-absm-bar (absm 0 '(2)))
  (dotimes (i 8)
    (print (z-absm-bar (absm i '(3 6)))))
|#

(DEFUN Z-BAR-ABSM (bar)
  (declare (list bar))
  (the absm
     (do ((rslt-dgop 0)
      (rslt-bar +empty-list+)
      (mark bar (cdr mark))
      (bark 1 (+ bark bark)))
     ((endp mark) (absm rslt-dgop (nreverse rslt-bar)))
    (declare
       (fixnum rslt-dgop bark)
       (list rslt-bar mark))
    (let ((k-i (car mark)))
      (declare (fixnum k-i))
      (if (zerop k-i)
         (incf rslt-dgop bark)
         (push k-i rslt-bar))))))

#|
  (z-bar-absm (z-absm-bar (absm 0 '())))
  (z-bar-absm (z-absm-bar (absm 1 '())))
  (z-bar-absm (z-absm-bar (absm 0 '(2))))
  (dotimes (i 8)
    (print (z-bar-absm (z-absm-bar (absm i '(3 6))))))
|#

(DEFUN K-Z-1-GRML (dmns crpr)
   (declare
      (fixnum dmns)
      (type crpr crpr))
   (the absm
      (with-crpr (dgop1 bar1 dgop2 bar2) crpr
     (do ((indx 1 (1+ indx))
          (dgop1 dgop1 (ash dgop1 -1))
          (dgop2 dgop2 (ash dgop2 -1))
          (bark 1 (ash bark +1))
          (rslt-dgop 0)
          (rslt-bar +empty-list+))
         ((> indx dmns) (absm rslt-dgop (nreverse rslt-bar)))
         (declare
            (fixnum indx dgop1 dgop2 bark rslt-dgop)
        (list rslt-bar))
         (let ((item (if (evenp dgop1)
                 (if (evenp dgop2)
                 (+ (pop bar1) (pop bar2))
                   (pop bar1))
               (if (evenp dgop2)
                   (pop bar2)
                 0))))
           (declare (fixnum item))
           (if (zerop item)
           (incf rslt-dgop bark)
         (push item rslt-bar)))))))

#|
  (k-z-1-grml 0 (crpr 0 nil 0 nil))
  (k-z-1-grml 1 (crpr 0 '(3) 0 '(4)))
  (k-z-1-grml 1 (crpr 0 '(3) 0 '(-3)))
  (k-z-1-grml 1 (crpr 0 '(3) 1 '()))
  (k-z-1-grml 1 (crpr 1 '() 0 '(3)))
  (k-z-1-grml 1 (crpr 1 '() 1 '()))
  (k-z-1-grml 5 (crpr 24 '(2 2 3) 20 '(-2 2 4)))
|#

(DEFUN K-Z-1-GRIN (dmns bar)
  (declare
     (ignore dmns)
     (list bar))
  (the absm
     (absm 0 (mapcar #'- bar))))

#|
  (k-z-1-grin 3 '(2 3 -4))
  (setf gmsm '(2 3 -4))
  (k-z-1-grml 3 (crpr 0 gmsm 0 (gmsm (k-z-1-grin 3 gmsm))))
|#

#|
(DEFUN K-Z-1-KFLL (indx dmns hat)
  (declare
     (fixnum indx dmns)
     (list hat))
  (the absm
     (cond ((= 1 dmns)
        (absm 1 +empty-list+))
       ((zerop indx)
        (let ((del-1 (first hat))
          (del-2 (second hat)))
          (declare (type absm del-1 del-2))
          (with-absm (dgop1 bar1) del-1
          (with-absm (dgop2 bar2) del-2
         (let ((bar01 (if (oddp dgop2)
                 0
                 (first bar2)))
               (bar02 (if (oddp dgop1)
                 0
                 (first bar1))))
           (declare (fixnum bar01 bar02))
           (let ((bar12 (- bar02 bar01)))
             (declare (fixnum bar02))
             (if (zerop bar01)
            (1dgnr 0 del-1)
                (if (zerop bar12)
               (1gnr 1 del-1)
               (let (del-01 (k-z-1-face 0 (1- dmns)
                            del-1))
                 (declare (type absm del-01))
                 (with-absm (dgop01 gmsm01) del-01
                (absm (* 4 dgop01)
                      (cons bar01
                        (cons bar02 gmsm01)))))))))))))
       ((= 1 indx)
        (let ((del-0 (first hat))
          (del-2 (second hat)))
          (declare (type absm del-0 del-2))
          (with-absm (dgop0 gmsm0) del-0
          (with-absm (dgop2 gmsm2) del-2
         (if (oddp dgop2 )))))))))

|#

(DEFUN K-Z-1 ()
  (the ab-simplicial-group
     (build-ab-smgr
        :cmpr #'k-z-1-cmpr
    :basis :locally-effective
    :bspn +empty-list+
    :face #'k-z-1-face
    :sintr-grml #'k-z-1-grml
    :sintr-grin #'k-z-1-grin
    :orgn '(k-z-1))))

#|
  (setf k (k-z-1))
  (defun aleat-list (max length)
     (let ((rslt nil)
           (2max (+ max max)))
        (dotimes (i length)
           (push (let ((k (- (random 2max) max)))
                    (if (zerop k)
                       max
                       k))
              rslt))
        rslt))
  (? k (? k 14 (aleat-list 200 14)))
  (setf zero? (add (idnt-mrph k) (grin k)))
  (? zero? 14 (aleat-list 200 14))
|#

(DEFUN K-Z (n)
   (declare (fixnum n))
   (the ab-simplicial-group
      (if (= n 1)
         (k-z-1)
         (classifying-space (k-z (1- n))))))

(DEFUN CIRCLE-CMPR (gnrt1 gnrt2)
   (declare (ignore gnrt1 gnrt2))
   (the cmpr :equal))

(DEFUN CIRCLE-BASIS (dmns)
   (declare (fixnum dmns))
   (the list
      (case dmns
     (0 '(*))
     (1 '(s1))
     (otherwise +empty-list+))))

(DEFUN CIRCLE ()
   (the chain-complex
      (build-chcm
         :cmpr #'circle-cmpr
     :basis #'circle-basis
     :bsgn '*
     :intr-dffr #'zero-intr-dffr
     :strt :cmbn
     :orgn '(circle))))

#|
  (setf c (circle))
  (cmpr c '* '*)
  (basis c 1)
  (? c 1 's1)
|#

(DEFUN KZ1-RDCT-F-INTR (cmbn)
  (declare (type cmbn cmbn))
  (the cmbn
     (with-cmbn (degr list) cmbn
    (case degr
       (0 (if list
         (term-cmbn 0 (-cffc list) '*)
         (zero-cmbn 0)))
       (1 (let ((rslt
             (apply #'+
            (mapcar
             #'(lambda (term)
                 (declare (type term term))
                 (with-term (cffc gnrt) term
                    (the fixnum (* cffc
                               (first gnrt)))))
             list))))
        (if (zerop rslt)
            (zero-cmbn 1)
          (term-cmbn 1 rslt 's1))))
       (otherwise (zero-cmbn degr))))))

#|
  (kz1-rdct-f-intr (cmbn 0))
  (kz1-rdct-f-intr (cmbn 0 4 '()))
  (kz1-rdct-f-intr (cmbn 1))
  (kz1-rdct-f-intr (cmbn 1 4 '(3)))
  (kz1-rdct-f-intr (cmbn 1 4 '(3) 5 '(2)))
  (kz1-rdct-f-intr (cmbn 1 4 '(3) -3 '(4)))
  (kz1-rdct-f-intr (cmbn -3))
|#

(DEFUN KZ1-RDCT-F ()
  (the morphism
     (build-mrph
        :sorc (k-z-1)
    :trgt (circle)
    :degr 0
    :intr #'kz1-rdct-f-intr
    :strt :cmbn
    :orgn '(kz1-rdct-f))))

(DEFUN KZ1-RDCT-G-INTR (cmbn)
  (declare (type cmbn cmbn))
  (the cmbn
     (with-cmbn (degr list) cmbn
    (if list
        (ecase degr
           (0 (term-cmbn 0 (-cffc list) +empty-list+))
           (1 (term-cmbn 1 (-cffc list) (list 1))))
      (zero-cmbn degr)))))

(DEFUN KZ1-RDCT-G ()
  (the morphism
     (build-mrph
        :sorc (circle)
    :trgt (k-z-1)
    :degr 0
    :intr #'kz1-rdct-g-intr
    :strt :cmbn
    :orgn '(kz1-rdct-g))))

(DEFUN KZ1-RDCT-H-INTR (dmns bar)
  (declare
     (fixnum dmns)
     (list bar))
  (the cmbn
     (progn
       (when (zerop dmns)
      (return-from kz1-rdct-h-intr (zero-cmbn +1)))
       (let ((k1 (first bar))
         (tail (rest bar)))
     (declare
        (fixnum k1)
        (list tail))
     (if (plusp k1)
        (do ((rslt +empty-list+
               (cons (term -1
                   (cons 1 (cons i tail)))
                 rslt))
         (i (1- k1) (1- i)))
        ((zerop i) (make-cmbn :degr (1+ dmns)
                      :list rslt))
           (declare
          (list rslt)
          (fixnum i)))
        (do ((rslt +empty-list+
               (cons (term +1
                   (cons 1 (cons i tail)))
                 rslt))
         (i -1 (1- i)))
        ((< i k1) (make-cmbn :degr (1+ dmns)
                     :list rslt))))))))

#|
  (kz1-rdct-h-intr 0 nil)
  (kz1-rdct-h-intr 1 '(-4))
  (kz1-rdct-h-intr 1 '(-1))
  (kz1-rdct-h-intr 1 '(1))
  (kz1-rdct-h-intr 1 '(4))
  (kz1-rdct-h-intr 3 '(-4 3 5))
  (kz1-rdct-h-intr 3 '(-1 3 -1))
  (kz1-rdct-h-intr 3 '(1 2 2))
  (kz1-rdct-h-intr 3 '(4 3 5))
|#

(DEFUN KZ1-RDCT-H ()
  (the morphism
     (build-mrph
        :sorc (k-z-1)
    :trgt (k-z-1)
    :degr +1
    :intr #'kz1-rdct-h-intr
    :strt :gnrt
    :orgn '(kz1-rdct-h))))

(DEFUN KZ1-RDCT ()
  (the reduction
     (build-rdct
        :f (kz1-rdct-f)
    :g (kz1-rdct-g)
    :h (kz1-rdct-h)
    :orgn '(kz1-rdct))))

#|
  (pre-check-rdct (kz1-rdct))
  (setf *tc* (cmbn 0 1 '()))
  (setf *bc* (cmbn 0 1 '*))
  (check-rdct)
  (setf *tc* (cmbn 1 1 '(-4) 10 '(-1) 100 '(1) 1000 '(5)))
  (setf *bc* (cmbn 1 1 's1))
  (check-rdct)
  (setf *tc* (cmbn 2 1 '(-4 2) 10 '(-1 3) 100 '(1 -4) 1000 '(5 5)))
  (check-rdct)
  (setf *tc* (cmbn 3 1 '(-4 -4 5) 10 '(-1 2 1)
                     100 '(1 4 2) 1000 '(5 1 -1)))
  (check-rdct)
|#

(DEFUN KZ1-EFHM ()
  (the homotopy-equivalence
     (build-hmeq
        :lrdct (trivial-rdct (k-z-1))
    :rrdct (kz1-rdct)
    :orgn '(kz1-efhm))))

(DEFMETHOD SEARCH-EFHM (k-z-1 (orgn (eql 'k-z-1)))
  (declare (ignore k-z-1))
  (kz1-efhm))

#|
  (cat-init)
  (homology (k-z-1) 1)
|#

(DEFUN K-Z2-1-GRML-INTR (dmns crpr)
  (declare
     (fixnum dmns)
     (type crpr crpr))
  (the absm
     (with-crpr (dgop1 gmsm1 dgop2 gmsm2) crpr
    (declare (ignore gmsm1 gmsm2))
    (let ((dgop (- (mask dmns) (logxor dgop1 dgop2))))
      (declare (fixnum dgop))
      (absm dgop (- dmns (logcount dgop)))))))

(DEFUN K-Z2-1-GRML ()
  (the simplicial-mrph
     (build-smmr
        :sorc (crts-prdc (r-proj-space) (r-proj-space))
    :trgt (r-proj-space)
    :degr 0
    :sintr #'k-z2-1-grml-intr
    :orgn '(k-z2-1-grml))))

(DEFUN K-Z2-1-GRIN-INTR (dmns gmsm)
  (declare
     (ignore dmns)
     (fixnum gmsm))
  (the absm
     (absm 0 gmsm)))

(DEFUN K-Z2-1-GRIN ()
  (the simplicial-mrph
     (build-smmr
        :sorc (r-proj-space)
    :trgt (r-proj-space)
    :degr 0
    :sintr #'k-z2-1-grin-intr
    :intr #'identity
    :strt :cmbn
    :orgn '(k-z2-1-grin))))

(DEFUN K-Z2-1 ()
  (the ab-simplicial-group
     (let ((rslt (r-proj-space)))
       (declare (type simplicial-set rslt))
       (change-class rslt 'ab-simplicial-group)
       (setf (slot-value rslt 'grml)
         (k-z2-1-grml)
         (slot-value rslt 'grin)
         (k-z2-1-grin))
       (pushnew rslt *smgr-list*)
       rslt)))

#|
  (setf k (k-z2-1))
  (homology k 0 4)
|#

(DEFUN K-Z2 (n)
   (declare (fixnum n))
   (the ab-simplicial-group
      (if (= n 1)
         (k-z2-1)
         (classifying-space (k-z2 (1- n))))))

#|
  (setf k3 (k-z2 3))
  (homology k3 7)
|#

(DEFUN Z2-ABSM-BAR (absm)
  (declare (type absm absm))
  (the list
     (with-absm (dgop gmsm) absm
       (do ((bmark (1- (+ (logcount dgop) gmsm)) (1- bmark))
        (rslt +empty-list+
          (cons (if (logbitp bmark dgop)
                0 1)
            rslt)))
       ((minusp bmark) rslt)
      (declare
         (fixnum bmark)
         (list rslt))))))

(DEFUN Z2-BAR-ABSM (bar)
  (declare (list bar))
  (the absm
     (do ((dgop 0)
      (2-pwr 1 (+ 2-pwr 2-pwr))
      (gmsm 0)
      (mark bar (cdr mark)))
     ((endp mark) (absm dgop gmsm))
    (declare
       (fixnum dgop 2-pwr gmsm)
       (list mark))
    (if (zerop (car mark))
       (incf dgop 2-pwr)
       (incf gmsm)))))

#|
  (dotimes (i 8)    ;;; not really legal
  (dotimes (j 8)
    (print (z2-bar-absm (z2-absm-bar (absm i j))))))
|#


(DEFUN HOPF-FIBRATION-SINTR (n)
  (declare (fixnum n))
  (flet ((rslt (dmns gmsm)
       (declare (ignore dmns gmsm))
       (if (zerop n)
          (absm 1 +empty-list+)
          (absm 0 (list n)))))
     (the sintr #'rslt)))

(DEFUN HOPF-FIBRATION (n)
  (declare (fixnum n))
  (the simplicial-mrph
     (build-smmr
        :sorc (sphere 2)
    :trgt (k-z-1)
    :degr -1
    :sintr (hopf-fibration-sintr n)
    :orgn `(hopf-fibration ,n))))

(DEFUN Z-FUNDAMENTAL-GMSM (dmns pi-elm)   ;;; pi-elm not equal to 0
   (declare (fixnum dmns pi-elm))
   (the gmsm
      (if (= 1 dmns)
         (list pi-elm)
         (let ((bspn (if (= 2 dmns) +empty-list+ +null-gbar+)))
            (declare (type gmsm bspn))
            (make-gbar :dmns dmns
               :list (cons (absm 0 (z-fundamental-gmsm (1- dmns) pi-elm))
                        (mapcar
                           #'(lambda (k)
                                (declare (fixnum k))
                                (absm (mask k) bspn))
                           (nreverse ( 0 (- dmns 2))))))))))

#|
  (z-fundamental-gmsm 1 33)
  (z-fundamental-gmsm 2 33)
  (z-fundamental-gmsm 3 33)
  (z-fundamental-gmsm 4 33)
|#

(DEFUN INTERESTING-FACES (face small-dmns high-dmns gmsm)
  (declare
    (type face face)
    (fixnum small-dmns high-dmns)
    (type gmsm gmsm))
  (the list
    (let ((max (mask high-dmns)))
      (declare (fixnum max))
      (if (= small-dmns high-dmns)
     (list (cons max (absm 0 gmsm)))
     (do ((prev-list (interesting-faces face (1+ small-dmns) high-dmns gmsm))
          (k (1- max) (1- k))
          (rslt +empty-list+)
          (count (binomial-n-p high-dmns small-dmns)))
         ((zerop count) rslt)
         (declare
           (list prev-list rslt)
           (fixnum k count))
        (when (= small-dmns (logcount k))
          (decf count)
          (do ((i 0 (1+ i)))
              ((not (logbitp i k))
           (push (cons k
                   (a-face4 face
                    (- small-dmns -1
                       (if (= i (integer-length k)) (1+ i) i))
                    (1+ small-dmns)
                    (cdr (assoc (+ k (2-exp i)) prev-list))))
             rslt)))))))))

#|
  (setf d (delta 14))
  (setf f (face d))
  (do ((i 5 (1- i)))
      ((minusp i))
    (print (interesting-faces f i 5 (mask 6))))
|#

(DEFUN GMSM-COCYCLE (face small-dmns high-dmns gmsm chml-clss)
  (declare
    (type face face)
    (fixnum small-dmns high-dmns)
    (type gmsm gmsm)
    (type morphism chml-clss))
  (the list
    (let ((int-faces (interesting-faces face small-dmns high-dmns gmsm)))
      (declare (list int-faces))
      (mapc
        #'(lambda (cons)
        (declare (cons cons))
        (setf (cdr cons)
          (let ((absm (cdr cons)))
            (declare (type absm absm))
            (with-absm (dgop gmsm2) absm
              (if (plusp dgop)
             0
            (let ((cmbn-list (cmbn-list (gnrt-? chml-clss
                         small-dmns gmsm2))))
              (declare (list cmbn-list))
              (if cmbn-list
                  (-cffc cmbn-list)
                0)))))))
        int-faces)
      int-faces)))

#|
  (cat-init)
  (setf d (delta 10))
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -2
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 gmsm :gnrt-z))
                :strt :gnrt
                :orgn '(essai-1)))
  (gmsm-cocycle (face d) 2 4 31 chml-clss)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -1
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 gmsm :gnrt-z))
                :strt :gnrt
                :orgn '(essai-2)))
  (gmsm-cocycle (face d) 1 4 31 chml-clss)
|#

(DEFUN Z-COCYCLE-GBAR (n dmns cocycle)
  ;; cocycle \in Z^n(\Delta^{dmns}, \pi) with \pi = Z
  (declare
    (fixnum n dmns)
    (list cocycle))
  (the absm
    (cond ((= n 1)
       (z-bar-absm (nreverse (mapcar #'cdr cocycle))))
      ((= n dmns)
       (let ((value (cdr (first cocycle))))
         (declare (fixnum value))
         (if (zerop value)
        (absm (mask dmns) +null-gbar+)
            (absm 0 (z-fundamental-gmsm dmns value)))))
      (t
       (let ((cocycle1 +empty-list+)
         (cocycle2 +empty-list+))
         (declare (list cocycle1 cocycle2))
         (dolist (cons cocycle)
           (declare (cons cons))
           (if (evenp (car cons))
          (push (cons (ash (car cons) -1) (cdr cons))
            cocycle1)
          (push (cons (ash (car cons) -1) (cdr cons))
            cocycle2)))
         (setf cocycle1 (nreverse cocycle1)
           cocycle2 (nreverse cocycle2))
         (mapc
           #'(lambda (cons)
           (declare (cons cons))
           (when (evenp (car cons))
             (decf (cdr cons)
               (cdr (assoc (1+ (car cons)) cocycle1)))))
           cocycle2)
         (let ((head-absm (z-cocycle-gbar (1- n) (1- dmns) cocycle2))
           (tail-absm (z-cocycle-gbar n (1- dmns) cocycle1)))
           (declare (type absm head-absm tail-absm))
           (normalize-gbar
         (cons dmns
               (cons head-absm
                 (rest (unnormalize-gbar tail-absm
                     (if (= n 2) () +null-gbar+))))))))))))

#|
  (cat-init)
  (setf d (delta 10))
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -1
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 gmsm :gnrt-z))
                :strt :gnrt
                :orgn '(essai-1)))
  (gmsm-cocycle (face d) 1 4 31 chml-clss)
  (z-cocycle-gbar 1 4 *)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -2
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 gmsm :gnrt-z))
                :strt :gnrt
                :orgn '(essai-2)))
  (gmsm-cocycle (face d) 2 2 7 chml-clss)
  (z-cocycle-gbar 2 2 *)
  (gmsm-cocycle (face d) 2 2 0 chml-clss) ;; normally illegal
  (z-cocycle-gbar 2 2 *)
  (gmsm-cocycle (face d) 2 3 15 chml-clss)
  (z-cocycle-gbar 2 3 *)
  (gmsm-cocycle (face d) 2 4 31 chml-clss)
  (z-cocycle-gbar 2 4 *)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -3
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 gmsm :gnrt-z))
                :strt :gnrt
                :orgn '(essai-3)))
  (gmsm-cocycle (face d) 3 4 31 chml-clss)
  (z-cocycle-gbar 3 4 *)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -3
                :intr #'(lambda (dmns gmsm)
                          (zero-cmbn 0))
                :strt :gnrt
                :orgn '(essai-33)))
  (gmsm-cocycle (face d) 3 4 31 chml-clss)
  (z-cocycle-gbar 3 4 *)
|#

(DEFUN Z-COCYCLE-GBAR-HEAD (n dmns cocycle)
  ;; cocycle \in Z^n(\Delta^{dmns}, \pi) with \pi = Z
  (declare
    (fixnum n dmns)
    (list cocycle))
  (the absm
    (cond ((= n 1)
       (error "In Z-COCYCLE-GBAR-HEAD, this point should not have been reached."))
       ; (z-bar-absm (nreverse (mapcar #'cdr cocycle))))
      ((= n dmns)
       (let ((value (cdr (first cocycle))))
         (declare (fixnum value))
         (if (zerop value)
        (if (= n 2)
           (absm 1 +empty-list+)
           (absm (mask (1- dmns)) +null-gbar+))
           (absm 0 (z-fundamental-gmsm (1- dmns) value)))))
      (t
       (let ((cocycle1 +empty-list+)
         (cocycle2 +empty-list+))
         (declare (list cocycle1 cocycle2))
         (dolist (cons cocycle)
           (declare (cons cons))
           (if (evenp (car cons))
          (push (cons (ash (car cons) -1) (cdr cons))
            cocycle1)
          (push (cons (ash (car cons) -1) (cdr cons))
            cocycle2)))
         (setf cocycle1 (nreverse cocycle1)
           cocycle2 (nreverse cocycle2))
         (mapc
           #'(lambda (cons)
           (declare (cons cons))
           (when (evenp (car cons))
             (decf (cdr cons)
               (cdr (assoc (1+ (car cons)) cocycle1)))))
           cocycle2)
         (z-cocycle-gbar (1- n) (1- dmns) cocycle2))))))

#|
  (cat-init)
  (setf d (delta 10))
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -1
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 gmsm :gnrt-z))
                :strt :gnrt
                :orgn '(essai-1)))
  (gmsm-cocycle (face d) 1 4 31 chml-clss)
  (z-cocycle-gbar 1 4 *)
  (z-cocycle-gbar-head 1 4 **)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -2
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 gmsm :gnrt-z))
                :strt :gnrt
                :orgn '(essai-2)))
  (gmsm-cocycle (face d) 2 2 7 chml-clss)
  (z-cocycle-gbar 2 2 *)
  (z-cocycle-gbar-head 2 2 **)
  (gmsm-cocycle (face d) 2 2 0 chml-clss) ;; normally illegal
  (z-cocycle-gbar 2 2 *)
  (z-cocycle-gbar-head 2 2 **)
  (gmsm-cocycle (face d) 2 3 15 chml-clss)
  (z-cocycle-gbar 2 3 *)
  (z-cocycle-gbar-head 2 3 **)
  (gmsm-cocycle (face d) 2 4 31 chml-clss)
  (z-cocycle-gbar 2 4 *)
  (z-cocycle-gbar-head 2 4 **)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -3
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 gmsm :gnrt-z))
                :strt :gnrt
                :orgn '(essai-3)))
  (gmsm-cocycle (face d) 3 4 31 chml-clss)
  (z-cocycle-gbar 3 4 *)
  (z-cocycle-gbar-head 3 4 **)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -3
                :intr #'(lambda (dmns gmsm)
                          (zero-cmbn 0))
                :strt :gnrt
                :orgn '(essai-33)))
  (gmsm-cocycle (face d) 3 4 31 chml-clss)
  (z-cocycle-gbar 3 4 *)
  (z-cocycle-gbar-head 3 4 **)
|#

(DEFUN Z2-FUNDAMENTAL-GMSM (dmns pi-elm)  ;; pi-elm not "equal" to 0, therefore 1.
   (declare (fixnum dmns pi-elm))
   (the gmsm
      (if (= 1 dmns)
         1
         (let ((bspn (if (= 2 dmns) 0 +null-gbar+)))
            (declare (type gmsm bspn))
            (make-gbar :dmns dmns
               :list (cons (absm 0 (Z2-fundamental-gmsm (1- dmns) pi-elm))
                        (mapcar
                           #'(lambda (k)
                                (declare (fixnum k))
                                (absm (mask k) bspn))
                           (nreverse ( 0 (- dmns 2))))))))))

#|
  (Z2-fundamental-gmsm 1 1)
  (Z2-fundamental-gmsm 2 1)
  (Z2-fundamental-gmsm 3 1)
  (Z2-fundamental-gmsm 4 1)
|#

(DEFUN Z2-COCYCLE-GBAR (n dmns cocycle)
  ;; cocycle \in Z^n(\Delta^{dmns}, \pi) with \pi = Z/2Z
  (declare
    (fixnum n dmns)
    (list cocycle))
  (the absm
    (progn
      (mapc
        #'(lambda (cons)
        (declare (cons cons))
        (setf (cdr cons)
          (if (evenp (cdr cons)) 0 1)))
        cocycle)
      (cond ((= n 1)
         (z2-bar-absm (nreverse (mapcar #'cdr cocycle))))
        ((= n dmns)
         (let ((value (cdr (first cocycle))))
           (declare (fixnum value))
           (if (zerop value)
           (absm (mask dmns) +null-gbar+)
         (absm 0 (z2-fundamental-gmsm dmns value)))))
        (t
         (let ((cocycle1 +empty-list+)
           (cocycle2 +empty-list+))
           (declare (list cocycle1 cocycle2))
           (dolist (cons cocycle)
         (declare (cons cons))
         (if (evenp (car cons))
             (push (cons (ash (car cons) -1) (cdr cons))
               cocycle1)
           (push (cons (ash (car cons) -1) (cdr cons))
             cocycle2)))
           (setf cocycle1 (nreverse cocycle1)
             cocycle2 (nreverse cocycle2))
           (mapc
        #'(lambda (cons)
            (declare (cons cons))
            (when (evenp (car cons))
              (setf (cdr cons)
                (mod (- (cdr cons)
                    (cdr (assoc (1+ (car cons)) cocycle1)))
                     2))))
        cocycle2)
           (let ((head-absm (z2-cocycle-gbar (1- n) (1- dmns) cocycle2))
             (tail-absm (z2-cocycle-gbar n (1- dmns) cocycle1)))
         (declare (type absm head-absm tail-absm))
         (normalize-gbar
          (cons dmns
            (cons head-absm
                  (rest (unnormalize-gbar tail-absm
                              (if (= n 2) 0 +null-gbar+)))))))))))))

#|
  (cat-init)
  (setf d (delta 10))
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -1
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 (mod gmsm 2) :gnrt-z))
                :strt :gnrt
                :orgn '(essai-1)))
  (gmsm-cocycle (face d) 1 4 31 chml-clss)
  (z2-cocycle-gbar 1 4 *)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -2
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 (mod gmsm 2) :gnrt-z))
                :strt :gnrt
                :orgn '(essai-2)))
  (gmsm-cocycle (face d) 2 2 7 chml-clss)
  (z2-cocycle-gbar 2 2 *)
  (gmsm-cocycle (face d) 2 2 0 chml-clss) ;; normally illegal
  (z2-cocycle-gbar 2 2 *)
  (gmsm-cocycle (face d) 2 3 15 chml-clss)
  (z2-cocycle-gbar 2 3 *)
  (gmsm-cocycle (face d) 2 4 31 chml-clss)
  (z2-cocycle-gbar 2 4 *)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -3
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 (mod gmsm 2) :gnrt-z))
                :strt :gnrt
                :orgn '(essai-3)))
  (gmsm-cocycle (face d) 3 4 31 chml-clss)
  (z2-cocycle-gbar 3 4 *)
|#

(DEFUN Z2-COCYCLE-GBAR-HEAD (n dmns cocycle)
  ;; cocycle \in Z^n(\Delta^{dmns}, \pi) with \pi = Z/2Z
  (declare
    (fixnum n dmns)
    (list cocycle))
  (the absm
    (progn
      (mapc
        #'(lambda (cons)
        (setf (cdr cons)
          (if (evenp (cdr cons)) 0 1)))
        cocycle)
      (cond ((= n 1)
         (error "In Z2-COCYCLE-GBAR-HEAD, this point should not have been reached."))
         ; (z2-bar-absm (nreverse (mapcar #'cdr cocycle))))
        ((= n dmns)
         (let ((value (cdr (first cocycle))))
           (declare (fixnum value))
           (if (zerop value)
           (if (= n 2)
               (absm 1 0)
             (absm (mask (1- dmns)) +null-gbar+))
         (absm 0 (z2-fundamental-gmsm (1- dmns) value)))))
        (t
         (let ((cocycle1 +empty-list+)
           (cocycle2 +empty-list+))
           (declare (list cocycle1 cocycle2))
           (dolist (cons cocycle)
         (declare (cons cons))
         (if (evenp (car cons))
             (push (cons (ash (car cons) -1) (cdr cons))
               cocycle1)
           (push (cons (ash (car cons) -1) (cdr cons))
             cocycle2)))
           (setf cocycle1 (nreverse cocycle1)
             cocycle2 (nreverse cocycle2))
           (mapc
        #'(lambda (cons)
            (declare (cons cons))
            (when (evenp (car cons))
              (setf (cdr cons)
                (mod (- (cdr cons)
                    (cdr (assoc (1+ (car cons)) cocycle1)))
                     2))))
        cocycle2)
           (z2-cocycle-gbar (1- n) (1- dmns) cocycle2)))))))

#|
  (cat-init)
  (setf d (delta 10))
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -1
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 (mod gmsm 2) :gnrt-z))
                :strt :gnrt
                :orgn '(essai-1)))
  (gmsm-cocycle (face d) 1 4 31 chml-clss)
  (z2-cocycle-gbar 1 4 *)
  (z2-cocycle-gbar-head 1 4 **)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -2
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 (mod gmsm 2) :gnrt-z))
                :strt :gnrt
                :orgn '(essai-2)))
  (gmsm-cocycle (face d) 2 2 7 chml-clss)
  (z2-cocycle-gbar 2 2 *)
  (z2-cocycle-gbar-head 2 2 **)
  (gmsm-cocycle (face d) 2 2 0 chml-clss) ;; normally illegal
  (z2-cocycle-gbar 2 2 *)
  (z2-cocycle-gbar-head 2 2 **)
  (gmsm-cocycle (face d) 2 3 15 chml-clss)
  (z2-cocycle-gbar 2 3 *)
  (z2-cocycle-gbar-head 2 3 **)
  (gmsm-cocycle (face d) 2 4 31 chml-clss)
  (z2-cocycle-gbar 2 4 *)
  (z2-cocycle-gbar-head 2 4 **)
  (setf chml-clss
    (build-mrph :sorc d :trgt (z-chcm) :degr -3
                :intr #'(lambda (dmns gmsm)
                          (term-cmbn 0 (mod gmsm 2) :gnrt-z))
                :strt :gnrt
                :orgn '(essai-3)))
  (gmsm-cocycle (face d) 3 4 31 chml-clss)
  (z2-cocycle-gbar 3 4 *)
  (z2-cocycle-gbar-head 3 4 **)
|#

(DEFUN K-Z-FUNDAMENTAL-CLASS (n)
  (declare (fixnum n))
  (the morphism
    (build-mrph
      :sorc (k-z n) :trgt (z-chcm) :degr (- n)
      :intr #'(lambda (dmns gmsm)
        (declare
          (fixnum dmns)
          (type gmsm gmsm))
        (if (= dmns n)
           (do ((gmsm gmsm (gmsm (first (gbar-list gmsm))))
            (dmns dmns (1- dmns)))
               ((= 1 dmns)
            (term-cmbn 0 (first gmsm) :z-gnrt))
               (declare
             (type gmsm gmsm)
             (fixnum dmns)))
          (zero-cmbn (- dmns n))))
      :strt :gnrt
      :orgn `(k-z-fundamental-class ,n))))

#|
  (cat-init)
  (setf c1 (k-z-fundamental-class 1))
  (? c1 1 '(34))
  (? c1 2 '(34 45))
  (setf c3 (k-z-fundamental-class 3))
  (? c3 3 (z-fundamental-gmsm 3 45))
|#

(DEFUN K-Z2-FUNDAMENTAL-CLASS (n)
  (declare (fixnum n))
  (the morphism
    (build-mrph
      :sorc (k-z2 n) :trgt (z-chcm) :degr (- n)
      :intr #'(lambda (dmns gmsm)
        (declare
          (fixnum dmns)
          (ignore gmsm))
        (if (= dmns n)
           (term-cmbn 0 1 :z-gnrt)
          (zero-cmbn (- dmns n))))
      :strt :gnrt
      :orgn `(k-z2-fundamental-class ,n))))

#|
  (cat-init)
  (setf c1 (k-z2-fundamental-class 1))
  (? c1 1 1)
  (? c1 2 2)
  (setf c3 (k-z2-fundamental-class 3))
  (? c3 3 (z2-fundamental-gmsm 3 1))
|#



Home page.