LaTeX の数式が表示できるプラグイン

WordPress で LaTeX の数式を表示できるようにするプラグインはいくつかあるようだけど、Easy WP LaTeX ってのが簡単そうで評価も高いようだったのでインストールしてみた。

 cf. WordPressでTeX数式が使用できるプラグイン「Easy WP LaTeX」 ― レンサバ比較のカルマ

インストールは簡単。

  1. WordPressのメニュー
  2. →「プラグイン」
  3. →「新規追加」
  4. →「Easy WP LaTeX」を検索
  5. →「いますぐインストール」
  6. →「有効化」

これでOK。

設定は、WordPress のメニュー → 「設定」 → 「Easy WP LaTeX」 で、色と大きさ、記法の設定ができる。

試しに表示してみると、

[math](a+b)^2 = a^2 + b^2 + 2ab[/math]

LaTeX のソースはこれ。

(a+b)^2 = a^2 + b^2 + 2ab

練習:フィボナッチ関数

これも東大の Scheme演習のページから。

 cf. Scheme演習 第2回

問1(末尾再帰)

フィボナッチ関数の定義(fib(0)=0、fib(1)=1 …)が載っていて、

この定義をそのまま使って関数 (fib1 n) を作れ。

(define fib1
  (lambda (n)
    (cond
      ((= n 0) 0)
      ((= n 1) 1)
      (else (+ (fib1 (- n 1)) (fib1 (- n 2)))))))
gosh> (load "fib1")
#t
gosh> (fib1 30)
832040
gosh> (fib1 40)
102334155

末尾再帰を使って、n に対して線形の時間で求める関数 (fib2 n) を作れ。その際、ブロック構造を用いて、トップレベルに定義する関数は fib2 のみとせよ。

(define fib2
  (lambda (n)
    (define fib-iter
      (lambda (m a b)
        (if (zero? m)
            a
            (fib-iter (- m 1) b (+ a b)))))
    (fib-iter n 0 1)))
gosh> (load "fib2")
#t
gosh> (fib2 40)
102334155

ふたつのプログラムを同じ引数で実行してみて、時間を比較せよ。さらにその時間の違いの理由について考察せよ。

厳密には時間を計っていないけど、引数が 40 の場合 fib1 は数十秒かかるのに対して、fib2 は一瞬で結果が得られる。理由は簡単、fib1 では再帰のたびに同じ引数に対する計算を何度も行っているのに対して、fib2 では同じ引数に対する計算は1度ですんでいるから。

練習:even>odd?

「Scheme手習い」9章は問答についていくのが大変なので、今日はちょっとそこから離れて関数の練習。
東大のScheme演習のページから。

 cf. Scheme演習 第1回

問2
5つの整数を引数として受け取り、そのうち偶数が奇数より多い場合は #t を返し、奇数が偶数より多い場合は #f を返す述語 even>odd? を定義せよ。当然、いろいろな定義の仕方がある。

いろいろな定義の仕方がある、っていうんだから3つくらいは挙げなきゃな。
最初に思いついたのがこれ。

(define even>odd?
  (lambda (a b c d e)
    (> (length (filter even? (list a b c d e))) 2)))

(print (even>odd? 1 2 3 4 5))
(print (even>odd? 2 -3 4 5 -6))
^o^ > gosh even_gt_odd1.scm
#f
#t

次にこれ。上のやつの (length (filter even? ...)) の代わりに再帰関数で偶数の数を数えている。

(define even>odd?
  (lambda (a b c d e)
    (define evens
      (lambda (lis)
        (cond
          ((null? lis) 0)
          ((even? (car lis)) (+ 1 (evens (cdr lis))))
          (else (evens (cdr lis))))))
    (> (evens (list a b c d e)) 2)))

(print (even>odd? 1 2 3 4 5))
(print (even>odd? 2 -3 4 5 -6))
^o^ > gosh even_gt_odd2.scm
#f
#t

3つ目、前に作った evens-and-odds を使う。

(define even>odd?
  (lambda (a b c d e)
    (define evens-and-odds
      (lambda (lis co)
        (cond
          ((null? lis) (co '() '()))
          ((even? (car lis))
          (evens-and-odds (cdr lis) (lambda (e o) (co (cons (car lis) e) o))))
          (else
            (evens-and-odds (cdr lis) (lambda (e o) (co e (cons (car lis) o))))))))
    (define friend
      (lambda (e o)
        (> (length e) (length o))))
    (evens-and-odds (list a b c d e) friend)))

(print (even>odd? 1 2 3 4 5))
(print (even>odd? 2 -3 4 5 -6))
^o^ > gosh even_gt_odd3.scm
#f
#t