<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ --> <title>Data/Number/FixedFunctions.hs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> <pre><a name="line-1"></a><span class='hs-comment'>-- Modified by Lennart Augustsson to fit into Haskell numerical hierarchy.</span> <a name="line-2"></a><span class='hs-comment'>--</span> <a name="line-3"></a><span class='hs-comment'>-- Module:</span> <a name="line-4"></a><span class='hs-comment'>--</span> <a name="line-5"></a><span class='hs-comment'>-- Fraction.hs</span> <a name="line-6"></a><span class='hs-comment'>--</span> <a name="line-7"></a><span class='hs-comment'>-- Language:</span> <a name="line-8"></a><span class='hs-comment'>--</span> <a name="line-9"></a><span class='hs-comment'>-- Haskell</span> <a name="line-10"></a><span class='hs-comment'>--</span> <a name="line-11"></a><span class='hs-comment'>-- Description: Rational with transcendental functionalities</span> <a name="line-12"></a><span class='hs-comment'>--</span> <a name="line-13"></a><span class='hs-comment'>--</span> <a name="line-14"></a><span class='hs-comment'>-- This is a generalized Rational in disguise. Rational, as a type</span> <a name="line-15"></a><span class='hs-comment'>-- synonim, could not be directly made an instance of any new class</span> <a name="line-16"></a><span class='hs-comment'>-- at all.</span> <a name="line-17"></a><span class='hs-comment'>-- But we would like it to be an instance of Transcendental, where</span> <a name="line-18"></a><span class='hs-comment'>-- trigonometry, hyperbolics, logarithms, etc. are defined.</span> <a name="line-19"></a><span class='hs-comment'>-- So here we are tiptoe-ing around, re-defining everything from</span> <a name="line-20"></a><span class='hs-comment'>-- scratch, before designing the transcendental functions -- which</span> <a name="line-21"></a><span class='hs-comment'>-- is the main motivation for this module.</span> <a name="line-22"></a><span class='hs-comment'>--</span> <a name="line-23"></a><span class='hs-comment'>-- Aside from its ability to compute transcendentals, Fraction</span> <a name="line-24"></a><span class='hs-comment'>-- allows for denominators zero. Unlike Rational, Fraction does</span> <a name="line-25"></a><span class='hs-comment'>-- not produce run-time errors for zero denominators, but use such</span> <a name="line-26"></a><span class='hs-comment'>-- entities as indicators of invalid results -- plus or minus</span> <a name="line-27"></a><span class='hs-comment'>-- infinities. Operations on fractions never fail in principle.</span> <a name="line-28"></a><span class='hs-comment'>--</span> <a name="line-29"></a><span class='hs-comment'>-- However, some function may compute slowly when both numerators</span> <a name="line-30"></a><span class='hs-comment'>-- and denominators of their arguments are chosen to be huge.</span> <a name="line-31"></a><span class='hs-comment'>-- For example, periodicity relations are utilized with large</span> <a name="line-32"></a><span class='hs-comment'>-- arguments in trigonometric functions to reduce the arguments</span> <a name="line-33"></a><span class='hs-comment'>-- to smaller values and thus improve on the convergence</span> <a name="line-34"></a><span class='hs-comment'>-- of continued fractions. Yet, if pi number is chosen to</span> <a name="line-35"></a><span class='hs-comment'>-- be extremely accurate then the reduced argument would</span> <a name="line-36"></a><span class='hs-comment'>-- become a fraction with huge numerator and denominator</span> <a name="line-37"></a><span class='hs-comment'>-- -- thus slowing down the entire computation of a trigonometric</span> <a name="line-38"></a><span class='hs-comment'>-- function.</span> <a name="line-39"></a><span class='hs-comment'>--</span> <a name="line-40"></a><span class='hs-comment'>-- Usage:</span> <a name="line-41"></a><span class='hs-comment'>--</span> <a name="line-42"></a><span class='hs-comment'>-- When computation speed is not an issue and accuracy is important</span> <a name="line-43"></a><span class='hs-comment'>-- this module replaces some of the functionalities typically handled</span> <a name="line-44"></a><span class='hs-comment'>-- by the floating point numbers: trigonometry, hyperbolics, roots</span> <a name="line-45"></a><span class='hs-comment'>-- and some special functions. All computations, including definitions</span> <a name="line-46"></a><span class='hs-comment'>-- of the basic constants pi and e, can be carried with any desired</span> <a name="line-47"></a><span class='hs-comment'>-- accuracy. One suggested usage is for mathematical servers, where</span> <a name="line-48"></a><span class='hs-comment'>-- safety might be more important than speed. See also the module</span> <a name="line-49"></a><span class='hs-comment'>-- Numerus, which supports mixed arithmetic between Integer,</span> <a name="line-50"></a><span class='hs-comment'>-- Fraction and Cofra (Complex fraction), and returns complex</span> <a name="line-51"></a><span class='hs-comment'>-- legal answers in some cases where Fraction would produce</span> <a name="line-52"></a><span class='hs-comment'>-- infinities: log (-5), sqrt (-1), etc.</span> <a name="line-53"></a><span class='hs-comment'>--</span> <a name="line-54"></a><span class='hs-comment'>--</span> <a name="line-55"></a><span class='hs-comment'>-- Required:</span> <a name="line-56"></a><span class='hs-comment'>--</span> <a name="line-57"></a><span class='hs-comment'>-- Haskell Prelude</span> <a name="line-58"></a><span class='hs-comment'>--</span> <a name="line-59"></a><span class='hs-comment'>-- Author:</span> <a name="line-60"></a><span class='hs-comment'>--</span> <a name="line-61"></a><span class='hs-comment'>-- Jan Skibinski, Numeric Quest Inc.</span> <a name="line-62"></a><span class='hs-comment'>--</span> <a name="line-63"></a><span class='hs-comment'>-- Date:</span> <a name="line-64"></a><span class='hs-comment'>--</span> <a name="line-65"></a><span class='hs-comment'>-- 1998.08.16, last modified 2000.05.31</span> <a name="line-66"></a><span class='hs-comment'>--</span> <a name="line-67"></a><span class='hs-comment'>-- See also bottom of the page for description of the format used</span> <a name="line-68"></a><span class='hs-comment'>-- for continued fractions, references, etc.</span> <a name="line-69"></a><span class='hs-comment'>-------------------------------------------------------------------</span> <a name="line-70"></a> <a name="line-71"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Number</span><span class='hs-varop'>.</span><span class='hs-conid'>FixedFunctions</span> <span class='hs-keyword'>where</span> <a name="line-72"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span><span class='hs-layout'>,</span> <span class='hs-varid'>sqrt</span><span class='hs-layout'>,</span> <span class='hs-varid'>tan</span><span class='hs-layout'>,</span> <span class='hs-varid'>atan</span><span class='hs-layout'>,</span> <span class='hs-varid'>exp</span><span class='hs-layout'>,</span> <span class='hs-varid'>log</span><span class='hs-layout'>)</span> <a name="line-73"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ratio</span> <a name="line-74"></a> <a name="line-75"></a><a name="approx"></a><span class='hs-definition'>approx</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-76"></a><span class='hs-definition'>approx</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxRational</span> <span class='hs-varid'>x</span> <span class='hs-varid'>eps</span> <a name="line-77"></a> <a name="line-78"></a><a name="CF"></a><span class='hs-comment'>------------------------------------------------------------------</span> <a name="line-79"></a><a name="CF"></a><span class='hs-comment'>-- Category: Conversion</span> <a name="line-80"></a><a name="CF"></a><span class='hs-comment'>-- from continued fraction to fraction and vice versa,</span> <a name="line-81"></a><a name="CF"></a><span class='hs-comment'>-- from Taylor series to continued fraction.</span> <a name="line-82"></a><a name="CF"></a><span class='hs-comment'>-------------------------------------------------------------------</span> <a name="line-83"></a><a name="CF"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>CF</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Rational</span><span class='hs-layout'>,</span> <span class='hs-conid'>Rational</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-84"></a> <a name="line-85"></a><a name="fromCF"></a><span class='hs-definition'>fromCF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CF</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-86"></a><span class='hs-definition'>fromCF</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <a name="line-87"></a> <span class='hs-comment'>--</span> <a name="line-88"></a> <span class='hs-comment'>-- Convert finite continued fraction to fraction</span> <a name="line-89"></a> <span class='hs-comment'>-- evaluating from right to left. This is used</span> <a name="line-90"></a> <span class='hs-comment'>-- mainly for testing in conjunction with "toCF".</span> <a name="line-91"></a> <span class='hs-comment'>--</span> <a name="line-92"></a> <span class='hs-varid'>foldr</span> <span class='hs-varid'>g</span> <span class='hs-num'>1</span> <span class='hs-varid'>x</span> <a name="line-93"></a> <span class='hs-keyword'>where</span> <a name="line-94"></a> <span class='hs-varid'>g</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rational</span><span class='hs-layout'>,</span> <span class='hs-conid'>Rational</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-95"></a> <span class='hs-varid'>g</span> <span class='hs-varid'>u</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>snd</span> <span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-varid'>v</span> <a name="line-96"></a> <a name="line-97"></a><a name="toCF"></a><span class='hs-definition'>toCF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CF</span> <a name="line-98"></a><span class='hs-definition'>toCF</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <a name="line-99"></a> <span class='hs-comment'>--</span> <a name="line-100"></a> <span class='hs-comment'>-- Convert fraction to finite continued fraction</span> <a name="line-101"></a> <span class='hs-comment'>--</span> <a name="line-102"></a> <span class='hs-varid'>toCF'</span> <span class='hs-varid'>x</span> <span class='hs-conid'>[]</span> <a name="line-103"></a> <span class='hs-keyword'>where</span> <a name="line-104"></a> <span class='hs-varid'>toCF'</span> <span class='hs-varid'>u</span> <span class='hs-varid'>lst</span> <span class='hs-keyglyph'>=</span> <a name="line-105"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span> <a name="line-106"></a> <span class='hs-num'>0</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>reverse</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>q</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>lst</span><span class='hs-layout'>)</span> <a name="line-107"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>toCF'</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-varop'>%</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>q</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>lst</span><span class='hs-layout'>)</span> <a name="line-108"></a> <span class='hs-keyword'>where</span> <a name="line-109"></a> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>numerator</span> <span class='hs-varid'>u</span> <a name="line-110"></a> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>denominator</span> <span class='hs-varid'>u</span> <a name="line-111"></a> <span class='hs-layout'>(</span><span class='hs-varid'>q</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>quotRem</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-112"></a> <a name="line-113"></a> <a name="line-114"></a><a name="approxCF"></a><span class='hs-definition'>approxCF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CF</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-115"></a><span class='hs-definition'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-116"></a><span class='hs-definition'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-117"></a> <span class='hs-comment'>--</span> <a name="line-118"></a> <span class='hs-comment'>-- Approximate infinite continued fraction x by fraction,</span> <a name="line-119"></a> <span class='hs-comment'>-- evaluating from left to right, and stopping when</span> <a name="line-120"></a> <span class='hs-comment'>-- accuracy eps is achieved, or when a partial numerator</span> <a name="line-121"></a> <span class='hs-comment'>-- is zero -- as it indicates the end of CF.</span> <a name="line-122"></a> <span class='hs-comment'>--</span> <a name="line-123"></a> <span class='hs-comment'>-- This recursive function relates continued fraction</span> <a name="line-124"></a> <span class='hs-comment'>-- to rational approximation.</span> <a name="line-125"></a> <span class='hs-comment'>--</span> <a name="line-126"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF'</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-num'>0</span> <span class='hs-num'>1</span> <span class='hs-num'>1</span> <span class='hs-varid'>q'</span> <span class='hs-varid'>p'</span> <span class='hs-num'>1</span> <a name="line-127"></a> <span class='hs-keyword'>where</span> <a name="line-128"></a> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fst</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>!!</span><span class='hs-num'>0</span><span class='hs-layout'>)</span> <a name="line-129"></a> <span class='hs-layout'>(</span><span class='hs-varid'>q'</span><span class='hs-layout'>,</span> <span class='hs-varid'>p'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span><span class='hs-varop'>!!</span><span class='hs-num'>0</span> <a name="line-130"></a> <span class='hs-varid'>approxCF'</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-varid'>v2</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>u2</span> <span class='hs-varid'>u1</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>n</span> <a name="line-131"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>abs</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>f1</span><span class='hs-varop'>/</span><span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'><</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approx</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>f</span> <a name="line-132"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>a</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approx</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>f</span> <a name="line-133"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF'</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>v</span> <span class='hs-varid'>u1</span> <span class='hs-varid'>u</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <a name="line-134"></a> <span class='hs-keyword'>where</span> <a name="line-135"></a> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span><span class='hs-varop'>!!</span><span class='hs-varid'>n</span> <a name="line-136"></a> <span class='hs-varid'>u</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span><span class='hs-varop'>*</span><span class='hs-varid'>u1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>a'</span><span class='hs-varop'>*</span><span class='hs-varid'>u2</span> <a name="line-137"></a> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span><span class='hs-varop'>*</span><span class='hs-varid'>v1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>a'</span><span class='hs-varop'>*</span><span class='hs-varid'>v2</span> <a name="line-138"></a> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>u</span><span class='hs-varop'>/</span><span class='hs-varid'>v</span> <a name="line-139"></a> <span class='hs-varid'>f1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>u1</span><span class='hs-varop'>/</span><span class='hs-varid'>v1</span> <a name="line-140"></a> <a name="line-141"></a> <a name="line-142"></a><a name="fromTaylorToCF"></a><span class='hs-comment'>-- Type signature determined by GHC.</span> <a name="line-143"></a><span class='hs-definition'>fromTaylorToCF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fractional</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-144"></a><span class='hs-definition'>fromTaylorToCF</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <a name="line-145"></a> <span class='hs-comment'>--</span> <a name="line-146"></a> <span class='hs-comment'>-- Convert infinite number of terms of Taylor expansion of</span> <a name="line-147"></a> <span class='hs-comment'>-- a function f(x) to an infinite continued fraction,</span> <a name="line-148"></a> <span class='hs-comment'>-- where s = [s0,s1,s2,s3....] is a list of Taylor</span> <a name="line-149"></a> <span class='hs-comment'>-- series coefficients, such that f(x)=s0 + s1*x + s2*x^2....</span> <a name="line-150"></a> <span class='hs-comment'>--</span> <a name="line-151"></a> <span class='hs-comment'>-- Require: No Taylor coefficient is zero</span> <a name="line-152"></a> <span class='hs-comment'>--</span> <a name="line-153"></a> <span class='hs-varid'>zero</span><span class='hs-conop'>:</span><span class='hs-varid'>one</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>higher</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'><-</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>2</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span> <a name="line-154"></a> <span class='hs-keyword'>where</span> <a name="line-155"></a> <span class='hs-varid'>zero</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-num'>0</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-num'>1</span> <span class='hs-varop'>*</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-156"></a> <span class='hs-varid'>one</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-comment'>-</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-num'>2</span><span class='hs-varop'>/</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-num'>1</span> <span class='hs-varop'>*</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-157"></a> <span class='hs-varid'>higher</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-varid'>m</span><span class='hs-varop'>/</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-comment'>-</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-varid'>m</span> <span class='hs-varop'>*</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-158"></a> <a name="line-159"></a> <a name="line-160"></a><span class='hs-comment'>------------------------------------------------------------------</span> <a name="line-161"></a><span class='hs-comment'>-- Category: Auxiliaries</span> <a name="line-162"></a><span class='hs-comment'>------------------------------------------------------------------</span> <a name="line-163"></a> <a name="line-164"></a><a name="fac"></a><span class='hs-definition'>fac</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Integer</span> <a name="line-165"></a><span class='hs-definition'>fac</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>product</span> <span class='hs-varop'>.</span> <span class='hs-varid'>enumFromTo</span> <span class='hs-num'>1</span> <a name="line-166"></a> <a name="line-167"></a><a name="integerRoot2"></a><span class='hs-definition'>integerRoot2</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Integer</span> <a name="line-168"></a><span class='hs-definition'>integerRoot2</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <a name="line-169"></a><span class='hs-definition'>integerRoot2</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <a name="line-170"></a> <span class='hs-comment'>--</span> <a name="line-171"></a> <span class='hs-comment'>-- Biggest integer m, such that x - m^2 >= 0,</span> <a name="line-172"></a> <span class='hs-comment'>-- where x is a positive integer</span> <a name="line-173"></a> <span class='hs-comment'>--</span> <a name="line-174"></a> <span class='hs-varid'>integerRoot2'</span> <span class='hs-num'>0</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>`div`</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <a name="line-175"></a> <span class='hs-keyword'>where</span> <a name="line-176"></a> <span class='hs-varid'>integerRoot2'</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>hi</span> <span class='hs-varid'>r</span> <span class='hs-varid'>y</span> <a name="line-177"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-varop'>></span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>integerRoot2'</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-varid'>lo</span><span class='hs-layout'>)</span> <span class='hs-varop'>`div`</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span> <a name="line-178"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <a name="line-179"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a name="line-180"></a> <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-num'>2</span> <span class='hs-varop'>></span> <span class='hs-varid'>y</span> <span class='hs-keyword'>then</span> <a name="line-181"></a> <span class='hs-varid'>r</span> <a name="line-182"></a> <span class='hs-keyword'>else</span> <a name="line-183"></a> <span class='hs-varid'>integerRoot2'</span> <span class='hs-varid'>r</span> <span class='hs-varid'>hi</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-varid'>hi</span><span class='hs-layout'>)</span> <span class='hs-varop'>`div`</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span> <a name="line-184"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span><span class='hs-varop'>^</span><span class='hs-num'>2</span> <a name="line-185"></a> <a name="line-186"></a><span class='hs-comment'>-------------------------------------------------------------------</span> <a name="line-187"></a><span class='hs-comment'>-- Everything below is the instantiation of class Transcendental</span> <a name="line-188"></a><span class='hs-comment'>-- for type Rational. See also modules Cofra and Numerus.</span> <a name="line-189"></a><span class='hs-comment'>--</span> <a name="line-190"></a><span class='hs-comment'>-- Category: Constants</span> <a name="line-191"></a><span class='hs-comment'>-------------------------------------------------------------------</span> <a name="line-192"></a> <a name="line-193"></a><a name="pi"></a><span class='hs-definition'>pi</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-194"></a><span class='hs-definition'>pi</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>=</span> <a name="line-195"></a> <span class='hs-comment'>--</span> <a name="line-196"></a> <span class='hs-comment'>-- pi with accuracy eps</span> <a name="line-197"></a> <span class='hs-comment'>--</span> <a name="line-198"></a> <span class='hs-comment'>-- Based on Ramanujan formula, as described in Ref. 3</span> <a name="line-199"></a> <span class='hs-comment'>-- Accuracy: extremely good, 10^-19 for one term of continued</span> <a name="line-200"></a> <span class='hs-comment'>-- fraction</span> <a name="line-201"></a> <span class='hs-comment'>--</span> <a name="line-202"></a> <span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-layout'>(</span><span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromTaylorToCF</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-203"></a> <span class='hs-keyword'>where</span> <a name="line-204"></a> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-layout'>(</span><span class='hs-num'>640320</span><span class='hs-varop'>^</span><span class='hs-num'>3</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>Rational</span> <a name="line-205"></a> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-varid'>k</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-varid'>fac</span> <span class='hs-layout'>(</span><span class='hs-num'>6</span><span class='hs-varop'>*</span><span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>fac</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-num'>3</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-varid'>fac</span> <span class='hs-layout'>(</span><span class='hs-num'>3</span><span class='hs-varop'>*</span><span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-varop'>*</span><span class='hs-varid'>k</span><span class='hs-varop'>+</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>k</span><span class='hs-keyglyph'><-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span> <a name="line-206"></a> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>545140134</span> <a name="line-207"></a> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>13591409</span> <a name="line-208"></a> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>426880</span> <a name="line-209"></a> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>10005</span> <a name="line-210"></a> <a name="line-211"></a><span class='hs-comment'>---------------------------------------------------------------------</span> <a name="line-212"></a><span class='hs-comment'>-- Category: Trigonometry</span> <a name="line-213"></a><span class='hs-comment'>---------------------------------------------------------------------</span> <a name="line-214"></a> <a name="line-215"></a><a name="tan"></a><span class='hs-definition'>tan</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-216"></a><span class='hs-definition'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-217"></a><span class='hs-definition'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-218"></a> <span class='hs-comment'>--</span> <a name="line-219"></a> <span class='hs-comment'>-- Tangent x computed with accuracy of eps.</span> <a name="line-220"></a> <span class='hs-comment'>--</span> <a name="line-221"></a> <span class='hs-comment'>-- Trigonometric identities are used first to reduce</span> <a name="line-222"></a> <span class='hs-comment'>-- the value of x to a value from within the range of [-pi/2,pi/2]</span> <a name="line-223"></a> <span class='hs-comment'>--</span> <a name="line-224"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>>=</span> <span class='hs-varid'>half_pi'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-comment'>-</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>+</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-varid'>xpi</span><span class='hs-layout'>)</span> <a name="line-225"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'><=</span> <span class='hs-comment'>-</span><span class='hs-varid'>half_pi'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>+</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-varid'>xpi</span><span class='hs-layout'>)</span> <a name="line-226"></a> <span class='hs-comment'>--- | absx > 1 = 2 * t/(1 - t^2)</span> <a name="line-227"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>cf</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-228"></a> <span class='hs-keyword'>where</span> <a name="line-229"></a> <span class='hs-varid'>absx</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>abs</span> <span class='hs-varid'>x</span> <a name="line-230"></a> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-231"></a> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>floor</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>absx</span> <span class='hs-comment'>-</span> <span class='hs-varid'>half_pi</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span> <span class='hs-varid'>xpi</span><span class='hs-layout'>)</span> <a name="line-232"></a> <span class='hs-varid'>xpi</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span> <a name="line-233"></a> <span class='hs-varid'>half_pi'</span><span class='hs-keyglyph'>=</span> <span class='hs-num'>158</span><span class='hs-varop'>%</span><span class='hs-num'>100</span> <a name="line-234"></a> <span class='hs-varid'>half_pi</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>xpi</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-235"></a> <span class='hs-varid'>cf</span> <span class='hs-varid'>u</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-varid'>u</span><span class='hs-layout'>,</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'><-</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <a name="line-236"></a> <a name="line-237"></a><a name="sin"></a><span class='hs-definition'>sin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-238"></a><span class='hs-definition'>sin</span> <span class='hs-varid'>eps</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-239"></a><span class='hs-definition'>sin</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>t</span><span class='hs-varop'>/</span><span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>t</span><span class='hs-varop'>*</span><span class='hs-varid'>t</span><span class='hs-layout'>)</span> <a name="line-240"></a> <span class='hs-keyword'>where</span> <a name="line-241"></a> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-242"></a> <a name="line-243"></a><a name="cos"></a><span class='hs-definition'>cos</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-244"></a><span class='hs-definition'>cos</span> <span class='hs-varid'>eps</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <a name="line-245"></a><span class='hs-definition'>cos</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <a name="line-246"></a> <span class='hs-keyword'>where</span> <a name="line-247"></a> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-248"></a> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span><span class='hs-varop'>*</span><span class='hs-varid'>t</span> <a name="line-249"></a> <a name="line-250"></a><a name="atan"></a><span class='hs-definition'>atan</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-251"></a><span class='hs-definition'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-252"></a> <span class='hs-comment'>--</span> <a name="line-253"></a> <span class='hs-comment'>-- Inverse tangent of x with approximation eps</span> <a name="line-254"></a> <span class='hs-comment'>--</span> <a name="line-255"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-256"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>></span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-num'>2</span> <span class='hs-comment'>-</span> <span class='hs-varid'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-257"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'><</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-num'>2</span> <span class='hs-comment'>-</span> <span class='hs-varid'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-258"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>m</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>*</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>m</span><span class='hs-keyglyph'><-</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <a name="line-259"></a> <a name="line-260"></a> <a name="line-261"></a><a name="asin"></a><span class='hs-definition'>asin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-262"></a><span class='hs-definition'>asin</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-263"></a> <span class='hs-comment'>--</span> <a name="line-264"></a> <span class='hs-comment'>-- Inverse sine of x with approximation eps</span> <a name="line-265"></a> <span class='hs-comment'>--</span> <a name="line-266"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-267"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>abs</span> <span class='hs-varid'>x</span> <span class='hs-varop'>></span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Fraction.asin"</span> <a name="line-268"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-269"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-270"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>/</span> <span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>x</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-271"></a> <a name="line-272"></a> <a name="line-273"></a><a name="acos"></a><span class='hs-definition'>acos</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-274"></a><span class='hs-definition'>acos</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-275"></a> <span class='hs-comment'>--</span> <a name="line-276"></a> <span class='hs-comment'>-- Inverse cosine of x with approximation eps</span> <a name="line-277"></a> <span class='hs-comment'>--</span> <a name="line-278"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-279"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>abs</span> <span class='hs-varid'>x</span> <span class='hs-varop'>></span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Fraction.sin"</span> <a name="line-280"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-281"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span> <a name="line-282"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>x</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-283"></a> <a name="line-284"></a><span class='hs-comment'>---------------------------------------------------------------------</span> <a name="line-285"></a><span class='hs-comment'>-- Category: Roots</span> <a name="line-286"></a><span class='hs-comment'>---------------------------------------------------------------------</span> <a name="line-287"></a> <a name="line-288"></a><a name="sqrt"></a><span class='hs-definition'>sqrt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-289"></a><span class='hs-definition'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-290"></a> <span class='hs-comment'>--</span> <a name="line-291"></a> <span class='hs-comment'>-- Square root of x with approximation eps</span> <a name="line-292"></a> <span class='hs-comment'>--</span> <a name="line-293"></a> <span class='hs-comment'>-- The CF pattern is: [(m,x-m^2),(2m,x-m^2),(2m,x-m^2)....]</span> <a name="line-294"></a> <span class='hs-comment'>-- where m is the biggest integer such that x-m^2 >= 0</span> <a name="line-295"></a> <span class='hs-comment'>--</span> <a name="line-296"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'><</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Fraction.sqrt"</span> <a name="line-297"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-298"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'><</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-299"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-comment'>-</span><span class='hs-varid'>m</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-comment'>-</span><span class='hs-varid'>m</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span><span class='hs-keyglyph'><-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <a name="line-300"></a> <span class='hs-keyword'>where</span> <a name="line-301"></a> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>integerRoot2</span> <span class='hs-layout'>(</span><span class='hs-varid'>floor</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-num'>1</span> <a name="line-302"></a> <a name="line-303"></a><span class='hs-comment'>---------------------------------------------------------------------</span> <a name="line-304"></a><span class='hs-comment'>-- Category: Exponentials and hyperbolics</span> <a name="line-305"></a><span class='hs-comment'>---------------------------------------------------------------------</span> <a name="line-306"></a> <a name="line-307"></a><a name="exp"></a><span class='hs-definition'>exp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-308"></a><span class='hs-definition'>exp</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-309"></a> <span class='hs-comment'>--</span> <a name="line-310"></a> <span class='hs-comment'>-- Exponent of x with approximation eps</span> <a name="line-311"></a> <span class='hs-comment'>--</span> <a name="line-312"></a> <span class='hs-comment'>-- Based on Jacobi type continued fraction for exponential,</span> <a name="line-313"></a> <span class='hs-comment'>-- with fractional terms:</span> <a name="line-314"></a> <span class='hs-comment'>-- n == 0 ==> (1,x)</span> <a name="line-315"></a> <span class='hs-comment'>-- n == 1 ==> (1 -x/2, x^2/12)</span> <a name="line-316"></a> <span class='hs-comment'>-- n >= 2 ==> (1, x^2/(16*n^2 - 4))</span> <a name="line-317"></a> <span class='hs-comment'>-- For x outside [-1,1] apply identity exp(x) = (exp(x/2))^2</span> <a name="line-318"></a> <span class='hs-comment'>--</span> <a name="line-319"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <a name="line-320"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>></span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-varid'>p</span> <a name="line-321"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'><</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-varid'>q</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-varid'>q</span> <a name="line-322"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-323"></a> <span class='hs-keyword'>where</span> <a name="line-324"></a> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ceiling</span> <span class='hs-varid'>x</span> <a name="line-325"></a> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-layout'>(</span><span class='hs-varid'>floor</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-326"></a> <span class='hs-varid'>f</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-comment'>-</span><span class='hs-varid'>y</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-varop'>/</span><span class='hs-num'>12</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-varop'>/</span><span class='hs-layout'>(</span><span class='hs-num'>16</span><span class='hs-varop'>*</span><span class='hs-varid'>n</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-comment'>-</span><span class='hs-num'>4</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span><span class='hs-keyglyph'><-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>2</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span> <a name="line-327"></a> <a name="line-328"></a> <a name="line-329"></a><a name="cosh"></a><span class='hs-definition'>cosh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-330"></a><span class='hs-definition'>cosh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <a name="line-331"></a> <span class='hs-comment'>--</span> <a name="line-332"></a> <span class='hs-comment'>-- Hyperbolic cosine with approximation eps</span> <a name="line-333"></a> <span class='hs-comment'>--</span> <a name="line-334"></a> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>+</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-335"></a> <span class='hs-keyword'>where</span> <a name="line-336"></a> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exp</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-337"></a> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>a</span> <a name="line-338"></a> <a name="line-339"></a><a name="sinh"></a><span class='hs-definition'>sinh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-340"></a><span class='hs-definition'>sinh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <a name="line-341"></a> <span class='hs-comment'>--</span> <a name="line-342"></a> <span class='hs-comment'>-- Hyperbolic sine with approximation eps</span> <a name="line-343"></a> <span class='hs-comment'>--</span> <a name="line-344"></a> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-comment'>-</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <a name="line-345"></a> <span class='hs-keyword'>where</span> <a name="line-346"></a> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exp</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-347"></a> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>a</span> <a name="line-348"></a> <a name="line-349"></a><a name="tanh"></a><span class='hs-definition'>tanh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-350"></a><span class='hs-definition'>tanh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <a name="line-351"></a> <span class='hs-comment'>--</span> <a name="line-352"></a> <span class='hs-comment'>-- Hyperbolic tangent with approximation eps</span> <a name="line-353"></a> <span class='hs-comment'>--</span> <a name="line-354"></a> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-comment'>-</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>+</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <a name="line-355"></a> <span class='hs-keyword'>where</span> <a name="line-356"></a> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exp</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-357"></a> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>a</span> <a name="line-358"></a> <a name="line-359"></a><a name="atanh"></a><span class='hs-definition'>atanh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-360"></a><span class='hs-definition'>atanh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-361"></a> <span class='hs-comment'>--</span> <a name="line-362"></a> <span class='hs-comment'>-- Inverse hyperbolic tangent with approximation eps</span> <a name="line-363"></a> <span class='hs-comment'>--</span> <a name="line-364"></a> <a name="line-365"></a><span class='hs-comment'>-- | x >= 1 = 1%0</span> <a name="line-366"></a><span class='hs-comment'>-- | x <= -1 = -1%0</span> <a name="line-367"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-varid'>log</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-368"></a> <a name="line-369"></a><a name="asinh"></a><span class='hs-definition'>asinh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-370"></a><span class='hs-definition'>asinh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-371"></a> <span class='hs-comment'>--</span> <a name="line-372"></a> <span class='hs-comment'>-- Inverse hyperbolic sine</span> <a name="line-373"></a> <span class='hs-comment'>--</span> <a name="line-374"></a><span class='hs-comment'>-- | x == 1%0 = 1%0</span> <a name="line-375"></a><span class='hs-comment'>-- | x == -1%0 = -1%0</span> <a name="line-376"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>log</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>^</span><span class='hs-num'>2</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-377"></a> <a name="line-378"></a><a name="acosh"></a><span class='hs-definition'>acosh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-379"></a><span class='hs-definition'>acosh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-380"></a> <span class='hs-comment'>--</span> <a name="line-381"></a> <span class='hs-comment'>-- Inverse hyperbolic cosine</span> <a name="line-382"></a> <span class='hs-comment'>--</span> <a name="line-383"></a><span class='hs-comment'>-- | x == 1%0 = 1%0</span> <a name="line-384"></a><span class='hs-comment'>-- | x < 1 = 1%0</span> <a name="line-385"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>log</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>^</span><span class='hs-num'>2</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-386"></a> <a name="line-387"></a><span class='hs-comment'>---------------------------------------------------------------------</span> <a name="line-388"></a><span class='hs-comment'>-- Category: Logarithms</span> <a name="line-389"></a><span class='hs-comment'>---------------------------------------------------------------------</span> <a name="line-390"></a> <a name="line-391"></a><a name="log"></a><span class='hs-definition'>log</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rational</span> <a name="line-392"></a><span class='hs-definition'>log</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <a name="line-393"></a> <span class='hs-comment'>--</span> <a name="line-394"></a> <span class='hs-comment'>-- Natural logarithm of strictly positive x</span> <a name="line-395"></a> <span class='hs-comment'>--</span> <a name="line-396"></a> <span class='hs-comment'>-- Based on Stieltjes type continued fraction for log (1+y)</span> <a name="line-397"></a> <span class='hs-comment'>-- (0,y):(1,y/2):[(1,my/(4m+2)),(1,(m+1)y/(4m+2)),....</span> <a name="line-398"></a> <span class='hs-comment'>-- (m >= 1, two elements per m)</span> <a name="line-399"></a> <span class='hs-comment'>-- Efficient only for x close to one. For larger x we recursively</span> <a name="line-400"></a> <span class='hs-comment'>-- apply the identity log(x) = log(x/2) + log(2)</span> <a name="line-401"></a> <span class='hs-comment'>--</span> <a name="line-402"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'><=</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Fraction.log"</span> <a name="line-403"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'><</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-varid'>log</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-404"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-405"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a name="line-406"></a> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>scaled</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <a name="line-407"></a> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>series</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <a name="line-408"></a> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span><span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>series</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-409"></a> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>series</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>series</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <a name="line-410"></a> <span class='hs-keyword'>where</span> <a name="line-411"></a> <span class='hs-varid'>series</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CF</span> <a name="line-412"></a> <span class='hs-varid'>series</span> <span class='hs-varid'>u</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>+</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-layout'>(</span><span class='hs-num'>4</span><span class='hs-varop'>*</span><span class='hs-varid'>m</span> <span class='hs-varop'>+</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>|</span><span class='hs-varid'>m</span><span class='hs-keyglyph'><-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-keyglyph'><-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-num'>1</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span> <a name="line-413"></a> <span class='hs-varid'>scaled</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rational</span><span class='hs-layout'>,</span><span class='hs-conid'>Integer</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Rational</span><span class='hs-layout'>,</span> <span class='hs-conid'>Integer</span><span class='hs-layout'>)</span> <a name="line-414"></a> <span class='hs-varid'>scaled</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <a name="line-415"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>2</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <a name="line-416"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'><</span> <span class='hs-num'>2</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <a name="line-417"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>scaled</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <a name="line-418"></a> <a name="line-419"></a> <a name="line-420"></a><span class='hs-comment'>---------------------------------------------------------------------------</span> <a name="line-421"></a><span class='hs-comment'>-- References:</span> <a name="line-422"></a><span class='hs-comment'>--</span> <a name="line-423"></a><span class='hs-comment'>-- 1. Classical Gosper notes on continued fraction arithmetic:</span> <a name="line-424"></a><span class='hs-comment'>-- http:%www.inwap.com/pdp10/hbaker/hakmem/cf.html</span> <a name="line-425"></a><span class='hs-comment'>-- 2. Pages on numerical constants represented as continued fractions:</span> <a name="line-426"></a><span class='hs-comment'>-- http:%www.mathsoft.com/asolve/constant/cntfrc/cntfrc.html</span> <a name="line-427"></a><span class='hs-comment'>-- 3. "Efficient on-line computation of real functions using exact floating</span> <a name="line-428"></a><span class='hs-comment'>-- point", by Peter John Potts, Imperial College</span> <a name="line-429"></a><span class='hs-comment'>-- http:%theory.doc.ic.ac.uk/~pjp/ieee.html</span> <a name="line-430"></a><span class='hs-comment'>--------------------------------------------------------------------------</span> <a name="line-431"></a> <a name="line-432"></a><span class='hs-comment'>--------------------------------------------------------------------------</span> <a name="line-433"></a> <a name="line-434"></a><span class='hs-comment'>-- The following representation of continued fractions is used:</span> <a name="line-435"></a><span class='hs-comment'>--</span> <a name="line-436"></a><span class='hs-comment'>-- Continued fraction: CF representation:</span> <a name="line-437"></a><span class='hs-comment'>-- ================== ====================</span> <a name="line-438"></a><span class='hs-comment'>-- b0 + a0</span> <a name="line-439"></a><span class='hs-comment'>-- ------- ==> [(b0, a0), (b1, a1), (b2, a2).....]</span> <a name="line-440"></a><span class='hs-comment'>-- b1 + a1</span> <a name="line-441"></a><span class='hs-comment'>-- -------</span> <a name="line-442"></a><span class='hs-comment'>-- b2 + ...</span> <a name="line-443"></a><span class='hs-comment'>--</span> <a name="line-444"></a><span class='hs-comment'>-- where "a's" and "b's" are Rationals.</span> <a name="line-445"></a><span class='hs-comment'>--</span> <a name="line-446"></a><span class='hs-comment'>-- Many continued fractions could be represented by much simpler form</span> <a name="line-447"></a><span class='hs-comment'>-- [b1,b2,b3,b4..], where all coefficients "a" would have the same value 1</span> <a name="line-448"></a><span class='hs-comment'>-- and would not need to be explicitely listed; and the coefficients "b"</span> <a name="line-449"></a><span class='hs-comment'>-- could be chosen as integers.</span> <a name="line-450"></a><span class='hs-comment'>-- However, there are some useful continued fractions that are</span> <a name="line-451"></a><span class='hs-comment'>-- given with fraction coefficients: "a", "b" or both.</span> <a name="line-452"></a><span class='hs-comment'>-- A fractional form can always be converted to an integer form, but</span> <a name="line-453"></a><span class='hs-comment'>-- a conversion process is not always simple and such an effort is not</span> <a name="line-454"></a><span class='hs-comment'>-- always worth of the achieved savings in the storage space or the</span> <a name="line-455"></a><span class='hs-comment'>-- computational efficiency.</span> <a name="line-456"></a><span class='hs-comment'>--</span> <a name="line-457"></a><span class='hs-comment'>----------------------------------------------------------------------------</span> <a name="line-458"></a><span class='hs-comment'>--</span> <a name="line-459"></a><span class='hs-comment'>-- Copyright:</span> <a name="line-460"></a><span class='hs-comment'>--</span> <a name="line-461"></a><span class='hs-comment'>-- (C) 1998 Numeric Quest, All rights reserved</span> <a name="line-462"></a><span class='hs-comment'>--</span> <a name="line-463"></a><span class='hs-comment'>-- <jans@numeric-quest.com></span> <a name="line-464"></a><span class='hs-comment'>--</span> <a name="line-465"></a><span class='hs-comment'>-- <a href="http://www.numeric-quest.com">http://www.numeric-quest.com</a></span> <a name="line-466"></a><span class='hs-comment'>--</span> <a name="line-467"></a><span class='hs-comment'>-- License:</span> <a name="line-468"></a><span class='hs-comment'>--</span> <a name="line-469"></a><span class='hs-comment'>-- GNU General Public License, GPL</span> <a name="line-470"></a><span class='hs-comment'>--</span> <a name="line-471"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span> </pre></body> </html>