[system] / trunk / pg / lib / PowerPolynomial.pm Repository:
ViewVC logotype

View of /trunk/pg/lib/PowerPolynomial.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2558 - (download) (as text) (annotate)
Wed Jul 28 20:32:33 2004 UTC (15 years, 5 months ago) by sh002i
File size: 13463 byte(s)
merged changes from rel-2-1-a1 -- stop using that branch.

    1 #! /usr/local/bin/perl
    2 
    3 package PowerPolynomial;
    4 
    5 #@ISA = qw(Function);
    6 
    7 
    8 sub givenVariableAndHash { # Give anonymous hash of coefficients
    9   my ($class, $variable, $hash) = @_;
   10   my $terms = {};
   11   my @exponents = keys(%{$hash});
   12   my $p;
   13   my $q;
   14   my $cp;
   15   my $cq;
   16   foreach my $ith (@exponents) {
   17     $cp = $hash -> {$ith} -> [0] -> [0];
   18     $cq = $hash -> {$ith} -> [0] -> [1];
   19     $cq = (!defined($cq)) ? 1 : $cq ;
   20     $terms ->{$ith} -> {'coef'} = new Fraction($cp, $cq);
   21     $p = $hash -> {$ith} -> [1] -> [0];
   22     $q = $hash -> {$ith} -> [1] -> [1];
   23     $q = (!defined($q)) ? 1 : $q ;
   24     $terms ->{$ith} -> {'exp'} = new Fraction($p, $q);
   25     }
   26   my $self = { 'variable' => $variable,
   27         'terms' => $terms,
   28         };
   29   bless $self, $class;
   30   return($self);
   31 }
   32 
   33 sub givenVariableAndTerms { # Give reference to hash of Fraction coefficients and exponents
   34   my ($class, $variable, $hash) = @_;
   35   my $terms = {};
   36   my @exponents = keys(%{$hash});
   37   foreach my $ith (@exponents) {
   38     $terms ->{$ith} -> {'coef'} = $hash -> {$ith} -> {'coef'} -> copy ;
   39     $terms ->{$ith} -> {'exp'} = $hash -> {$ith} -> {'exp'} -> copy ;
   40     }
   41   my $self = { 'variable' => $variable,
   42         'terms' => $terms,
   43         };
   44   bless $self, $class;
   45   return($self);
   46 }
   47 
   48 
   49 
   50 
   51 sub terms {
   52   my $self = shift;
   53   if (@_) {$self -> {'terms'} = shift;}
   54   return ($self -> {'terms'});
   55 }
   56 
   57 sub variable {
   58   my $self = shift;
   59   if (@_) {$self->{'variable'} = shift;}
   60   return($self ->{'variable'});
   61 }
   62 
   63 sub printSelf {
   64   my $self = shift;
   65   my $variable = $self->variable();
   66   my $terms = $self -> terms();
   67   my @exponents = keys(%{$terms});
   68   my $string = "";
   69   my $numTerms = scalar(@exponents);
   70   my $jth;
   71   my $coef;
   72   my $exp;
   73   my $p;
   74   my $q;
   75   foreach my $i (0..$numTerms-1) {
   76     $jth = $exponents[$i];
   77     $coef = $terms -> {$jth} -> [0];
   78     $p = $terms -> {$jth} -> [1] -> [0];
   79     $q = $terms -> {$jth} -> [1] -> [1];
   80     $exp = ( !defined($q) or $q==1) ? "$p" : "$p/$q";
   81     $string .= " + " . $coef ." x^{" . $jth ."}";
   82   }
   83   return($string);
   84 }
   85 
   86 sub TeXizeHighFirst {
   87   my $self = shift;
   88   my $variable = $self->variable();
   89   my $terms = $self->terms();
   90   my @exponents  =keys(%{$terms});
   91   my @sorted_exponents = &PGtranslator::PGsort(sub {$_[0] <=> $_[1]}, @exponents);
   92   my $numTerms = scalar(@sorted_exponents);
   93   my $string = "";
   94   my $found = 0;
   95   my $coef;
   96   my $jth;
   97   my $p;
   98   my $q;
   99   my $exp;
  100   my $numer;
  101   my $denom;
  102   foreach my $i (0..$numTerms-1) {
  103     $jth = $sorted_exponents[$numTerms -1 -$i];
  104     if ($jth != 0) {
  105     $exp = $terms -> {$jth} -> {'exp'};
  106     $exp -> reduce();
  107     $numer = $exp -> numerator;
  108     $numerAbs = ($numer < 0) ? -$numer : $numer;
  109     $denom = $exp -> denominator;
  110     $expStr = $exp -> TeXize;
  111     $vterm = ($jth == 1) ? "$variable" :
  112         ( $denom == 1 and $numer >0 ) ? "$variable^{$expStr}"
  113         : ($denom == 1 and $numer == -1) ? "\\frac{1}{$variable}"
  114         : ($denom == 1 and $numer < 0) ? "\\frac{1}{$variable^{$numerAbs}}"
  115         : ($denom == 2 and $numer == 1) ? "\\sqrt{$variable}"
  116         : ($denom == 2 and $numer > 0) ? "\\sqrt{$variable^{$numer}}"
  117         : ($denom == 2 and $numer == -1) ? "\\frac{1}{\\sqrt{$variable}}"
  118         : ($denom == 2 and $numer < 0) ? "\\frac{1}{\\sqrt{$variable^{$numerAbs}}}"
  119         : ($denom != 1 and $numer == 1) ? "\\sqrt[$denom]{$variable}"
  120         : ($denom != 1 and $numer > 0) ? "\\sqrt[$denom]{$variable^{$numer}}"
  121         : ($denom != 1 and $numer == -1) ? "\\frac{1}{\\sqrt[$denom]{$variable}}"
  122         : ($denom != 1 and $numer < 0) ? "\\frac{1}{\\sqrt[$denom]{$variable^{$numerAbs}}}"
  123         : "$variable^{$expStr}";
  124     if (($coef = $terms -> {$jth} -> {'coef'} ->scalar) != 0)
  125       {$coefStr = $terms -> {$jth} -> {'coef'} -> TeXize;
  126       if ($found) {
  127         $string .=
  128           ($coef == 1) ? " + $vterm"
  129           : ($coef > 0) ? " + $coefStr $vterm"
  130             : ($coef == -1) ? " - $vterm"
  131               : "  $coefStr $vterm";
  132         }
  133       else {
  134         $found=1;
  135         $string .=
  136           ($coef == 1) ? " $vterm"
  137           : ($coef > 0) ? " $coefStr $vterm"
  138             : ($coef == -1) ? " - $vterm"
  139               : "  $coefStr $vterm";
  140         }
  141     }
  142   }
  143   else {
  144   if (($coef = $terms -> {$jth} -> {'coef'} ->scalar) != 0)
  145     {$coefStr = $terms -> {$jth} -> {'coef'} -> TeXize;
  146       if ($found) {
  147         $string .= ($coef > 0) ? " + $coefStr "
  148           : "  $coefStr " ;
  149         }
  150       else {
  151         $found=1;
  152         $string .= ($coef > 0) ? " $coefStr "
  153           : "  $coefStr " ;
  154         }
  155       }
  156     }
  157   }
  158   return($string);
  159 }
  160 
  161 sub TeXizeHighFirstAt {
  162   my ($self, $at, @rest) = @_;
  163   my $variable = $self->variable();
  164   if (defined($at)) {
  165     if (ref($at) ne '') {
  166       $variable = $at -> TeXizeHighFirstAt(@rest); }
  167     else {
  168       $variable = $at;
  169       }
  170     $variable = '\left(' . $variable . '\right)';
  171   }
  172   my $terms = $self->terms();
  173   my @exponents  =keys(%{$terms});
  174   my @sorted_exponents = &PGtranslator::PGsort(sub {$_[0] <=> $_[1]}, @exponents);
  175   my $numTerms = scalar(@sorted_exponents);
  176   my $string = "";
  177   my $found = 0;
  178   my $coef;
  179   my $jth;
  180   my $p;
  181   my $q;
  182   my $exp;
  183   my $numer;
  184   my $denom;
  185   foreach my $i (0..$numTerms-1) {
  186     $jth = $sorted_exponents[$numTerms -1 -$i];
  187     if ($jth != 0) {
  188     $exp = $terms -> {$jth} -> {'exp'};
  189     $exp -> reduce();
  190     $numer = $exp -> numerator;
  191     $numerAbs = ($numer < 0) ? -$numer : $numer;
  192     $denom = $exp -> denominator;
  193     $expStr = $exp -> TeXize;
  194     $vterm = ($jth == 1) ? "$variable" :
  195         ( $denom == 1 and $numer >0 ) ? "$variable^{$expStr}"
  196         : ($denom == 1 and $numer == -1) ? "\\frac{1}{$variable}"
  197         : ($denom == 1 and $numer < 0) ? "\\frac{1}{$variable^{$numerAbs}}"
  198         : ($denom == 2 and $numer == 1) ? "\\sqrt{$variable}"
  199         : ($denom == 2 and $numer > 0) ? "\\sqrt{$variable^{$numer}}"
  200         : ($denom == 2 and $numer == -1) ? "\\frac{1}{\\sqrt{$variable}}"
  201         : ($denom == 2 and $numer < 0) ? "\\frac{1}{\\sqrt{$variable^{$numerAbs}}}"
  202         : ($denom != 1 and $numer == 1) ? "\\sqrt[$denom]{$variable}"
  203         : ($denom != 1 and $numer > 0) ? "\\sqrt[$denom]{$variable^{$numer}}"
  204         : ($denom != 1 and $numer == -1) ? "\\frac{1}{\\sqrt[$denom]{$variable}}"
  205         : ($denom != 1 and $numer < 0) ? "\\frac{1}{\\sqrt[$denom]{$variable^{$numerAbs}}}"
  206         : "$variable^{$expStr}";
  207     if (($coef = $terms -> {$jth} -> {'coef'} ->scalar) != 0)
  208       {$coefStr = $terms -> {$jth} -> {'coef'} -> TeXize;
  209       if ($found) {
  210         $string .=
  211           ($coef == 1) ? " + $vterm"
  212           : ($coef > 0) ? " + $coefStr $vterm"
  213             : ($coef == -1) ? " - $vterm"
  214               : "  $coefStr $vterm";
  215         }
  216       else {
  217         $found=1;
  218         $string .=
  219           ($coef == 1) ? " $vterm"
  220           : ($coef > 0) ? " $coefStr $vterm"
  221             : ($coef == -1) ? " - $vterm"
  222               : "  $coefStr $vterm";
  223         }
  224     }
  225   }
  226   else {
  227   if (($coef = $terms -> {$jth} -> {'coef'} ->scalar) != 0)
  228     {$coefStr = $terms -> {$jth} -> {'coef'} -> TeXize;
  229       if ($found) {
  230         $string .= ($coef > 0) ? " + $coefStr "
  231           : "  $coefStr " ;
  232         }
  233       else {
  234         $found=1;
  235         $string .= ($coef > 0) ? " $coefStr "
  236           : "  $coefStr " ;
  237         }
  238       }
  239     }
  240   }
  241   return($string);
  242 }
  243 
  244 sub TeXizeLowFirst {
  245   my $self = shift;
  246   my $variable = $self->variable();
  247   my $terms = $self->terms();
  248   my @exponents  =keys(%{$terms});
  249   my @sorted_exponents = &PGtranslator::PGsort(sub {$_[1] <=> $_[2]}, @exponents);
  250   my $numTerms = scalar(@sorted_exponents);
  251   my $string = "";
  252   my $found = 0;
  253   my $coef;
  254   my $jth;
  255   my $p;
  256   my $q;
  257   my $exp;
  258   foreach my $i (0..$numTerms-1) {
  259     $jth = $sorted_exponents[$numTerms -1 -$i];
  260     if ($jth != 0) {
  261     $exp = $terms -> {$jth} -> {'exp'};
  262     $expStr = $exp -> TeXize;
  263     $vterm = ($jth == 1) ? "$variable" : "$variable^{$expStr}";
  264     if (($coef = $terms -> {$jth} -> {'coef'} ->scalar) != 0)
  265       {$coefStr = $terms -> {$jth} -> {'coef'} -> TeXize;
  266       if ($found) {
  267         $string .=
  268           ($coef == 1) ? " + $vterm"
  269           : ($coef > 0) ? " + $coefStr $vterm"
  270             : ($coef == -1) ? " - $vterm"
  271               : "  $coefStr $vterm";
  272         }
  273       else {
  274         $found=1;
  275         $string .=
  276           ($coef == 1) ? " $vterm"
  277           : ($coef > 0) ? " $coefStr $vterm"
  278             : ($coef == -1) ? " - $vterm"
  279               : "  $coefStr $vterm";
  280         }
  281       }
  282     }
  283   else {
  284   if (($coef = $terms -> {$jth} -> {'coef'} ->scalar) != 0)
  285     {$coefStr = $terms -> {$jth} -> {'coef'} -> TeXize;
  286       if ($found) {
  287         $string .= ($coef > 0) ? " + $coefStr "
  288           : "  $coefStr " ;
  289         }
  290       else {
  291         $found=1;
  292         $string .= ($coef > 0) ? " $coefStr "
  293           : "  $coefStr " ;
  294         }
  295       }
  296     }
  297   }
  298   return($string);
  299 }
  300 
  301 
  302 sub perlizeHighFirst {
  303   my $self = shift;
  304   my $variable = $self->variable();
  305   my $terms = $self->terms();
  306   my @exponents  =keys(%{$terms});
  307   my @sorted_exponents = &PGtranslator::PGsort(sub {$_[0] <=> $_[1]}, @exponents);
  308   my $numTerms = scalar(@sorted_exponents);
  309   my $string = "";
  310   my $found = 0;
  311   my $coef;
  312   my $jth;
  313   my $p;
  314   my $q;
  315   my $exp;
  316   foreach my $i (0..$numTerms-1) {
  317     $jth = $sorted_exponents[$numTerms -1 -$i];
  318     if ($jth != 0) {
  319     $exp = $terms -> {$jth} -> {'exp'};
  320     $expStr = $exp -> perlize;
  321     $vterm = ($jth == 1) ? "$variable" : "$variable**($expStr)";
  322     if (($coef = $terms -> {$jth} -> {'coef'} -> scalar) != 0)
  323       {$coefStr = $terms -> {$jth} -> {'coef'} -> perlize;
  324       if ($found) {
  325         $string .=
  326           ($coef == 1) ? " + $vterm"
  327           : ($coef > 0) ? " + $coefStr * $vterm"
  328             : ($coef == -1) ? " - $vterm"
  329 #             : " - $coefStr * $vterm";
  330               : " - " . ($terms ->{$jth} -> {'coef'} -> times(-1)) -> perlize
  331                   . $vterm;
  332         }
  333       else {
  334         $found=1;
  335         $string .=
  336           ($coef == 1) ? " $vterm"
  337           : ($coef > 0) ? " $coefStr * $vterm"
  338             : ($coef == -1) ? " - $vterm"
  339 #             : " - $coefStr * $vterm";
  340               : " - " . ($terms ->{$jth} -> {'coef'} -> times(-1)) -> perlize
  341                   . $vterm;
  342         }
  343       }
  344     }
  345   else {
  346   if (($coef = $terms -> {$jth} -> {'coef'}) != 0)
  347     {$coefStr = $terms -> {$jth} -> {'coef'} -> perlize;
  348       if ($found) {
  349         $string .= ($coef > 0) ? " + $coefStr "
  350 #         : " - $coefStr " ;
  351           : " - " . ($terms ->{$jth} -> {'coef'} -> times(-1)) -> perlize;
  352         }
  353       else {
  354         $found=1;
  355         $string .= ($coef > 0) ? " $coefStr "
  356 #         : " - $coefStr " ;
  357           : " - " . ($terms ->{$jth} -> {'coef'} -> times(-1)) -> perlize;
  358         }
  359       }
  360     }
  361   }
  362   return($string);
  363 }
  364 
  365 sub perlizeHighFirstAt {
  366   my ($self, $at, @rest) = @_;
  367   my $variable = $self->variable();
  368   if (defined($at)) {
  369     if (ref($at) ne '') {
  370       $variable = $at -> perlizeHighFirstAt(@rest); }
  371     else {
  372       $variable = $at;
  373       }
  374     $variable = '(' . $variable . ')';
  375   }
  376   my $terms = $self->terms();
  377   my @exponents  =keys(%{$terms});
  378   my @sorted_exponents = &PGtranslator::PGsort(sub {$_[0] <=> $_[1]}, @exponents);
  379   my $numTerms = scalar(@sorted_exponents);
  380   my $string = "";
  381   my $found = 0;
  382   my $coef;
  383   my $jth;
  384   my $p;
  385   my $q;
  386   my $exp;
  387   foreach my $i (0..$numTerms-1) {
  388     $jth = $sorted_exponents[$numTerms -1 -$i];
  389     if ($jth != 0) {
  390     $exp = $terms -> {$jth} -> {'exp'};
  391     $expStr = $exp -> perlize;
  392     $vterm = ($jth == 1) ? "$variable" : "$variable**($expStr)";
  393     if (($coef = $terms -> {$jth} -> {'coef'} ->scalar) != 0)
  394       {$coefStr = $terms -> {$jth} -> {'coef'} -> perlize;
  395       if ($found) {
  396         $string .=
  397           ($coef == 1) ? " + $vterm"
  398           : ($coef > 0) ? " + $coefStr * $vterm"
  399             : ($coef == -1) ? " - $vterm"
  400               : "  $coefStr * $vterm";
  401         }
  402       else {
  403         $found=1;
  404         $string .=
  405           ($coef == 1) ? " $vterm"
  406           : ($coef > 0) ? " $coefStr * $vterm"
  407             : ($coef == -1) ? " - $vterm"
  408               : "  $coefStr * $vterm";
  409         }
  410       }
  411     }
  412   else {
  413   if (($coef = $terms -> {$jth} -> {'coef'}) != 0)
  414     {$coefStr = $terms -> {$jth} -> {'coef'} -> perlize;
  415       if ($found) {
  416         $string .= ($coef > 0) ? " + $coefStr "
  417           : "  $coefStr " ;
  418         }
  419       else {
  420         $found=1;
  421         $string .= ($coef > 0) ? " $coefStr "
  422           : "  $coefStr " ;
  423         }
  424       }
  425     }
  426   }
  427   return($string);
  428 }
  429 
  430 
  431 sub scalarMult {
  432   my $self = shift;
  433   my $scalar = shift;
  434   if (!(defined($scalar))) {return(undef());}
  435   my $variable = $self -> variable;
  436   my $terms = $self -> terms;
  437   my @exponents = keys(%{$terms});
  438   foreach my $ith (@exponents) {
  439     $terms ->{$ith} -> {'coef'} = $terms -> {$ith} -> {'coef'} -> times($scalar);
  440   }
  441   my $scalarM = givenVariableAndTerms  PowerPolynomial($variable, $terms);
  442   return($scalarM);
  443 }
  444 
  445 
  446 
  447 sub derivative {
  448   my $self = shift;
  449   my $class = ref($self);
  450   my $variable = shift;
  451   if (!(defined($variable))) { $variable = $self -> variable;}
  452   my $terms = $self->terms();
  453   my @exponents  =keys(%{$terms});
  454   my $derTerms = {};
  455   my ($derExp, $derCoef, $derExponent);
  456   foreach my $exp (@exponents) {
  457     if ($exp != 0) {
  458     $derExp = $exp - 1;
  459     $derCoef = $terms->{$exp}->{'coef'} -> times($terms -> {$exp} -> {'exp'});
  460     $derExponent = $terms -> {$exp} -> {'exp'} -> minus(1);
  461     $derTerms -> {$derExp} -> {'coef'} = $derCoef;
  462     $derTerms -> {$derExp} -> {'exp'} = $derExponent;
  463     }
  464   }
  465   my $derivative = {'variable' => $variable,
  466             'terms' => $derTerms,
  467           };
  468   bless $derivative, $class;
  469   return($derivative);
  470 }
  471 
  472 sub antiDerivative {
  473   my $self = shift;
  474   my $class = ref($self);
  475   my $variable = shift;
  476   if (!(defined($variable))) { $variable = $self -> variable;}
  477   my $terms = $self->terms();
  478   my @exponents  =keys(%{$terms});
  479   my $antiDerTerms = {};
  480   my ($antiDerExp, $antiDerCoef, $antiDerExponent);
  481   foreach my $exp (@exponents) {
  482     if ($exp != -1) {
  483     $antiDerExp = $exp + 1;
  484     $antiDerCoef = $terms->{$exp}->{'coef'} -> divBy($terms->{$exp}->{'exp'}->plus(1));
  485     $antiDerExponent = $terms -> {$exp} -> {'exp'} -> plus(1);
  486     $antiDerTerms -> {$antiDerExp} -> {'coef'} = $antiDerCoef;
  487     $antiDerTerms -> {$antiDerExp} -> {'exp'} = $antiDerExponent;
  488     }
  489   }
  490   my $antiDerivative = {'variable' => $variable,
  491             'terms' => $antiDerTerms,
  492           };
  493   bless $antiDerivative, $class;
  494   return($antiDerivative);
  495 }
  496 
  497 1;
  498 

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9