[system] / trunk / pg / lib / PowerPolynomial.pm Repository: Repository Listing bbplugincoursesdistsnplrochestersystemwww

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

Revision 2558 - (download) (as text) (annotate)
Wed Jul 28 20:32:33 2004 UTC (15 years, 6 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