Linear Algebra (3)

次の日になりましたが色々確認など。とりあえず数え上げって事で以下の試験をナニ。

(test-section "enum-0-list")
(test* "(enum-0-list 0 0)"
       '()
       (enum-0-list 0 0))

(test* "(enum-0-list 0 1)"
       '(0)
       (enum-0-list 0 1))

(test* "(enum-0-list 0 2)"
       '(0 0)
       (enum-0-list 0 2))

実装が以下。

(define (enum-0-list n h)
  (if (>= n h)
      '()
      (cons 0 (enum-0-list (+ 1 n) h))))

これをどーすんだっけ (を

てか

scheme てきには以下か。

(define (enum-0-list n)
  (if (= 0 n)
      '()
      (cons 0 (enum-0-list (- n 1)))))

で、これを使って 0 な正方行列作るのかなぁ。正方行列作ってから I にするべきなのか数えあげながら同時に I にしていくべきなのかが不明。
とりあえず以下が出てきた。

(define (enum-0-m n)
  (let ((deg n))
    (let f ((n n))
      (if (= 0 n)
	  '()
	  (cons (enum-0-list deg) (f (- n 1)))))))

なんとなく微妙なカンジがしてますがこれをどうやって I にしたものか。あら? 上記って数を数えてるので無理矢理なんとかできんかな。
とりあえず現時点での上記手続きの試験が以下。

(test-section "enum-0-list")
(test* "(enum-0-list 0)"
       '()
       (enum-0-list 0))

(test* "(enum-0-list 1)"
       '(0)
       (enum-0-list 1))

(test* "(enum-0-list 2)"
       '(0 0)
       (enum-0-list 2))

(test-section "enum-0-m")
(test* "(enum-0-m 2)"
       '((0 0) (0 0))
       (enum-0-m 2))

(test* "(enum-0-m 3)"
       '((0 0 0) (0 0 0) (0 0 0))
       (enum-0-m 3))

(test* "(enum-0-m 4)"
       '((0 0 0 0) (0 0 0 0) (0 0 0 0) (0 0 0 0))
       (enum-0-m 4))

enum-0-m をちょっと修正。

(define (enum-0-m n)
  (let f ((deg n) (n n))
    (if (= 0 n)
	'()
	(cons (enum-0-list deg) (f deg (- n 1))))))

これ、enumerate する時にいきなり作りたくなるんですが、基本変形という事を考えたら後で filter する方式の方が良いのかどうなのか。

例えば

enum-1-list みたいな手続きをナニして

(define (enum-1-list n pos)
  (if (= 0 n)
      '()
      (cons (if (= 0 (- n pos)) 1 0) (enum-1-list (- n 1) pos))))

以下で OK?

(define (enum-I-m n)
  (let f ((deg n) (n n))
    (if (= 0 n)
	'()
	(cons (enum-1-list deg n) (f deg (- n 1))))))

以下な試験にパスしてます。

(test-section "enum-1-list")
(test* "(enum-1-list 2 2)"
       '(1 0)
       (enum-1-list 2 2))

(test* "(enum-1-list 2 1)"
       '(0 1)
       (enum-1-list 2 1))

(test* "(enum-1-list 3 3)"
       '(1 0 0)
       (enum-1-list 3 3))

(test* "(enum-1-list 3 2)"
       '(0 1 0)
       (enum-1-list 3 2))

(test* "(enum-1-list 3 1)"
       '(0 0 1)
       (enum-1-list 3 1))

(test-section "enum-I-m")
(test* "(enum-I-m 2)"
       '((1 0) (0 1))
       (enum-I-m 2))

(test* "(enum-I-m 3)"
       '((1 0 0) (0 1 0) (0 0 1))
       (enum-I-m 3))

(test* "(enum-I-m 4)"
       '((1 0 0 0) (0 1 0 0) (0 0 1 0) (0 0 0 1))
       (enum-I-m 4))

基本変形云々もこの方式を踏襲した方が良さげな気になりつつあるんですが、どうなんでしょうか。とりあえずここで一旦エントリ投入。