axiom-developer
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Axiom-developer] [FormalFraction] (new)


From: Bill Page
Subject: [Axiom-developer] [FormalFraction] (new)
Date: Wed, 31 Aug 2005 14:55:59 -0500

Changes http://www.axiom-developer.org/zope/mathaction/FormalFraction/diff
--
Author -- M.G. Richardson

Date Created -- 1996 Jan. 23

Related Constructors -- Fraction

URL -- 
http://page.axiom-developer.org/repository/axiom--main--1/src/algebra/ffrac.as.pamphlet

N.B. --  ndftip.as inlines this, must be recompiled if this is.

Description:

 This type represents formal fractions - that is, pairs displayed as
 fractions with no simplification.

 If the elements of the pair have a type X which is an integral
 domain, a FFRAC X can be coerced to a FRAC X, provided that this
 is a valid type.  A FRAC X can always be coerced to a FFRAC X.
 If the type of the elements is a Field, a FFRAC X can be coerced
 to X.

 Formal fractions are used to return results from numerical methods
 which determine numerator and denominator separately, to enable
 users to inspect these components and recognise, for example,
 ratios of very small numbers as potentially indeterminate.

\begin{aldor}
#include "axiom.as"

FFRAC ==> FormalFraction ;
 
OF    ==> OutputForm ;
SC    ==> SetCategory ;
FRAC  ==> Fraction ;
ID    ==> IntegralDomain ;

FormalFraction(X : SC) : SC with {

-- Could generalise further to allow numerator and denominator to be of
-- different types, X and Y, both SCs.  "Left as an exercise."

  / : (X,X) -> % ;
++ / forms the formal quotient of two items.

  numer : % -> X ;
++ numer returns the numerator of a FormalFraction.

  denom : % -> X ;
++ denom returns the denominator of a FormalFraction.

  if X has ID then {
  
    coerce : % -> FRAC(X pretend ID) ;
++ coerce x converts a FormalFraction over an IntegralDomain to a
++ Fraction over that IntegralDomain.

    coerce : FRAC(X pretend ID) -> % ;
++ coerce converts a Fraction to a FormalFraction.

  }

  if X has Field then coerce : % -> (X pretend Field) ;

} == add {

  import from Record(num : X, den : X) ;
  
  Rep == Record(num : X, den : X) ; -- representation

  ((x : %) = (y : %)) : Boolean ==
    ((rep(x).num = rep(y).num) and (rep(x).den = rep(y).den)) ;

  ((n : X)/(d : X)) : % == per(record(n,d)) ;

  coerce(r : %) : OF == (rep(r).num :: OF) / (rep(r).den :: OF) ;

  numer(r : %) : X == rep(r).num ;

  denom(r : %) : X == rep(r).den ;

  if X has ID then {
 
    coerce(r : %) : FRAC(X pretend ID)
      == ((rep(r).num)/(rep(r).den)) @ (FRAC(X pretend ID)) ;

    coerce(x : FRAC(X pretend ID)) : % == x pretend % ; 

  }

  if X has Field then coerce(r : %) : (X pretend Field)
    == ((rep(r).num)/(rep(r).den)) $ (X pretend Field) ;

}
\end{aldor}

\begin{axiom}
f1 : FormalFraction Integer
f1 := 6/3

--       6
--       -
--       3

f2 := (3.6/2.4)$FormalFraction Float

--       3.6
--       ---
--       2.4

numer f1

--       6

denom f2

--       2.4

f1 :: FRAC INT

--       2

% :: FormalFraction Integer      

--       2
--       -
--       1

f2 :: Float

--       1.5

\end{axiom}
--
forwarded from http://www.axiom-developer.org/zope/mathaction/address@hidden




reply via email to

[Prev in Thread] Current Thread [Next in Thread]