cl-cf
2024-10-12
Computations using continued fractions
1Description
cf is a Common Lisp library for doing computations using continued fractions.2License
cf is released under the GPL-3 license. See the LICENSE file for details.3API
After puting the library in a place where your Common Lisp system can see it,it can be loaded with the usual: (asdf:load-system "cf")
or
(quicklisp:quickload "cf")
The functions will then be available in the cf
package.
3.1Convert to/from continued fractions
A continued fraction is represented by a list of coefficients.The *cf-length*
parameter indicates the maximum number of coefficients that
will be used when making a continued fraction (20 by default).
The *cf-max-number-in-fractional-part*
parameter indicates the maximum
integer that can appear in the fractional part of a continued fraction
(most-positive-fixnum
by default).
The cf-simplify
function will truncate the continued fraction if it
encounters a number bigger than this maximum, in order to make the computations
faster by reducing the amount of arithmetic operations on bignums.
(cf x) => list
Return the continued fraction for the number x (with at most *cf-length*
coefficients).
(cf-simplify x) => list
Keep at most *cf-length*
coefficients of the continued fraction x and
remove huge numbers (greater than *cf-max-number-in-fractional-part*
) from
the fractional part.
You should rarely need to call this function as it is used automatically by
most functions in the library.
(cf-nsimplify x) => list
Like cf-simplify
, but modifying x instead of creating a new continued
fraction.
(cf-convergent x) => ratio
Return the convergent of the continued fraction x (i.e. convert the continued fraction to a ratio).
(cf-decimal x n) => string
Return a string representing the decimal expansion of the continued fraction x, with at most n digits in the fractional part.
3.2Constants
The continued fractions for some constants are included in the library:+cf-pi+
: π, ratio of a circle's circumference to its diameter+cf-pi/2+
: π/2+cf-tau+
: τ = 2π+cf-e+
: Euler's number+cf-gamma+
: γ, the Euler-Mascheroni constant+cf-ln-2+
: natural logarithm of 2+cf-atan-1/2+
: arctangent of 1/2
3.3Predicates, equality and inequality functions
(cf-zerop x) => boolean
Return t
if x is zero, and nil
otherwise.
(cf-minusp x) => boolean
Return t
if x is strictly negative, and nil
otherwise.
(cf-plusp x) => boolean
Return t
if x is strictly positive, and nil
otherwise.
(cf= x &rest more-fractions) => boolean
Return t
if all its arguments are equal, and nil
otherwise.
(cf/= x &rest more-fractions) => boolean
Return nil
if at least two of its arguments are equal, and t
otherwise.
(cf< x &rest more-fractions) => boolean
Return if t
its arguments are in strictly increasing order,
and nil
otherwise.
(cf<= x &rest more-fractions) => boolean
Return t
if its arguments are in increasing order, and nil
otherwise.
(cf> x &rest more-fractions) => boolean
Return t
if its arguments are in strictly decreasing order,
and nil
otherwise.
(cf>= x &rest more-fractions) => boolean
Return t
if its arguments are in decreasing order, and nil
otherwise.
3.4Arithmetic functions
(cf+ &rest fractions) => list
Return the continued fraction of the sum of its arguments.
(cf1+ x) => list
Return the continued fraction of x + 1.
(cf- x &rest more-fractions) => list
Return the continued fraction of the subtraction of the second and subsequent arguments from x. If more-fractions are not specified, return the continued fraction of -/x/.
(cf1- x) => list
Return the continued fraction of x - 1.
(cf* &rest fractions) => list
Return the continued fraction of the product of its arguments.
(cf/ x &rest more-fractions) => list
Return the continued fraction of the division of x by the second and subsequent arguments. If more-fractions are not specified, return the continued fraction of 1 / x.
(cf-min x &rest more-fractions) => list
Return the least of its arguments.
(cf-max x &rest more-fractions) => list
Return the greatest of its arguments.
(cf-abs x) => list
Return the continued fraction of the absolute value of x.
(cf-signum x) => list
Return the continued fraction of -1, 0 or 1 if x is respectively negative, zero or positive.
(cf-floor x &optional y) => list
Return the continued fraction of the greatest integer smaller than or equal to x / y, and the continued fraction of x modulo y. The default value for y is 1.
(cf-mod x y) => list
Return the continued fraction of x modulo y (the second value of
cf-floor
).
(cf-ceiling x &optional y) => list
Return the continued fraction of the smallest integer greater than or equal to x / y, and the continued fraction of the remainder. The default value for y is 1.
(cf-truncate x &optional y) => list
Return the continued fraction of the integer part of x / y rounded toward 0, and the continued fraction of the remainder. The default value for y is 1.
(cf-rem x y) => list
Return the continued fraction of the remainder of x / y (the second value
of cf-truncate
).
(cf-round x &optional y) => list
Return the continued fraction of x / y rounded to the nearest integer, and the continued fraction of the remainder. The default value for y is 1.
3.5Power, exponential and logarithm functions
(cf-sqrt x) => list
Return the continued fraction of the square root of x.
(cf-exp x) => list
Return the continued fraction of the exponential of x.
(cf-log x &optional y) => list
If y is specified, return the continued fraction of the base y logarithm of x, and ln(x) otherwise.
(cf-expt x y) => list
Return the continued fraction of x raised to the power of y.
3.6Circular functions
(cf-cos x) => list
Return the continued fraction of cos(x).
(cf-sin x) => list
Return the continued fraction of cos(x).
(cf-tan x) => list
Return the continued fraction of tan(x).
(cf-acos x) => list
Return the continued fraction of acos(x).
(cf-asin x) => list
Return the continued fraction of asin(x).
(cf-atan y &optional x) => list
If x is specified, return the continued fraction of atan(y / x), and atan(y) otherwise.
3.7Hyperbolic functions
(cf-cosh x) => list
Return the continued fraction of cosh(x).
(cf-sinh x) => list
Return the continued fraction of sinh(x).
(cf-tanh x) => list
Return the continued fraction of tanh(x).
(cf-acosh x) => list
Return the continued fraction of acosh(x).
(cf-asinh x) => list
Return the continued fraction of asinh(x).
(cf-atanh x) => list
Return the continued fraction of atanh(x).
3.8Homographic functions
Most of the functions in the library are based on the two following functions.They can be used to compute the coefficients of the continued fraction of anexpression directly from the coefficients of the continued fractions passed asarguments.It means that you don't need to convert the arguments to ratios, compute theexpression, and convert back to a continued fraction.These functions don't call cf-simplify
on their result automatically, so you
might have to do it if necessary.
(cf-homographic a b c d x) => list
Return the continued fraction of
ax + b
--------
cx + d
where a, b, c and d are relative integers,and x is a continued fraction. (cf-bihomographic a b c d e f g h x y) => list
Return the continued fraction of
axy + bx + cy + d
-------------------
exy + fx + gy + h
where a, b, c, d, e, f, g and h are relative integers,and x and y are continued fractions.4Examples
;; Get the continued fraction for the number 17/19
(cf 17/19)
=> (0 1 8 2)
;; Get the simple ratio from the continued fraction
(cf-convergent '(0 1 8 2))
=> 17/19
;; Get the decimal representation from the continued fraction
(cf-decimal '(0 1 8 2) 30)
=> "0.894736842105263157894736842105"
;; 26/5 + 10/7 = 232/35
(cf+ '(5 5) '(1 2 3))
=> (6 1 1 1 2 4)
;; 232/35 - 10/7 = 26/5
(cf- '(6 1 1 1 2 4) '(1 2 3))
=> (5 5)
;; 19 / 17 = 19/17
(cf/ '(19) '(17))
=> (1 8 2)
;; 19/17 * 17 = 19
(cf* '(1 8 2) '(17))
=> (19)
(cf-sqrt '(7))
=> (2 1 1 1 4 1 1 1 4 1 1 1 4 1 1 1 4 1 1 1)
;; √7 * √7 = 7
(let ((a (cf-sqrt '(7))))
(float (cf-convergent (cf* a a))))
=> 7.0
(cf-simplify +cf-pi+)
=> (3 7 15 1 292 1 1 1 2 1 3 1 14 2 1 1 2 2 2 2)
;; Computing atan(1) + atan(2) + atan(3) with continued fractions of 20
;; coefficients doesn't return the fully correct continued fraction for π.
;; The last coefficients are different.
(let ((a (cf-atan '(1)))
(b (cf-atan '(2)))
(c (cf-atan '(3))))
(cf+ a b c))
=> (3 7 15 1 292 1 1 1 2 1 3 1 4 4 3 2 1 1 5 1)
;; By using continued fractions of 30 coefficients in the computation,
;; the precision of the result increases and we can get the correct first 20
;; coefficients for π.
(let* ((*cf-length* 30)
(a (cf-atan '(1)))
(b (cf-atan '(2)))
(c (cf-atan '(3)))
(d (cf+ a b c)))
(let ((*cf-length* 20))
(cf-simplify d)))
=> (3 7 15 1 292 1 1 1 2 1 3 1 14 2 1 1 2 2 2 2)
;; Compute the continued fraction for the golden ratio (1 + √5) / 2
(cf-simplify (cf-homographic 1 1 0 2 (cf-sqrt '(5))))
=> (1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
5Tests
The tests require the fiveam package. They can be run with:(asdf:test-system "cf")