# Trying to learn METAFONT (act.)

Pythagorean addition $\sqrt{a^2+b^2}$

Estava a "tentar" aprender METAFONT, o significado das aspas tornar-se-á claro em poucos instantes, e dei com o seguinte comentário escrito pelo próprio Knuth

Pythagorean addition is implemented by an elegant iterative scheme due to Cleve Moler and Donald Morrison IBM Journal of Research and Development 27 (1983), 577—581. It modifies |a| and |b| in such a way that their Pythagorean sum remains invariant, while the smaller argument decreases.

E, justifica-se as aspas, tive de descobrir o artigo (não encontrei outro sítio para o ler) e implementar o código em Lisp.

(defun pythag (a b &optional tol)
"Pythagorean addition $\sqrt{a^2+b^2}$ is implemented by an elegant
iterative scheme due to Cleve Moler and Donald Morrison IBM Journal
of Research and Development 27 (1983), 577--581. It modifies |a| and |b|
in such a way that their Pythagorean sum remains invariant, while the
smaller argument decreases."
(if (>= a b)
(pythag b a tol)
(if (<= a (if tol
tol
(expt 10.0 -16)))
b
(let* ((r (expt (/ a b) 2))
(s (/ r (+ 4 r)))
(b (+ b (* 2 s b)))
(a (* s a)))
(pythag a b tol)))))

> (pythag 1.0 2.0 .000001)
2.236068
> (expt  5 .5)
2.236068


e com a operação inversa

(defun pythag (pm a b &optional tol)
"Pythagorean addition $\sqrt{a^2\pm b^2}$ is implemented by an elegant
iterative scheme due to Cleve Moler and Donald Morrison IBM Journal
of Research and Development 27 (1983), 577--581. It modifies |a| and |b|
in such a way that their Pythagorean sum remains invariant, while the
smaller argument decreases. pm -> +1 gives sqrt(a^2+b^2); pm -> -1 gives sqrt(a^2-b^2);"
(if (>= a b)
(pythag pm b a tol)
(if (<= a (if tol
tol
(expt 10.0 -16)))
b
(let* ((r (* pm (expt (/ a b) 2)))
(s (/ r (+ 4 r)))
(b (+ b (* 2 s b)))
(a (* s a)))
(pythag pm a b tol)))))


Voltando ao METAFONT.

Palavras chave/keywords: Metafont, LaTeX, Pythagorean addition, lisp  