TextSweep

Hex Artifact Content
Login

Artifact 5ec339329e5044b62760c33e9bc0ed7056cf35b3:


0000: 23 20 72 61 74 69 6f 6e 61 6c 5f 66 75 6e 63 73  # rational_funcs
0010: 2e 74 63 6c 20 2d 2d 0a 23 20 20 20 20 49 6d 70  .tcl --.#    Imp
0020: 6c 65 6d 65 6e 74 20 70 72 6f 63 65 64 75 72 65  lement procedure
0030: 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 72  s to deal with r
0040: 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f 6e  ational function
0050: 73 0a 23 0a 0a 70 61 63 6b 61 67 65 20 72 65 71  s.#..package req
0060: 75 69 72 65 20 6d 61 74 68 3a 3a 70 6f 6c 79 6e  uire math::polyn
0070: 6f 6d 69 61 6c 73 0a 0a 6e 61 6d 65 73 70 61 63  omials..namespac
0080: 65 20 65 76 61 6c 20 3a 3a 6d 61 74 68 3a 3a 72  e eval ::math::r
0090: 61 74 69 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73  ationalfunctions
00a0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
00b0: 63 6f 75 6e 74 20 30 20 20 3b 23 20 43 6f 75 6e  count 0  ;# Coun
00c0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
00d0: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
00e0: 73 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  s.    namespace 
00f0: 65 76 61 6c 20 76 20 7b 7d 0a 0a 20 20 20 20 6e  eval v {}..    n
0100: 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20  amespace export 
0110: 72 61 74 69 6f 6e 61 6c 46 75 6e 63 74 69 6f 6e  rationalFunction
0120: 20 72 61 74 69 6f 43 6d 64 20 65 76 61 6c 52 61   ratioCmd evalRa
0130: 74 69 6f 20 5c 0a 20 20 20 20 20 20 20 20 20 20  tio \.          
0140: 20 20 20 20 20 20 20 20 20 20 20 63 6f 65 66 66             coeff
0150: 73 4e 75 6d 65 72 61 74 6f 72 20 63 6f 65 66 66  sNumerator coeff
0160: 73 44 65 6e 6f 6d 69 6e 61 74 6f 72 20 5c 0a 20  sDenominator \. 
0170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0180: 20 20 20 20 64 65 72 69 76 52 61 74 69 6f 20 20      derivRatio  
0190: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
01a0: 20 20 20 20 20 20 20 61 64 64 52 61 74 69 6f 20         addRatio 
01b0: 20 20 20 73 75 62 52 61 74 69 6f 20 6d 75 6c 74     subRatio mult
01c0: 52 61 74 69 6f 20 5c 0a 20 20 20 20 20 20 20 20  Ratio \.        
01d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 76               div
01e0: 52 61 74 69 6f 0a 0a 20 20 20 20 6e 61 6d 65 73  Ratio..    names
01f0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 6d 61  pace import ::ma
0200: 74 68 3a 3a 70 6f 6c 79 6e 6f 6d 69 61 6c 73 3a  th::polynomials:
0210: 3a 2a 0a 7d 0a 0a 0a 23 20 72 61 74 69 6f 6e 61  :*.}...# rationa
0220: 6c 46 75 6e 63 74 69 6f 6e 20 2d 2d 0a 23 20 20  lFunction --.#  
0230: 20 20 52 65 74 75 72 6e 20 61 20 72 61 74 69 6f    Return a ratio
0240: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  nal function def
0250: 69 6e 69 74 69 6f 6e 0a 23 0a 23 20 41 72 67 75  inition.#.# Argu
0260: 6d 65 6e 74 73 3a 0a 23 20 20 20 20 6e 75 6d 20  ments:.#    num 
0270: 20 20 20 20 20 20 20 20 20 54 68 65 20 63 6f 65           The coe
0280: 66 66 69 63 69 65 6e 74 73 20 6f 66 20 74 68 65  fficients of the
0290: 20 6e 75 6d 65 72 61 74 6f 72 0a 23 20 20 20 20   numerator.#    
02a0: 64 65 6e 20 20 20 20 20 20 20 20 20 20 54 68 65  den          The
02b0: 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 6f 66   coefficients of
02c0: 20 74 68 65 20 64 65 6e 6f 6d 69 6e 61 74 6f 72   the denominator
02d0: 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20  .# Result:.#    
02e0: 52 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f  Rational functio
02f0: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 0a 23 0a 70  n definition.#.p
0300: 72 6f 63 20 3a 3a 6d 61 74 68 3a 3a 72 61 74 69  roc ::math::rati
0310: 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 72  onalfunctions::r
0320: 61 74 69 6f 6e 61 6c 46 75 6e 63 74 69 6f 6e 20  ationalFunction 
0330: 7b 6e 75 6d 20 64 65 6e 7d 20 7b 0a 0a 20 20 20  {num den} {..   
0340: 20 66 6f 72 65 61 63 68 20 63 6f 65 66 66 73 20   foreach coeffs 
0350: 5b 6c 69 73 74 20 24 6e 75 6d 20 24 64 65 6e 5d  [list $num $den]
0360: 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61   {.        forea
0370: 63 68 20 63 6f 65 66 66 20 24 63 6f 65 66 66 73  ch coeff $coeffs
0380: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
0390: 66 20 7b 20 21 20 5b 73 74 72 69 6e 67 20 69 73  f { ! [string is
03a0: 20 64 6f 75 62 6c 65 20 2d 73 74 72 69 63 74 20   double -strict 
03b0: 24 63 6f 65 66 66 5d 20 7d 20 7b 0a 20 20 20 20  $coeff] } {.    
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
03d0: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22  rn -code error "
03e0: 43 6f 65 66 66 69 63 69 65 6e 74 73 20 6d 75 73  Coefficients mus
03f0: 74 20 62 65 20 72 65 61 6c 20 6e 75 6d 62 65 72  t be real number
0400: 73 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  s".            }
0410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
0420: 0a 0a 20 20 20 20 23 0a 20 20 20 20 23 20 54 68  ..    #.    # Th
0430: 65 20 6c 65 61 64 69 6e 67 20 63 6f 65 66 66 69  e leading coeffi
0440: 63 69 65 6e 74 20 6d 75 73 74 20 62 65 20 6e 6f  cient must be no
0450: 6e 2d 7a 65 72 6f 0a 20 20 20 20 23 0a 20 20 20  n-zero.    #.   
0460: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 52 41   return [list RA
0470: 54 49 4f 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 20  TIONAL_FUNCTION 
0480: 5b 70 6f 6c 79 6e 6f 6d 69 61 6c 20 24 6e 75 6d  [polynomial $num
0490: 5d 20 5b 70 6f 6c 79 6e 6f 6d 69 61 6c 20 24 64  ] [polynomial $d
04a0: 65 6e 5d 5d 0a 7d 0a 0a 23 20 72 61 74 69 6f 43  en]].}..# ratioC
04b0: 6d 64 20 2d 2d 0a 23 20 20 20 20 52 65 74 75 72  md --.#    Retur
04c0: 6e 20 61 20 70 72 6f 63 65 64 75 72 65 20 74 68  n a procedure th
04d0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  at implements a 
04e0: 72 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f  rational functio
04f0: 6e 20 65 76 61 6c 75 61 74 69 6f 6e 0a 23 0a 23  n evaluation.#.#
0500: 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20   Arguments:.#   
0510: 20 6e 75 6d 20 20 20 20 20 20 20 20 20 20 54 68   num          Th
0520: 65 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 6f  e coefficients o
0530: 66 20 74 68 65 20 6e 75 6d 65 72 61 74 6f 72 0a  f the numerator.
0540: 23 20 20 20 20 64 65 6e 20 20 20 20 20 20 20 20  #    den        
0550: 20 20 54 68 65 20 63 6f 65 66 66 69 63 69 65 6e    The coefficien
0560: 74 73 20 6f 66 20 74 68 65 20 64 65 6e 6f 6d 69  ts of the denomi
0570: 6e 61 74 6f 72 0a 23 20 52 65 73 75 6c 74 3a 0a  nator.# Result:.
0580: 23 20 20 20 20 4e 65 77 20 70 72 6f 63 65 64 75  #    New procedu
0590: 72 65 0a 23 0a 70 72 6f 63 20 3a 3a 6d 61 74 68  re.#.proc ::math
05a0: 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74 69  ::rationalfuncti
05b0: 6f 6e 73 3a 3a 72 61 74 69 6f 43 6d 64 20 7b 6e  ons::ratioCmd {n
05c0: 75 6d 20 7b 64 65 6e 20 7b 7d 7d 7d 20 7b 0a 20  um {den {}}} {. 
05d0: 20 20 20 76 61 72 69 61 62 6c 65 20 63 6f 75 6e     variable coun
05e0: 74 0a 0a 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65  t..    if { [lle
05f0: 6e 67 74 68 20 24 64 65 6e 5d 20 3d 3d 20 30 20  ngth $den] == 0 
0600: 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  } {.        if {
0610: 20 5b 6c 69 6e 64 65 78 20 24 6e 75 6d 20 30 5d   [lindex $num 0]
0620: 20 3d 3d 20 22 52 41 54 49 4f 4e 41 4c 5f 46 55   == "RATIONAL_FU
0630: 4e 43 54 49 4f 4e 22 20 7d 20 7b 0a 20 20 20 20  NCTION" } {.    
0640: 20 20 20 20 20 20 20 20 73 65 74 20 64 65 6e 20          set den 
0650: 5b 6c 69 6e 64 65 78 20 24 6e 75 6d 20 32 5d 0a  [lindex $num 2].
0660: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
0670: 6e 75 6d 20 5b 6c 69 6e 64 65 78 20 24 6e 75 6d  num [lindex $num
0680: 20 31 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1].        }.  
0690: 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 64 65 67    }..    set deg
06a0: 72 65 65 31 20 5b 65 78 70 72 20 7b 5b 6c 6c 65  ree1 [expr {[lle
06b0: 6e 67 74 68 20 24 6e 75 6d 5d 2d 31 7d 5d 0a 20  ngth $num]-1}]. 
06c0: 20 20 20 73 65 74 20 64 65 67 72 65 65 32 20 5b     set degree2 [
06d0: 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  expr {[llength $
06e0: 6e 75 6d 5d 2d 31 7d 5d 0a 20 20 20 20 73 65 74  num]-1}].    set
06f0: 20 62 6f 64 79 20 22 65 78 70 72 20 5c 7b 28 5b   body "expr \{([
0700: 6a 6f 69 6e 20 24 6e 75 6d 20 2b 5c 24 78 2a 28  join $num +\$x*(
0710: 5d 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20  ][string repeat 
0720: 29 20 24 64 65 67 72 65 65 31 5d 29 2f 5c 0a 28  ) $degree1])/\.(
0730: 64 6f 75 62 6c 65 28 5b 6a 6f 69 6e 20 24 64 65  double([join $de
0740: 6e 20 2b 5c 24 78 2a 28 5d 5b 73 74 72 69 6e 67  n +\$x*(][string
0750: 20 72 65 70 65 61 74 20 29 20 24 64 65 67 72 65   repeat ) $degre
0760: 65 32 5d 29 5c 7d 22 0a 0a 20 20 20 20 69 6e 63  e2])\}"..    inc
0770: 72 20 63 6f 75 6e 74 0a 20 20 20 20 73 65 74 20  r count.    set 
0780: 6e 61 6d 65 20 22 3a 3a 6d 61 74 68 3a 3a 72 61  name "::math::ra
0790: 74 69 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a  tionalfunctions:
07a0: 3a 76 3a 3a 52 41 54 49 4f 24 63 6f 75 6e 74 22  :v::RATIO$count"
07b0: 0a 20 20 20 20 70 72 6f 63 20 24 6e 61 6d 65 20  .    proc $name 
07c0: 7b 78 7d 20 24 62 6f 64 79 0a 20 20 20 20 72 65  {x} $body.    re
07d0: 74 75 72 6e 20 24 6e 61 6d 65 0a 7d 0a 0a 23 20  turn $name.}..# 
07e0: 65 76 61 6c 52 61 74 69 6f 20 2d 2d 0a 23 20 20  evalRatio --.#  
07f0: 20 20 45 76 61 6c 75 61 74 65 20 61 20 72 61 74    Evaluate a rat
0800: 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 20 61  ional function a
0810: 74 20 61 20 67 69 76 65 6e 20 63 6f 6f 72 64 69  t a given coordi
0820: 6e 61 74 65 0a 23 0a 23 20 41 72 67 75 6d 65 6e  nate.#.# Argumen
0830: 74 73 3a 0a 23 20 20 20 20 72 61 74 69 6f 20 20  ts:.#    ratio  
0840: 20 20 20 20 20 20 52 61 74 69 6f 6e 61 6c 20 66        Rational f
0850: 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
0860: 6f 6e 0a 23 20 20 20 20 78 20 20 20 20 20 20 20  on.#    x       
0870: 20 20 20 20 20 43 6f 6f 72 64 69 6e 61 74 65 0a       Coordinate.
0880: 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20 56  # Result:.#    V
0890: 61 6c 75 65 20 61 74 20 78 0a 23 0a 70 72 6f 63  alue at x.#.proc
08a0: 20 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61   ::math::rationa
08b0: 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 65 76 61 6c  lfunctions::eval
08c0: 52 61 74 69 6f 20 7b 72 61 74 69 6f 20 78 7d 20  Ratio {ratio x} 
08d0: 7b 0a 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64  {.    if { [lind
08e0: 65 78 20 24 72 61 74 69 6f 20 30 5d 20 21 3d 20  ex $ratio 0] != 
08f0: 22 52 41 54 49 4f 4e 41 4c 5f 46 55 4e 43 54 49  "RATIONAL_FUNCTI
0900: 4f 4e 22 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  ON" } {.        
0910: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
0920: 6f 72 20 22 4e 6f 74 20 61 20 72 61 74 69 6f 6e  or "Not a ration
0930: 61 6c 20 66 75 6e 63 74 69 6f 6e 22 0a 20 20 20  al function".   
0940: 20 7d 0a 20 20 20 20 69 66 20 7b 20 21 20 5b 73   }.    if { ! [s
0950: 74 72 69 6e 67 20 69 73 20 64 6f 75 62 6c 65 20  tring is double 
0960: 24 78 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  $x] } {.        
0970: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
0980: 6f 72 20 22 43 6f 6f 72 64 69 6e 61 74 65 20 6d  or "Coordinate m
0990: 75 73 74 20 62 65 20 61 20 72 65 61 6c 20 6e 75  ust be a real nu
09a0: 6d 62 65 72 22 0a 20 20 20 20 7d 0a 0a 20 20 20  mber".    }..   
09b0: 20 73 65 74 20 6e 75 6d 20 30 2e 30 0a 20 20 20   set num 0.0.   
09c0: 20 66 6f 72 65 61 63 68 20 63 20 5b 6c 69 6e 64   foreach c [lind
09d0: 65 78 20 5b 6c 69 6e 64 65 78 20 24 72 61 74 69  ex [lindex $rati
09e0: 6f 20 31 5d 20 31 5d 20 7b 0a 20 20 20 20 20 20  o 1] 1] {.      
09f0: 20 20 73 65 74 20 6e 75 6d 20 5b 65 78 70 72 20    set num [expr 
0a00: 7b 24 6e 75 6d 2a 24 78 2b 24 63 7d 5d 0a 20 20  {$num*$x+$c}].  
0a10: 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 64 65 6e    }..    set den
0a20: 20 30 2e 30 0a 20 20 20 20 66 6f 72 65 61 63 68   0.0.    foreach
0a30: 20 63 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e 64   c [lindex [lind
0a40: 65 78 20 24 72 61 74 69 6f 20 32 5d 20 31 5d 20  ex $ratio 2] 1] 
0a50: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 65  {.        set de
0a60: 6e 20 5b 65 78 70 72 20 7b 24 64 65 6e 2a 24 78  n [expr {$den*$x
0a70: 2b 24 63 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20  +$c}].    }.    
0a80: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e  return [expr {$n
0a90: 75 6d 2f 64 6f 75 62 6c 65 28 24 64 65 6e 29 7d  um/double($den)}
0aa0: 5d 0a 7d 0a 0a 23 20 63 6f 65 66 66 73 4e 75 6d  ].}..# coeffsNum
0ab0: 65 72 61 74 6f 72 20 2d 2d 0a 23 20 20 20 20 52  erator --.#    R
0ac0: 65 74 75 72 6e 20 74 68 65 20 63 6f 65 66 66 69  eturn the coeffi
0ad0: 63 69 65 6e 74 73 20 6f 66 20 74 68 65 20 6e 75  cients of the nu
0ae0: 6d 65 72 61 74 6f 72 0a 23 0a 23 20 41 72 67 75  merator.#.# Argu
0af0: 6d 65 6e 74 73 3a 0a 23 20 20 20 20 72 61 74 69  ments:.#    rati
0b00: 6f 20 20 20 20 20 20 20 20 52 61 74 69 6f 6e 61  o        Rationa
0b10: 6c 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  l function defin
0b20: 69 74 69 6f 6e 0a 23 20 52 65 73 75 6c 74 3a 0a  ition.# Result:.
0b30: 23 20 20 20 20 54 68 65 20 63 6f 65 66 66 69 63  #    The coeffic
0b40: 69 65 6e 74 73 20 69 6e 20 61 73 63 65 6e 64 69  ients in ascendi
0b50: 6e 67 20 6f 72 64 65 72 0a 23 0a 70 72 6f 63 20  ng order.#.proc 
0b60: 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c  ::math::rational
0b70: 66 75 6e 63 74 69 6f 6e 73 3a 3a 63 6f 65 66 66  functions::coeff
0b80: 73 4e 75 6d 65 72 61 74 6f 72 20 7b 72 61 74 69  sNumerator {rati
0b90: 6f 7d 20 7b 0a 20 20 20 20 69 66 20 7b 20 5b 6c  o} {.    if { [l
0ba0: 69 6e 64 65 78 20 24 72 61 74 69 6f 20 30 5d 20  index $ratio 0] 
0bb0: 21 3d 20 22 52 41 54 49 4f 4e 41 4c 5f 46 55 4e  != "RATIONAL_FUN
0bc0: 43 54 49 4f 4e 22 20 7d 20 7b 0a 20 20 20 20 20  CTION" } {.     
0bd0: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
0be0: 65 72 72 6f 72 20 22 4e 6f 74 20 61 20 72 61 74  error "Not a rat
0bf0: 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 22 0a  ional function".
0c00: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 70 6f      }.    set po
0c10: 6c 79 6e 20 5b 6c 69 6e 64 65 78 20 24 72 61 74  lyn [lindex $rat
0c20: 69 6f 20 31 5d 0a 20 20 20 20 72 65 74 75 72 6e  io 1].    return
0c30: 20 5b 61 6c 6c 43 6f 65 66 66 73 50 6f 6c 79 6e   [allCoeffsPolyn
0c40: 20 24 70 6f 6c 79 6e 5d 0a 7d 0a 0a 23 20 63 6f   $polyn].}..# co
0c50: 65 66 66 73 44 65 6e 6f 6d 69 6e 61 74 6f 72 20  effsDenominator 
0c60: 2d 2d 0a 23 20 20 20 20 52 65 74 75 72 6e 20 74  --.#    Return t
0c70: 68 65 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20  he coefficients 
0c80: 6f 66 20 74 68 65 20 64 65 6e 6f 6d 69 6e 61 74  of the denominat
0c90: 6f 72 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73  or.#.# Arguments
0ca0: 3a 0a 23 20 20 20 20 72 61 74 69 6f 20 20 20 20  :.#    ratio    
0cb0: 20 20 20 20 52 61 74 69 6f 6e 61 6c 20 66 75 6e      Rational fun
0cc0: 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
0cd0: 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20  .# Result:.#    
0ce0: 54 68 65 20 63 6f 65 66 66 69 63 69 65 6e 74 73  The coefficients
0cf0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
0d00: 64 65 72 0a 23 0a 70 72 6f 63 20 3a 3a 6d 61 74  der.#.proc ::mat
0d10: 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74  h::rationalfunct
0d20: 69 6f 6e 73 3a 3a 63 6f 65 66 66 73 44 65 6e 6f  ions::coeffsDeno
0d30: 6d 69 6e 61 74 6f 72 20 7b 72 61 74 69 6f 7d 20  minator {ratio} 
0d40: 7b 0a 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64  {.    if { [lind
0d50: 65 78 20 24 72 61 74 69 6f 20 30 5d 20 21 3d 20  ex $ratio 0] != 
0d60: 22 52 41 54 49 4f 4e 41 4c 5f 46 55 4e 43 54 49  "RATIONAL_FUNCTI
0d70: 4f 4e 22 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  ON" } {.        
0d80: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
0d90: 6f 72 20 22 4e 6f 74 20 61 20 72 61 74 69 6f 6e  or "Not a ration
0da0: 61 6c 20 66 75 6e 63 74 69 6f 6e 22 0a 20 20 20  al function".   
0db0: 20 7d 0a 20 20 20 20 73 65 74 20 70 6f 6c 79 6e   }.    set polyn
0dc0: 20 5b 6c 69 6e 64 65 78 20 24 72 61 74 69 6f 20   [lindex $ratio 
0dd0: 32 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 61  2].    return [a
0de0: 6c 6c 43 6f 65 66 66 73 50 6f 6c 79 6e 20 24 70  llCoeffsPolyn $p
0df0: 6f 6c 79 6e 5d 0a 7d 0a 0a 23 20 64 65 72 69 76  olyn].}..# deriv
0e00: 52 61 74 69 6f 20 2d 2d 0a 23 20 20 20 20 52 65  Ratio --.#    Re
0e10: 74 75 72 6e 20 74 68 65 20 64 65 72 69 76 61 74  turn the derivat
0e20: 69 76 65 20 6f 66 20 74 68 65 20 72 61 74 69 6f  ive of the ratio
0e30: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 23 0a 23  nal function.#.#
0e40: 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20   Arguments:.#   
0e50: 20 70 6f 6c 79 6e 20 20 20 20 20 20 20 20 50 6f   polyn        Po
0e60: 6c 79 6e 6f 6d 69 61 6c 20 64 65 66 69 6e 69 74  lynomial definit
0e70: 69 6f 6e 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20  ion.# Result:.# 
0e80: 20 20 20 54 68 65 20 6e 65 77 20 70 6f 6c 79 6e     The new polyn
0e90: 6f 6d 69 61 6c 0a 23 0a 70 72 6f 63 20 3a 3a 6d  omial.#.proc ::m
0ea0: 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e  ath::rationalfun
0eb0: 63 74 69 6f 6e 73 3a 3a 64 65 72 69 76 52 61 74  ctions::derivRat
0ec0: 69 6f 20 7b 72 61 74 69 6f 7d 20 7b 0a 20 20 20  io {ratio} {.   
0ed0: 20 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 24 72   if { [lindex $r
0ee0: 61 74 69 6f 20 30 5d 20 21 3d 20 22 52 41 54 49  atio 0] != "RATI
0ef0: 4f 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 22 20 7d  ONAL_FUNCTION" }
0f00: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
0f10: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 4e  n -code error "N
0f20: 6f 74 20 61 20 72 61 74 69 6f 6e 61 6c 20 66 75  ot a rational fu
0f30: 6e 63 74 69 6f 6e 22 0a 20 20 20 20 7d 0a 20 20  nction".    }.  
0f40: 20 20 73 65 74 20 6e 75 6d 5f 70 6f 6c 79 6e 20    set num_polyn 
0f50: 5b 6c 69 6e 64 65 78 20 24 72 61 74 69 6f 20 31  [lindex $ratio 1
0f60: 5d 0a 20 20 20 20 73 65 74 20 64 65 6e 5f 70 6f  ].    set den_po
0f70: 6c 79 6e 20 5b 6c 69 6e 64 65 78 20 24 72 61 74  lyn [lindex $rat
0f80: 69 6f 20 32 5d 0a 20 20 20 20 73 65 74 20 6e 75  io 2].    set nu
0f90: 6d 5f 64 65 72 69 76 20 5b 64 65 72 69 76 50 6f  m_deriv [derivPo
0fa0: 6c 79 6e 20 24 6e 75 6d 5f 70 6f 6c 79 6e 5d 0a  lyn $num_polyn].
0fb0: 20 20 20 20 73 65 74 20 64 65 6e 5f 64 65 72 69      set den_deri
0fc0: 76 20 5b 64 65 72 69 76 50 6f 6c 79 6e 20 24 64  v [derivPolyn $d
0fd0: 65 6e 5f 70 6f 6c 79 6e 5d 0a 20 20 20 20 73 65  en_polyn].    se
0fe0: 74 20 6e 75 6d 20 20 20 20 20 20 20 5b 73 75 62  t num       [sub
0ff0: 50 6f 6c 79 6e 20 5b 6d 75 6c 74 50 6f 6c 79 6e  Polyn [multPolyn
1000: 20 24 6e 75 6d 5f 64 65 72 69 76 20 24 64 65 6e   $num_deriv $den
1010: 5f 70 6f 6c 79 6e 5d 20 5c 0a 20 20 20 20 20 20  _polyn] \.      
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 20 20 20 5b 6d 75 6c 74 50 6f 6c 79 6e        [multPolyn
1040: 20 24 64 65 6e 5f 64 65 72 69 76 20 24 6e 75 6d   $den_deriv $num
1050: 5f 70 6f 6c 79 6e 5d 20 5d 0a 20 20 20 20 73 65  _polyn] ].    se
1060: 74 20 64 65 6e 20 20 20 20 20 20 20 5b 6d 75 6c  t den       [mul
1070: 74 50 6f 6c 79 6e 20 24 64 65 6e 5f 70 6f 6c 79  tPolyn $den_poly
1080: 6e 20 24 64 65 6e 5f 70 6f 6c 79 6e 5d 0a 0a 20  n $den_polyn].. 
1090: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
10a0: 52 41 54 49 4f 4e 41 4c 5f 46 55 4e 43 54 49 4f  RATIONAL_FUNCTIO
10b0: 4e 20 24 6e 75 6d 20 24 64 65 6e 5d 0a 7d 0a 0a  N $num $den].}..
10c0: 23 20 61 64 64 52 61 74 69 6f 20 2d 2d 0a 23 20  # addRatio --.# 
10d0: 20 20 20 41 64 64 20 74 77 6f 20 72 61 74 69 6f     Add two ratio
10e0: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  nal functions an
10f0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73  d return the res
1100: 75 6c 74 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74  ult.#.# Argument
1110: 73 3a 0a 23 20 20 20 20 72 61 74 69 6f 31 20 20  s:.#    ratio1  
1120: 20 20 20 20 20 46 69 72 73 74 20 72 61 74 69 6f       First ratio
1130: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  nal function or 
1140: 61 20 73 63 61 6c 61 72 0a 23 20 20 20 20 72 61  a scalar.#    ra
1150: 74 69 6f 32 20 20 20 20 20 20 20 53 65 63 6f 6e  tio2       Secon
1160: 64 20 72 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74  d rational funct
1170: 69 6f 6e 20 6f 72 20 61 20 73 63 61 6c 61 72 0a  ion or a scalar.
1180: 23 20 52 65 73 75 6c 74 3a 0a 23 20 20 20 20 54  # Result:.#    T
1190: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 74 77  he sum of the tw
11a0: 6f 20 66 75 6e 63 74 69 6f 6e 73 0a 23 20 4e 6f  o functions.# No
11b0: 74 65 3a 0a 23 20 20 20 20 54 4f 44 4f 3a 20 43  te:.#    TODO: C
11c0: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 61 6d  heck for the sam
11d0: 65 20 64 65 6e 6f 6d 69 6e 61 74 6f 72 0a 23 0a  e denominator.#.
11e0: 70 72 6f 63 20 3a 3a 6d 61 74 68 3a 3a 72 61 74  proc ::math::rat
11f0: 69 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a  ionalfunctions::
1200: 61 64 64 52 61 74 69 6f 20 7b 72 61 74 69 6f 31  addRatio {ratio1
1210: 20 72 61 74 69 6f 32 7d 20 7b 0a 20 20 20 20 69   ratio2} {.    i
1220: 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 72 61  f { [llength $ra
1230: 74 69 6f 31 5d 20 3d 3d 20 31 20 26 26 20 5b 73  tio1] == 1 && [s
1240: 74 72 69 6e 67 20 69 73 20 64 6f 75 62 6c 65 20  tring is double 
1250: 2d 73 74 72 69 63 74 20 24 72 61 74 69 6f 31 5d  -strict $ratio1]
1260: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74   } {.        set
1270: 20 70 6f 6c 79 6e 31 20 5b 72 61 74 69 6f 6e 61   polyn1 [rationa
1280: 6c 46 75 6e 63 74 69 6f 6e 20 24 72 61 74 69 6f  lFunction $ratio
1290: 31 20 31 2e 30 5d 0a 20 20 20 20 7d 0a 20 20 20  1 1.0].    }.   
12a0: 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24   if { [llength $
12b0: 72 61 74 69 6f 32 5d 20 3d 3d 20 31 20 26 26 20  ratio2] == 1 && 
12c0: 5b 73 74 72 69 6e 67 20 69 73 20 64 6f 75 62 6c  [string is doubl
12d0: 65 20 2d 73 74 72 69 63 74 20 24 72 61 74 69 6f  e -strict $ratio
12e0: 32 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  2] } {.        s
12f0: 65 74 20 72 61 74 69 6f 32 20 5b 72 61 74 69 6f  et ratio2 [ratio
1300: 6e 61 6c 46 75 6e 63 74 69 6f 6e 20 24 72 61 74  nalFunction $rat
1310: 69 6f 31 20 31 2e 30 5d 0a 20 20 20 20 7d 0a 20  io1 1.0].    }. 
1320: 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20     if { [lindex 
1330: 24 72 61 74 69 6f 31 20 30 5d 20 21 3d 20 22 52  $ratio1 0] != "R
1340: 41 54 49 4f 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e  ATIONAL_FUNCTION
1350: 22 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 5b 6c  " ||.         [l
1360: 69 6e 64 65 78 20 24 72 61 74 69 6f 32 20 30 5d  index $ratio2 0]
1370: 20 21 3d 20 22 52 41 54 49 4f 4e 41 4c 5f 46 55   != "RATIONAL_FU
1380: 4e 43 54 49 4f 4e 22 20 7d 20 7b 0a 20 20 20 20  NCTION" } {.    
1390: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65      return -code
13a0: 20 65 72 72 6f 72 20 22 42 6f 74 68 20 61 72 67   error "Both arg
13b0: 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20 72  uments must be r
13c0: 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f 6e  ational function
13d0: 73 20 6f 72 20 61 20 72 65 61 6c 20 6e 75 6d 62  s or a real numb
13e0: 65 72 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  er".    }..    s
13f0: 65 74 20 6e 75 6d 31 20 20 20 20 5b 6c 69 6e 64  et num1    [lind
1400: 65 78 20 24 72 61 74 69 6f 31 20 31 5d 0a 20 20  ex $ratio1 1].  
1410: 20 20 73 65 74 20 64 65 6e 31 20 20 20 20 5b 6c    set den1    [l
1420: 69 6e 64 65 78 20 24 72 61 74 69 6f 31 20 32 5d  index $ratio1 2]
1430: 0a 20 20 20 20 73 65 74 20 6e 75 6d 32 20 20 20  .    set num2   
1440: 20 5b 6c 69 6e 64 65 78 20 24 72 61 74 69 6f 32   [lindex $ratio2
1450: 20 31 5d 0a 20 20 20 20 73 65 74 20 64 65 6e 32   1].    set den2
1460: 20 20 20 20 5b 6c 69 6e 64 65 78 20 24 72 61 74      [lindex $rat
1470: 69 6f 32 20 32 5d 0a 0a 20 20 20 20 73 65 74 20  io2 2]..    set 
1480: 6e 65 77 6e 75 6d 20 20 5b 61 64 64 50 6f 6c 79  newnum  [addPoly
1490: 6e 20 5b 6d 75 6c 74 50 6f 6c 79 6e 20 24 6e 75  n [multPolyn $nu
14a0: 6d 31 20 24 64 65 6e 32 5d 20 5c 0a 20 20 20 20  m1 $den2] \.    
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 20 5b 6d 75 6c 74 50 6f 6c 79 6e        [multPolyn
14d0: 20 24 6e 75 6d 32 20 24 64 65 6e 31 5d 20 5d 0a   $num2 $den1] ].
14e0: 0a 20 20 20 20 73 65 74 20 6e 65 77 64 65 6e 20  .    set newden 
14f0: 20 5b 6d 75 6c 74 50 6f 6c 79 6e 20 24 64 65 6e   [multPolyn $den
1500: 31 20 24 64 65 6e 32 5d 0a 0a 20 20 20 20 72 65  1 $den2]..    re
1510: 74 75 72 6e 20 5b 6c 69 73 74 20 52 41 54 49 4f  turn [list RATIO
1520: 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 20 24 6e 65  NAL_FUNCTION $ne
1530: 77 6e 75 6d 20 24 6e 65 77 64 65 6e 5d 0a 7d 0a  wnum $newden].}.
1540: 0a 23 20 73 75 62 52 61 74 69 6f 20 2d 2d 0a 23  .# subRatio --.#
1550: 20 20 20 20 53 75 62 74 72 61 63 74 20 74 77 6f      Subtract two
1560: 20 72 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69   rational functi
1570: 6f 6e 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ons and return t
1580: 68 65 20 72 65 73 75 6c 74 0a 23 0a 23 20 41 72  he result.#.# Ar
1590: 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20 20 72 61  guments:.#    ra
15a0: 74 69 6f 31 20 20 20 20 20 20 20 46 69 72 73 74  tio1       First
15b0: 20 72 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69   rational functi
15c0: 6f 6e 20 6f 72 20 61 20 73 63 61 6c 61 72 0a 23  on or a scalar.#
15d0: 20 20 20 20 72 61 74 69 6f 32 20 20 20 20 20 20      ratio2      
15e0: 20 53 65 63 6f 6e 64 20 72 61 74 69 6f 6e 61 6c   Second rational
15f0: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 61 20 73   function or a s
1600: 63 61 6c 61 72 0a 23 20 52 65 73 75 6c 74 3a 0a  calar.# Result:.
1610: 23 20 20 20 20 54 68 65 20 64 69 66 66 65 72 65  #    The differe
1620: 6e 63 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66  nce of the two f
1630: 75 6e 63 74 69 6f 6e 73 0a 23 20 4e 6f 74 65 3a  unctions.# Note:
1640: 0a 23 20 20 20 20 54 4f 44 4f 3a 20 43 68 65 63  .#    TODO: Chec
1650: 6b 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 64  k for the same d
1660: 65 6e 6f 6d 69 6e 61 74 6f 72 0a 23 0a 70 72 6f  enominator.#.pro
1670: 63 20 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e  c ::math::ration
1680: 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 73 75 62  alfunctions::sub
1690: 52 61 74 69 6f 20 7b 72 61 74 69 6f 31 20 72 61  Ratio {ratio1 ra
16a0: 74 69 6f 32 7d 20 7b 0a 20 20 20 20 69 66 20 7b  tio2} {.    if {
16b0: 20 5b 6c 6c 65 6e 67 74 68 20 24 72 61 74 69 6f   [llength $ratio
16c0: 31 5d 20 3d 3d 20 31 20 26 26 20 5b 73 74 72 69  1] == 1 && [stri
16d0: 6e 67 20 69 73 20 64 6f 75 62 6c 65 20 2d 73 74  ng is double -st
16e0: 72 69 63 74 20 24 72 61 74 69 6f 31 5d 20 7d 20  rict $ratio1] } 
16f0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 6f  {.        set po
1700: 6c 79 6e 31 20 5b 72 61 74 69 6f 6e 61 6c 46 75  lyn1 [rationalFu
1710: 6e 63 74 69 6f 6e 20 24 72 61 74 69 6f 31 20 31  nction $ratio1 1
1720: 2e 30 5d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  .0].    }.    if
1730: 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 72 61 74   { [llength $rat
1740: 69 6f 32 5d 20 3d 3d 20 31 20 26 26 20 5b 73 74  io2] == 1 && [st
1750: 72 69 6e 67 20 69 73 20 64 6f 75 62 6c 65 20 2d  ring is double -
1760: 73 74 72 69 63 74 20 24 72 61 74 69 6f 32 5d 20  strict $ratio2] 
1770: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
1780: 72 61 74 69 6f 32 20 5b 72 61 74 69 6f 6e 61 6c  ratio2 [rational
1790: 46 75 6e 63 74 69 6f 6e 20 24 72 61 74 69 6f 31  Function $ratio1
17a0: 20 31 2e 30 5d 0a 20 20 20 20 7d 0a 20 20 20 20   1.0].    }.    
17b0: 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 24 72 61  if { [lindex $ra
17c0: 74 69 6f 31 20 30 5d 20 21 3d 20 22 52 41 54 49  tio1 0] != "RATI
17d0: 4f 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 22 20 7c  ONAL_FUNCTION" |
17e0: 7c 0a 20 20 20 20 20 20 20 20 20 5b 6c 69 6e 64  |.         [lind
17f0: 65 78 20 24 72 61 74 69 6f 32 20 30 5d 20 21 3d  ex $ratio2 0] !=
1800: 20 22 52 41 54 49 4f 4e 41 4c 5f 46 55 4e 43 54   "RATIONAL_FUNCT
1810: 49 4f 4e 22 20 7d 20 7b 0a 20 20 20 20 20 20 20  ION" } {.       
1820: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72   return -code er
1830: 72 6f 72 20 22 42 6f 74 68 20 61 72 67 75 6d 65  ror "Both argume
1840: 6e 74 73 20 6d 75 73 74 20 62 65 20 72 61 74 69  nts must be rati
1850: 6f 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 20 6f  onal functions o
1860: 72 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 22  r a real number"
1870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20  .    }..    set 
1880: 6e 75 6d 31 20 20 20 20 5b 6c 69 6e 64 65 78 20  num1    [lindex 
1890: 24 72 61 74 69 6f 31 20 31 5d 0a 20 20 20 20 73  $ratio1 1].    s
18a0: 65 74 20 64 65 6e 31 20 20 20 20 5b 6c 69 6e 64  et den1    [lind
18b0: 65 78 20 24 72 61 74 69 6f 31 20 32 5d 0a 20 20  ex $ratio1 2].  
18c0: 20 20 73 65 74 20 6e 75 6d 32 20 20 20 20 5b 6c    set num2    [l
18d0: 69 6e 64 65 78 20 24 72 61 74 69 6f 32 20 31 5d  index $ratio2 1]
18e0: 0a 20 20 20 20 73 65 74 20 64 65 6e 32 20 20 20  .    set den2   
18f0: 20 5b 6c 69 6e 64 65 78 20 24 72 61 74 69 6f 32   [lindex $ratio2
1900: 20 32 5d 0a 0a 20 20 20 20 73 65 74 20 6e 65 77   2]..    set new
1910: 6e 75 6d 20 20 5b 73 75 62 50 6f 6c 79 6e 20 5b  num  [subPolyn [
1920: 6d 75 6c 74 50 6f 6c 79 6e 20 24 6e 75 6d 31 20  multPolyn $num1 
1930: 24 64 65 6e 32 5d 20 5c 0a 20 20 20 20 20 20 20  $den2] \.       
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 5b 6d 75 6c 74 50 6f 6c 79 6e 20 24 6e     [multPolyn $n
1960: 75 6d 32 20 24 64 65 6e 31 5d 20 5d 0a 0a 20 20  um2 $den1] ]..  
1970: 20 20 73 65 74 20 6e 65 77 64 65 6e 20 20 5b 6d    set newden  [m
1980: 75 6c 74 50 6f 6c 79 6e 20 24 64 65 6e 31 20 24  ultPolyn $den1 $
1990: 64 65 6e 32 5d 0a 0a 20 20 20 20 72 65 74 75 72  den2]..    retur
19a0: 6e 20 5b 6c 69 73 74 20 52 41 54 49 4f 4e 41 4c  n [list RATIONAL
19b0: 5f 46 55 4e 43 54 49 4f 4e 20 24 6e 65 77 6e 75  _FUNCTION $newnu
19c0: 6d 20 24 6e 65 77 64 65 6e 5d 0a 7d 0a 0a 23 20  m $newden].}..# 
19d0: 6d 75 6c 74 52 61 74 69 6f 20 2d 2d 0a 23 20 20  multRatio --.#  
19e0: 20 20 4d 75 6c 74 69 70 6c 79 20 74 77 6f 20 72    Multiply two r
19f0: 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f 6e  ational function
1a00: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  s and return the
1a10: 20 72 65 73 75 6c 74 0a 23 0a 23 20 41 72 67 75   result.#.# Argu
1a20: 6d 65 6e 74 73 3a 0a 23 20 20 20 20 72 61 74 69  ments:.#    rati
1a30: 6f 31 20 20 20 20 20 20 20 46 69 72 73 74 20 72  o1       First r
1a40: 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f 6e  ational function
1a50: 20 6f 72 20 61 20 73 63 61 6c 61 72 0a 23 20 20   or a scalar.#  
1a60: 20 20 72 61 74 69 6f 32 20 20 20 20 20 20 20 53    ratio2       S
1a70: 65 63 6f 6e 64 20 72 61 74 69 6f 6e 61 6c 20 66  econd rational f
1a80: 75 6e 63 74 69 6f 6e 20 6f 72 20 61 20 73 63 61  unction or a sca
1a90: 6c 61 72 0a 23 20 52 65 73 75 6c 74 3a 0a 23 20  lar.# Result:.# 
1aa0: 20 20 20 54 68 65 20 70 72 6f 64 75 63 74 20 6f     The product o
1ab0: 66 20 74 68 65 20 74 77 6f 20 66 75 6e 63 74 69  f the two functi
1ac0: 6f 6e 73 0a 23 20 4e 6f 74 65 3a 0a 23 20 20 20  ons.# Note:.#   
1ad0: 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 66 6f 72   TODO: Check for
1ae0: 20 74 68 65 20 73 61 6d 65 20 64 65 6e 6f 6d 69   the same denomi
1af0: 6e 61 74 6f 72 0a 23 0a 70 72 6f 63 20 3a 3a 6d  nator.#.proc ::m
1b00: 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e  ath::rationalfun
1b10: 63 74 69 6f 6e 73 3a 3a 6d 75 6c 74 52 61 74 69  ctions::multRati
1b20: 6f 20 7b 72 61 74 69 6f 31 20 72 61 74 69 6f 32  o {ratio1 ratio2
1b30: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 20 5b 6c 6c  } {.    if { [ll
1b40: 65 6e 67 74 68 20 24 72 61 74 69 6f 31 5d 20 3d  ength $ratio1] =
1b50: 3d 20 31 20 26 26 20 5b 73 74 72 69 6e 67 20 69  = 1 && [string i
1b60: 73 20 64 6f 75 62 6c 65 20 2d 73 74 72 69 63 74  s double -strict
1b70: 20 24 72 61 74 69 6f 31 5d 20 7d 20 7b 0a 20 20   $ratio1] } {.  
1b80: 20 20 20 20 20 20 73 65 74 20 70 6f 6c 79 6e 31        set polyn1
1b90: 20 5b 72 61 74 69 6f 6e 61 6c 46 75 6e 63 74 69   [rationalFuncti
1ba0: 6f 6e 20 24 72 61 74 69 6f 31 20 31 2e 30 5d 0a  on $ratio1 1.0].
1bb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 20 5b      }.    if { [
1bc0: 6c 6c 65 6e 67 74 68 20 24 72 61 74 69 6f 32 5d  llength $ratio2]
1bd0: 20 3d 3d 20 31 20 26 26 20 5b 73 74 72 69 6e 67   == 1 && [string
1be0: 20 69 73 20 64 6f 75 62 6c 65 20 2d 73 74 72 69   is double -stri
1bf0: 63 74 20 24 72 61 74 69 6f 32 5d 20 7d 20 7b 0a  ct $ratio2] } {.
1c00: 20 20 20 20 20 20 20 20 73 65 74 20 72 61 74 69          set rati
1c10: 6f 32 20 5b 72 61 74 69 6f 6e 61 6c 46 75 6e 63  o2 [rationalFunc
1c20: 74 69 6f 6e 20 24 72 61 74 69 6f 31 20 31 2e 30  tion $ratio1 1.0
1c30: 5d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b  ].    }.    if {
1c40: 20 5b 6c 69 6e 64 65 78 20 24 72 61 74 69 6f 31   [lindex $ratio1
1c50: 20 30 5d 20 21 3d 20 22 52 41 54 49 4f 4e 41 4c   0] != "RATIONAL
1c60: 5f 46 55 4e 43 54 49 4f 4e 22 20 7c 7c 0a 20 20  _FUNCTION" ||.  
1c70: 20 20 20 20 20 20 20 5b 6c 69 6e 64 65 78 20 24         [lindex $
1c80: 72 61 74 69 6f 32 20 30 5d 20 21 3d 20 22 52 41  ratio2 0] != "RA
1c90: 54 49 4f 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 22  TIONAL_FUNCTION"
1ca0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74   } {.        ret
1cb0: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20  urn -code error 
1cc0: 22 42 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20  "Both arguments 
1cd0: 6d 75 73 74 20 62 65 20 72 61 74 69 6f 6e 61 6c  must be rational
1ce0: 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
1cf0: 72 65 61 6c 20 6e 75 6d 62 65 72 22 0a 20 20 20  real number".   
1d00: 20 7d 0a 0a 20 20 20 20 73 65 74 20 6e 75 6d 31   }..    set num1
1d10: 20 20 20 20 5b 6c 69 6e 64 65 78 20 24 72 61 74      [lindex $rat
1d20: 69 6f 31 20 31 5d 0a 20 20 20 20 73 65 74 20 64  io1 1].    set d
1d30: 65 6e 31 20 20 20 20 5b 6c 69 6e 64 65 78 20 24  en1    [lindex $
1d40: 72 61 74 69 6f 31 20 32 5d 0a 20 20 20 20 73 65  ratio1 2].    se
1d50: 74 20 6e 75 6d 32 20 20 20 20 5b 6c 69 6e 64 65  t num2    [linde
1d60: 78 20 24 72 61 74 69 6f 32 20 31 5d 0a 20 20 20  x $ratio2 1].   
1d70: 20 73 65 74 20 64 65 6e 32 20 20 20 20 5b 6c 69   set den2    [li
1d80: 6e 64 65 78 20 24 72 61 74 69 6f 32 20 32 5d 0a  ndex $ratio2 2].
1d90: 0a 20 20 20 20 73 65 74 20 6e 65 77 6e 75 6d 20  .    set newnum 
1da0: 20 5b 6d 75 6c 74 50 6f 6c 79 6e 20 24 6e 75 6d   [multPolyn $num
1db0: 31 20 24 6e 75 6d 32 5d 0a 20 20 20 20 73 65 74  1 $num2].    set
1dc0: 20 6e 65 77 64 65 6e 20 20 5b 6d 75 6c 74 50 6f   newden  [multPo
1dd0: 6c 79 6e 20 24 64 65 6e 31 20 24 64 65 6e 32 5d  lyn $den1 $den2]
1de0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69  ..    return [li
1df0: 73 74 20 52 41 54 49 4f 4e 41 4c 5f 46 55 4e 43  st RATIONAL_FUNC
1e00: 54 49 4f 4e 20 24 6e 65 77 6e 75 6d 20 24 6e 65  TION $newnum $ne
1e10: 77 64 65 6e 5d 0a 7d 0a 0a 23 20 64 69 76 52 61  wden].}..# divRa
1e20: 74 69 6f 20 2d 2d 0a 23 20 20 20 20 44 69 76 69  tio --.#    Divi
1e30: 64 65 20 74 77 6f 20 72 61 74 69 6f 6e 61 6c 20  de two rational 
1e40: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 72 65  functions and re
1e50: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 0a  turn the result.
1e60: 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  #.# Arguments:.#
1e70: 20 20 20 20 72 61 74 69 6f 31 20 20 20 20 20 20      ratio1      
1e80: 20 46 69 72 73 74 20 72 61 74 69 6f 6e 61 6c 20   First rational 
1e90: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 61 20 73 63  function or a sc
1ea0: 61 6c 61 72 0a 23 20 20 20 20 72 61 74 69 6f 32  alar.#    ratio2
1eb0: 20 20 20 20 20 20 20 53 65 63 6f 6e 64 20 72 61         Second ra
1ec0: 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 20  tional function 
1ed0: 6f 72 20 61 20 73 63 61 6c 61 72 0a 23 20 52 65  or a scalar.# Re
1ee0: 73 75 6c 74 3a 0a 23 20 20 20 20 54 68 65 20 71  sult:.#    The q
1ef0: 75 6f 74 69 65 6e 74 20 6f 66 20 74 68 65 20 74  uotient of the t
1f00: 77 6f 20 66 75 6e 63 74 69 6f 6e 73 0a 23 20 4e  wo functions.# N
1f10: 6f 74 65 3a 0a 23 20 20 20 20 54 4f 44 4f 3a 20  ote:.#    TODO: 
1f20: 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 61  Check for the sa
1f30: 6d 65 20 64 65 6e 6f 6d 69 6e 61 74 6f 72 0a 23  me denominator.#
1f40: 0a 70 72 6f 63 20 3a 3a 6d 61 74 68 3a 3a 72 61  .proc ::math::ra
1f50: 74 69 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a  tionalfunctions:
1f60: 3a 64 69 76 52 61 74 69 6f 20 7b 72 61 74 69 6f  :divRatio {ratio
1f70: 31 20 72 61 74 69 6f 32 7d 20 7b 0a 20 20 20 20  1 ratio2} {.    
1f80: 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 72  if { [llength $r
1f90: 61 74 69 6f 31 5d 20 3d 3d 20 31 20 26 26 20 5b  atio1] == 1 && [
1fa0: 73 74 72 69 6e 67 20 69 73 20 64 6f 75 62 6c 65  string is double
1fb0: 20 2d 73 74 72 69 63 74 20 24 72 61 74 69 6f 31   -strict $ratio1
1fc0: 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ] } {.        se
1fd0: 74 20 70 6f 6c 79 6e 31 20 5b 72 61 74 69 6f 6e  t polyn1 [ration
1fe0: 61 6c 46 75 6e 63 74 69 6f 6e 20 24 72 61 74 69  alFunction $rati
1ff0: 6f 31 20 31 2e 30 5d 0a 20 20 20 20 7d 0a 20 20  o1 1.0].    }.  
2000: 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20    if { [llength 
2010: 24 72 61 74 69 6f 32 5d 20 3d 3d 20 31 20 26 26  $ratio2] == 1 &&
2020: 20 5b 73 74 72 69 6e 67 20 69 73 20 64 6f 75 62   [string is doub
2030: 6c 65 20 2d 73 74 72 69 63 74 20 24 72 61 74 69  le -strict $rati
2040: 6f 32 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  o2] } {.        
2050: 73 65 74 20 72 61 74 69 6f 32 20 5b 72 61 74 69  set ratio2 [rati
2060: 6f 6e 61 6c 46 75 6e 63 74 69 6f 6e 20 24 72 61  onalFunction $ra
2070: 74 69 6f 31 20 31 2e 30 5d 0a 20 20 20 20 7d 0a  tio1 1.0].    }.
2080: 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65 78      if { [lindex
2090: 20 24 72 61 74 69 6f 31 20 30 5d 20 21 3d 20 22   $ratio1 0] != "
20a0: 52 41 54 49 4f 4e 41 4c 5f 46 55 4e 43 54 49 4f  RATIONAL_FUNCTIO
20b0: 4e 22 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 5b  N" ||.         [
20c0: 6c 69 6e 64 65 78 20 24 72 61 74 69 6f 32 20 30  lindex $ratio2 0
20d0: 5d 20 21 3d 20 22 52 41 54 49 4f 4e 41 4c 5f 46  ] != "RATIONAL_F
20e0: 55 4e 43 54 49 4f 4e 22 20 7d 20 7b 0a 20 20 20  UNCTION" } {.   
20f0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64       return -cod
2100: 65 20 65 72 72 6f 72 20 22 42 6f 74 68 20 61 72  e error "Both ar
2110: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
2120: 72 61 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f  rational functio
2130: 6e 73 20 6f 72 20 61 20 72 65 61 6c 20 6e 75 6d  ns or a real num
2140: 62 65 72 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ber".    }..    
2150: 73 65 74 20 6e 75 6d 31 20 20 20 20 5b 6c 69 6e  set num1    [lin
2160: 64 65 78 20 24 72 61 74 69 6f 31 20 31 5d 0a 20  dex $ratio1 1]. 
2170: 20 20 20 73 65 74 20 64 65 6e 31 20 20 20 20 5b     set den1    [
2180: 6c 69 6e 64 65 78 20 24 72 61 74 69 6f 31 20 32  lindex $ratio1 2
2190: 5d 0a 20 20 20 20 73 65 74 20 6e 75 6d 32 20 20  ].    set num2  
21a0: 20 20 5b 6c 69 6e 64 65 78 20 24 72 61 74 69 6f    [lindex $ratio
21b0: 32 20 31 5d 0a 20 20 20 20 73 65 74 20 64 65 6e  2 1].    set den
21c0: 32 20 20 20 20 5b 6c 69 6e 64 65 78 20 24 72 61  2    [lindex $ra
21d0: 74 69 6f 32 20 32 5d 0a 0a 20 20 20 20 73 65 74  tio2 2]..    set
21e0: 20 6e 65 77 6e 75 6d 20 20 5b 6d 75 6c 74 50 6f   newnum  [multPo
21f0: 6c 79 6e 20 24 6e 75 6d 31 20 24 64 65 6e 32 5d  lyn $num1 $den2]
2200: 0a 20 20 20 20 73 65 74 20 6e 65 77 64 65 6e 20  .    set newden 
2210: 20 5b 6d 75 6c 74 50 6f 6c 79 6e 20 24 6e 75 6d   [multPolyn $num
2220: 32 20 24 64 65 6e 31 5d 0a 0a 20 20 20 20 72 65  2 $den1]..    re
2230: 74 75 72 6e 20 5b 6c 69 73 74 20 52 41 54 49 4f  turn [list RATIO
2240: 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 20 24 6e 65  NAL_FUNCTION $ne
2250: 77 6e 75 6d 20 24 6e 65 77 64 65 6e 5d 0a 7d 0a  wnum $newden].}.
2260: 0a 23 0a 23 20 41 6e 6e 6f 75 6e 63 65 20 6f 75  .#.# Announce ou
2270: 72 20 70 72 65 73 65 6e 63 65 0a 23 0a 70 61 63  r presence.#.pac
2280: 6b 61 67 65 20 70 72 6f 76 69 64 65 20 6d 61 74  kage provide mat
2290: 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74  h::rationalfunct
22a0: 69 6f 6e 73 20 31 2e 30 2e 31 0a 0a 23 20 73 6f  ions 1.0.1..# so
22b0: 6d 65 20 74 65 73 74 73 20 2d 2d 0a 23 0a 69 66  me tests --.#.if
22c0: 20 7b 20 30 20 7d 20 7b 0a 73 65 74 20 74 63 6c   { 0 } {.set tcl
22d0: 5f 70 72 65 63 69 73 69 6f 6e 20 31 37 0a 0a 73  _precision 17..s
22e0: 65 74 20 66 31 20 20 20 20 5b 3a 3a 6d 61 74 68  et f1    [::math
22f0: 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74 69  ::rationalfuncti
2300: 6f 6e 73 3a 3a 72 61 74 69 6f 6e 61 6c 46 75 6e  ons::rationalFun
2310: 63 74 69 6f 6e 20 7b 31 20 32 20 33 7d 20 7b 31  ction {1 2 3} {1
2320: 20 34 7d 5d 0a 73 65 74 20 66 32 20 20 20 20 5b   4}].set f2    [
2330: 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c  ::math::rational
2340: 66 75 6e 63 74 69 6f 6e 73 3a 3a 72 61 74 69 6f  functions::ratio
2350: 6e 61 6c 46 75 6e 63 74 69 6f 6e 20 7b 31 20 32  nalFunction {1 2
2360: 20 33 20 30 7d 20 7b 31 20 34 7d 5d 0a 73 65 74   3 0} {1 4}].set
2370: 20 66 33 20 20 20 20 5b 3a 3a 6d 61 74 68 3a 3a   f3    [::math::
2380: 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e  rationalfunction
2390: 73 3a 3a 72 61 74 69 6f 6e 61 6c 46 75 6e 63 74  s::rationalFunct
23a0: 69 6f 6e 20 7b 30 20 30 20 30 20 30 7d 20 7b 31  ion {0 0 0 0} {1
23b0: 7d 5d 0a 73 65 74 20 66 34 20 20 20 20 5b 3a 3a  }].set f4    [::
23c0: 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75  math::rationalfu
23d0: 6e 63 74 69 6f 6e 73 3a 3a 72 61 74 69 6f 6e 61  nctions::rationa
23e0: 6c 46 75 6e 63 74 69 6f 6e 20 7b 35 20 37 7d 20  lFunction {5 7} 
23f0: 7b 31 7d 5d 0a 73 65 74 20 63 6d 64 66 31 20 5b  {1}].set cmdf1 [
2400: 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c  ::math::rational
2410: 66 75 6e 63 74 69 6f 6e 73 3a 3a 72 61 74 69 6f  functions::ratio
2420: 43 6d 64 20 7b 31 20 32 20 33 7d 20 7b 31 20 34  Cmd {1 2 3} {1 4
2430: 7d 5d 0a 0a 66 6f 72 65 61 63 68 20 78 20 7b 30  }]..foreach x {0
2440: 20 31 20 32 20 33 20 34 20 35 7d 20 7b 0a 20 20   1 2 3 4 5} {.  
2450: 20 20 70 75 74 73 20 22 5b 3a 3a 6d 61 74 68 3a    puts "[::math:
2460: 3a 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74 69 6f  :rationalfunctio
2470: 6e 73 3a 3a 65 76 61 6c 52 61 74 69 6f 20 24 66  ns::evalRatio $f
2480: 31 20 24 78 5d 20 2d 2d 20 5c 0a 5b 65 78 70 72  1 $x] -- \.[expr
2490: 20 7b 28 31 2e 30 2b 32 2e 30 2a 24 78 2b 33 2e   {(1.0+2.0*$x+3.
24a0: 30 2a 24 78 2a 24 78 29 2f 64 6f 75 62 6c 65 28  0*$x*$x)/double(
24b0: 31 2e 30 2b 34 2e 30 2a 24 78 29 7d 5d 20 2d 2d  1.0+4.0*$x)}] --
24c0: 20 5c 0a 5b 24 63 6d 64 66 31 20 24 78 5d 20 2d   \.[$cmdf1 $x] -
24d0: 2d 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f  - [::math::ratio
24e0: 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 65 76  nalfunctions::ev
24f0: 61 6c 52 61 74 69 6f 20 24 66 33 20 24 78 5d 22  alRatio $f3 $x]"
2500: 0a 7d 0a 0a 70 75 74 73 20 22 41 6c 6c 20 63 6f  .}..puts "All co
2510: 65 66 66 69 63 69 65 6e 74 73 20 3d 20 5b 3a 3a  efficients = [::
2520: 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75  math::rationalfu
2530: 6e 63 74 69 6f 6e 73 3a 3a 63 6f 65 66 66 73 4e  nctions::coeffsN
2540: 75 6d 65 72 61 74 6f 72 20 24 66 32 5d 22 0a 70  umerator $f2]".p
2550: 75 74 73 20 22 20 20 20 20 20 20 20 20 20 20 20  uts "           
2560: 20 20 20 20 20 20 20 20 5b 3a 3a 6d 61 74 68 3a          [::math:
2570: 3a 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74 69 6f  :rationalfunctio
2580: 6e 73 3a 3a 63 6f 65 66 66 73 44 65 6e 6f 6d 69  ns::coeffsDenomi
2590: 6e 61 74 6f 72 20 24 66 32 5d 22 0a 0a 70 75 74  nator $f2]"..put
25a0: 73 20 22 44 65 72 69 76 61 74 69 76 65 20 3d 20  s "Derivative = 
25b0: 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61  [::math::rationa
25c0: 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 64 65 72 69  lfunctions::deri
25d0: 76 52 61 74 69 6f 20 24 66 31 5d 22 0a 0a 70 75  vRatio $f1]"..pu
25e0: 74 73 20 22 41 64 64 3a 20 20 20 20 20 20 20 5b  ts "Add:       [
25f0: 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c  ::math::rational
2600: 66 75 6e 63 74 69 6f 6e 73 3a 3a 61 64 64 52 61  functions::addRa
2610: 74 69 6f 20 24 66 31 20 24 66 34 5d 22 0a 70 75  tio $f1 $f4]".pu
2620: 74 73 20 22 41 64 64 3a 20 20 20 20 20 20 20 5b  ts "Add:       [
2630: 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c  ::math::rational
2640: 66 75 6e 63 74 69 6f 6e 73 3a 3a 61 64 64 52 61  functions::addRa
2650: 74 69 6f 20 24 66 34 20 24 66 31 5d 22 0a 70 75  tio $f4 $f1]".pu
2660: 74 73 20 22 53 75 62 74 72 61 63 74 3a 20 20 5b  ts "Subtract:  [
2670: 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c  ::math::rational
2680: 66 75 6e 63 74 69 6f 6e 73 3a 3a 73 75 62 52 61  functions::subRa
2690: 74 69 6f 20 24 66 31 20 24 66 34 5d 22 0a 70 75  tio $f1 $f4]".pu
26a0: 74 73 20 22 4d 75 6c 74 69 70 6c 79 3a 20 20 5b  ts "Multiply:  [
26b0: 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c  ::math::rational
26c0: 66 75 6e 63 74 69 6f 6e 73 3a 3a 6d 75 6c 74 52  functions::multR
26d0: 61 74 69 6f 20 24 66 31 20 24 66 34 5d 22 0a 0a  atio $f1 $f4]"..
26e0: 73 65 74 20 66 31 20 20 20 20 5b 3a 3a 6d 61 74  set f1    [::mat
26f0: 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74  h::rationalfunct
2700: 69 6f 6e 73 3a 3a 72 61 74 69 6f 6e 61 6c 46 75  ions::rationalFu
2710: 6e 63 74 69 6f 6e 20 7b 31 20 32 20 33 7d 20 31  nction {1 2 3} 1
2720: 5d 0a 73 65 74 20 66 32 20 20 20 20 5b 3a 3a 6d  ].set f2    [::m
2730: 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e  ath::rationalfun
2740: 63 74 69 6f 6e 73 3a 3a 72 61 74 69 6f 6e 61 6c  ctions::rational
2750: 46 75 6e 63 74 69 6f 6e 20 7b 30 20 31 7d 20 31  Function {0 1} 1
2760: 5d 0a 0a 70 75 74 73 20 22 44 69 76 69 64 65 3a  ]..puts "Divide:
2770: 20 20 20 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74      [::math::rat
2780: 69 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a  ionalfunctions::
2790: 64 69 76 52 61 74 69 6f 20 24 66 31 20 24 66 32  divRatio $f1 $f2
27a0: 5d 22 0a 0a 73 65 74 20 66 31 20 20 20 20 5b 3a  ]"..set f1    [:
27b0: 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66  :math::rationalf
27c0: 75 6e 63 74 69 6f 6e 73 3a 3a 72 61 74 69 6f 6e  unctions::ration
27d0: 61 6c 46 75 6e 63 74 69 6f 6e 20 7b 31 20 32 20  alFunction {1 2 
27e0: 33 7d 20 31 5d 0a 73 65 74 20 66 32 20 20 20 20  3} 1].set f2    
27f0: 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61  [::math::rationa
2800: 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 72 61 74 69  lfunctions::rati
2810: 6f 6e 61 6c 46 75 6e 63 74 69 6f 6e 20 7b 31 20  onalFunction {1 
2820: 31 7d 20 7b 31 20 32 7d 5d 0a 0a 70 75 74 73 20  1} {1 2}]..puts 
2830: 22 44 69 76 69 64 65 3a 20 20 20 20 5b 3a 3a 6d  "Divide:    [::m
2840: 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e  ath::rationalfun
2850: 63 74 69 6f 6e 73 3a 3a 64 69 76 52 61 74 69 6f  ctions::divRatio
2860: 20 24 66 31 20 24 66 32 5d 22 0a 0a 73 65 74 20   $f1 $f2]"..set 
2870: 66 31 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69  f1 [::math::rati
2880: 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 72  onalfunctions::r
2890: 61 74 69 6f 6e 61 6c 46 75 6e 63 74 69 6f 6e 20  ationalFunction 
28a0: 7b 31 20 32 20 33 7d 20 31 5d 0a 73 65 74 20 66  {1 2 3} 1].set f
28b0: 32 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f  2 [::math::ratio
28c0: 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 72 61  nalfunctions::ra
28d0: 74 69 6f 6e 61 6c 46 75 6e 63 74 69 6f 6e 20 7b  tionalFunction {
28e0: 30 20 31 7d 20 7b 30 20 30 20 31 7d 5d 0a 73 65  0 1} {0 0 1}].se
28f0: 74 20 66 33 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61  t f3 [::math::ra
2900: 74 69 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a  tionalfunctions:
2910: 3a 64 69 76 52 61 74 69 6f 20 24 66 32 20 24 66  :divRatio $f2 $f
2920: 31 5d 0a 73 65 74 20 63 6f 65 66 66 73 20 5b 3a  1].set coeffs [:
2930: 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66  :math::rationalf
2940: 75 6e 63 74 69 6f 6e 73 3a 3a 63 6f 65 66 66 73  unctions::coeffs
2950: 4e 75 6d 65 72 61 74 6f 72 20 24 66 33 5d 0a 70  Numerator $f3].p
2960: 75 74 73 20 22 43 6f 65 66 66 69 63 69 65 6e 74  uts "Coefficient
2970: 73 3a 20 24 63 6f 65 66 66 73 22 0a 73 65 74 20  s: $coeffs".set 
2980: 66 33 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69  f3 [::math::rati
2990: 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 64  onalfunctions::d
29a0: 69 76 52 61 74 69 6f 20 24 66 31 20 24 66 32 5d  ivRatio $f1 $f2]
29b0: 0a 73 65 74 20 63 6f 65 66 66 73 20 5b 3a 3a 6d  .set coeffs [::m
29c0: 61 74 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e  ath::rationalfun
29d0: 63 74 69 6f 6e 73 3a 3a 63 6f 65 66 66 73 4e 75  ctions::coeffsNu
29e0: 6d 65 72 61 74 6f 72 20 24 66 33 5d 0a 70 75 74  merator $f3].put
29f0: 73 20 22 43 6f 65 66 66 69 63 69 65 6e 74 73 3a  s "Coefficients:
2a00: 20 24 63 6f 65 66 66 73 22 0a 73 65 74 20 66 31   $coeffs".set f1
2a10: 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e   [::math::ration
2a20: 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 72 61 74  alfunctions::rat
2a30: 69 6f 6e 61 6c 46 75 6e 63 74 69 6f 6e 20 7b 31  ionalFunction {1
2a40: 20 32 20 33 7d 20 7b 31 20 32 7d 5d 0a 73 65 74   2 3} {1 2}].set
2a50: 20 66 32 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74   f2 [::math::rat
2a60: 69 6f 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a  ionalfunctions::
2a70: 72 61 74 69 6f 6e 61 6c 46 75 6e 63 74 69 6f 6e  rationalFunction
2a80: 20 7b 30 7d 20 7b 31 7d 5d 0a 73 65 74 20 66 33   {0} {1}].set f3
2a90: 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f 6e   [::math::ration
2aa0: 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 64 69 76  alfunctions::div
2ab0: 52 61 74 69 6f 20 24 66 32 20 24 66 31 5d 0a 73  Ratio $f2 $f1].s
2ac0: 65 74 20 63 6f 65 66 66 73 20 5b 3a 3a 6d 61 74  et coeffs [::mat
2ad0: 68 3a 3a 72 61 74 69 6f 6e 61 6c 66 75 6e 63 74  h::rationalfunct
2ae0: 69 6f 6e 73 3a 3a 63 6f 65 66 66 73 4e 75 6d 65  ions::coeffsNume
2af0: 72 61 74 6f 72 20 24 66 33 5d 0a 70 75 74 73 20  rator $f3].puts 
2b00: 22 43 6f 65 66 66 69 63 69 65 6e 74 73 3a 20 24  "Coefficients: $
2b10: 63 6f 65 66 66 73 22 0a 70 75 74 73 20 22 45 76  coeffs".puts "Ev
2b20: 61 6c 20 6e 75 6c 6c 20 66 75 6e 63 74 69 6f 6e  al null function
2b30: 3a 20 5b 3a 3a 6d 61 74 68 3a 3a 72 61 74 69 6f  : [::math::ratio
2b40: 6e 61 6c 66 75 6e 63 74 69 6f 6e 73 3a 3a 65 76  nalfunctions::ev
2b50: 61 6c 52 61 74 69 6f 20 24 66 32 20 31 5d 22 0a  alRatio $f2 1]".
2b60: 7d 0a                                            }.