(defun arithmetic-geometric-mean (a b)
(values (/ (+ a b) 2)
(sqrt (* a b))))
(defun converge (epsilon fun a b)
(loop
:while (< epsilon (abs (- a b)))
:do (multiple-value-setq (a b) (funcall fun a b))
:finally (return (values a b))))
(format t ";; --> ~{~S~^~%;; ~}~%" (multiple-value-list
(converge 1d-15
(lambda (a b)
(format t ";; ~24,21F ~24,21F~%" a b)
(arithmetic-geometric-mean a b))
24d0 6d0)
))
(defun geothmetic-meandian (set)
(sort (vector (/ (reduce (function +) set :initial-value 0.0d0)
(length set))
(expt (reduce (function *) set :initial-value 1.0d0)
(/ (length set)))
(aref set (truncate (length set) 2)))
(function <)))
(defun converge-set (epsilon fun set)
;; set is sorted.
(loop
:while (< epsilon (abs (- (aref set 0) (aref set (1- (length set))))))
:do (setf set (funcall fun set))
:finally (return set)))
(format t ";; --> ~{~S~^~%;; ~}~%" (multiple-value-list
(converge-set
1d-3
(lambda (set)
(format t ";;~{ ~24,21F~}~%" (coerce set 'list))
(geothmetic-meandian set))
#(1 1 2 3 5))
))
CihkZWZ1biBhcml0aG1ldGljLWdlb21ldHJpYy1tZWFuIChhIGIpCiAgKHZhbHVlcyAoLyAoKyBhIGIpIDIpCiAgICAgICAgICAoc3FydCAoKiBhIGIpKSkpCgooZGVmdW4gY29udmVyZ2UgKGVwc2lsb24gZnVuIGEgYikKICAobG9vcAogICAgOndoaWxlICg8IGVwc2lsb24gKGFicyAoLSBhIGIpKSkKICAgIDpkbyAobXVsdGlwbGUtdmFsdWUtc2V0cSAoYSBiKSAoZnVuY2FsbCBmdW4gYSBiKSkKICAgIDpmaW5hbGx5IChyZXR1cm4gKHZhbHVlcyBhIGIpKSkpCgooZm9ybWF0IHQgIjs7IC0tPiB+e35Tfl5+JTs7ICAgICB+fX4lIiAobXVsdGlwbGUtdmFsdWUtbGlzdAooY29udmVyZ2UgMWQtMTUKICAgICAgICAgIChsYW1iZGEgKGEgYikKICAgICAgICAgICAgKGZvcm1hdCB0ICI7OyB+MjQsMjFGIH4yNCwyMUZ+JSIgYSBiKQogICAgICAgICAgICAoYXJpdGhtZXRpYy1nZW9tZXRyaWMtbWVhbiBhIGIpKQogICAgICAgICAgMjRkMCA2ZDApCikpCgoKKGRlZnVuIGdlb3RobWV0aWMtbWVhbmRpYW4gKHNldCkKICAoc29ydCAodmVjdG9yICgvIChyZWR1Y2UgKGZ1bmN0aW9uICspIHNldCA6aW5pdGlhbC12YWx1ZSAwLjBkMCkKICAgICAgICAgICAgICAgICAgIChsZW5ndGggc2V0KSkKICAgICAgICAgICAgICAgIChleHB0IChyZWR1Y2UgKGZ1bmN0aW9uICopIHNldCAgOmluaXRpYWwtdmFsdWUgMS4wZDApCiAgICAgICAgICAgICAgICAgICAgICAoLyAobGVuZ3RoIHNldCkpKQogICAgICAgICAgICAgICAgKGFyZWYgc2V0ICh0cnVuY2F0ZSAobGVuZ3RoIHNldCkgMikpKQogICAgICAgIChmdW5jdGlvbiA8KSkpCgooZGVmdW4gY29udmVyZ2Utc2V0IChlcHNpbG9uIGZ1biBzZXQpCiAgOzsgc2V0IGlzIHNvcnRlZC4KICAobG9vcAogICAgOndoaWxlICg8IGVwc2lsb24gKGFicyAoLSAoYXJlZiBzZXQgMCkgKGFyZWYgc2V0ICgxLSAobGVuZ3RoIHNldCkpKSkpKQogICAgOmRvIChzZXRmIHNldCAoZnVuY2FsbCBmdW4gc2V0KSkKICAgIDpmaW5hbGx5IChyZXR1cm4gc2V0KSkpCiAgICAKKGZvcm1hdCB0ICI7OyAtLT4gfnt+U35efiU7OyAgICAgfn1+JSIgKG11bHRpcGxlLXZhbHVlLWxpc3QKKGNvbnZlcmdlLXNldAogIDFkLTMKICAobGFtYmRhIChzZXQpCiAgICAoZm9ybWF0IHQgIjs7fnsgfjI0LDIxRn59fiUiIChjb2VyY2Ugc2V0ICdsaXN0KSkKICAgIChnZW90aG1ldGljLW1lYW5kaWFuIHNldCkpCiAgIygxIDEgMiAzIDUpKQopKQ==