; Subspace Intersection stress test
(lambda (sg zer? zer one fa fm / fsub) (let* (
  ; (ex (lambda (m v)(write (list m v))(newline) v))
  (n 11) ; perhaps a parameter someday
  (J ((fileVal "gIntersect") zer zer? one fa fsub fm /))
  (I (J 'inter))
  (rref (J 'rref))
  (DoL ((fileVal "Do") 'DoL))
  (vg (lambda () (DoL n (lambda (k) (sg)))))
  (vsg (lambda (n) (DoL n (lambda (k) (vg))))))
 
(ylppa ((fileVal "Matrix") sg zer zer? one fa fsub fm /)
     (lambda (rmg mm inv ip tr det i? v= m=) (let* (
   (im (lambda (n) (let z () (let* ((m (rmg n)))
     (if (zer? (det m)) (z) m)))))
   (scr (lambda (s) (mm (im (length s)) s)))
   (nv (lambda (j) (DoL n (lambda(k) (if (= j k) one zer)))))
   (dist (lambda (a b c) ; test distributive law for subspaces
; Each of a, b and c should be a row of rows of field elements.
     (let ((a (scr a)) (b (scr b))(c (scr c)))
     (let ((in (I a (append b c))))
      (m= (rref (append a (I b c))) (I (append a b) (append a c))))))))
  (lambda (a b c) (if #f (let* ( ; this branch of code is bad for it assumes that BuC and BuD have no common subspace.
  ; Yet it found bugs; so I retain it.
    (B (vsg a))
    (BuC (scr (append B (vsg b))))
    (BuD (scr (append B (vsg c))))
    (int (I BuC BuD))
    (Bc (I B B)))

    (list int Bc (map length (list B BuC BuD int))
    (m= int Bc)))
  (list (dist (vsg a) (vsg b) (vsg c))
  (dist (DoL a (lambda (j) (nv j)))
         (DoL b (lambda (j) (nv j)))
         (DoL c (lambda (j) (nv j))))
   (dist (list (nv a))(list (nv b))(list (nv c)))
    ))))))))

(define za ((fileVal "testInter")
  (let ((w ((fileVal "RC4") 'nb "vip3w"))) (lambda () (modulo (w 1) 5)))
  zero? 0 1 + * / -))
(za 1 2 2) ; => ((#f ((1 0 1 0)) ((1 4 2 3) (0 3 4 2)) ((1 0 0 2) (3 4 2 4)) () ((1 0 1 0)) ((1 0 1 0) (0 1 -7/50 39/50)) #t) (#t ((1 0 0 0)) ((1 0 0 0) (0 1 0 0)) ((1 0 0 0) (0 1 0 0)) ((1 0 0 0) (0 1 0 0)) ((1 0 0 0) (0 1 0 0)) ((1 0 0 0) (0 1 0 0)) #t))
