[system] / trunk / pg / macros / PGauxiliaryFunctions.pl Repository:
ViewVC logotype

Annotation of /trunk/pg/macros/PGauxiliaryFunctions.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3305 - (view) (download) (as text)

1 : apizer 1080
2 : sh002i 1050 sub _PGauxiliaryFunctions_init {
3 :    
4 :     }
5 :    
6 : apizer 1303 #
7 : dpvc 2576 # Get the functions that are in common with Parser.pm
8 : apizer 1303 #
9 : dpvc 2576 loadMacros("PGcommonFunctions.pl");
10 : apizer 1303
11 :     #
12 : dpvc 2576 # Do the additional functions
13 : apizer 1303 #
14 : sh002i 1050 sub step { # heavyside function (1 or x>0)
15 :     my $x = shift;
16 :     ($x > 0 ) ? 1 : 0;
17 :     }
18 :     sub ceil {
19 :     my $x = shift;
20 :     - floor(-$x);
21 :     }
22 :     sub floor {
23 :     my $input = shift;
24 :     my $out = int $input;
25 :     $out -- if ( $out <= 0 and ($out-$input) > 0 ); # does the right thing for negative numbers
26 :     $out;
27 :     }
28 :    
29 :     sub max {
30 :    
31 :     my $maxVal = shift;
32 :     my @input = @_;
33 : apizer 1080
34 : sh002i 1050 foreach my $num (@input) {
35 :     $maxVal = $num if ($maxVal < $num);
36 :     }
37 : apizer 1080
38 : sh002i 1050 $maxVal;
39 :    
40 : apizer 1080 }
41 : sh002i 1050
42 :     sub min {
43 :    
44 :     my $minVal = shift;
45 :     my @input = @_;
46 : apizer 1080
47 : sh002i 1050 foreach my $num (@input) {
48 :     $minVal = $num if ($minVal > $num);
49 :     }
50 :    
51 :     $minVal;
52 :    
53 : apizer 1080 }
54 :    
55 : gage 1090 #round added 6/12/2000 by David Etlinger. Edited by AKP 3-6-03
56 :    
57 : sh002i 1050 sub round {
58 :     my $input = shift;
59 : gage 1090 my $out = Round($input);
60 :     # if( $input >= 0 ) {
61 :     # $out = int ($input + .5);
62 :     # }
63 :     # else {
64 :     # $out = ceil($input - .5);
65 :     # }
66 : sh002i 1050 $out;
67 :     }
68 :    
69 : gage 1090 # Round contributed bt Mark Schmitt 3-6-03
70 :     sub Round {
71 :     if (@_ == 1) { $_[0] > 0 ? int $_[0] + 0.5 : int $_[0] - 0.5}
72 :     elsif (@_ == 2) { $_[0] > 0 ? Round($_[0]*10**$_[1])/10**$_[1] :Round($_[0]*10**$_[1])/10**$_[1]}
73 :     }
74 :    
75 : sh002i 1050 #least common multiple
76 :     #VS 6/29/2000
77 :     sub lcm {
78 :     my $a = shift;
79 :     my $b = shift;
80 :    
81 :     #reorder such that $a is the smaller number
82 :     if ($a > $b) {
83 :     my $temp = $a;
84 :     $a = $b;
85 :     $b = $temp;
86 :     }
87 :    
88 :     my $lcm = 0;
89 :     my $curr = $b;;
90 :    
91 :     while($lcm == 0) {
92 :     $lcm = $curr if ($curr % $a == 0);
93 :     $curr += $b;
94 :     }
95 :    
96 :     $lcm;
97 :    
98 :     }
99 :    
100 :    
101 :     # greatest common factor
102 :     # takes in two scalar values and uses the Euclidean Algorithm to return the gcf
103 :     #VS 6/29/2000
104 :    
105 : apizer 1080 sub gcf {
106 : sh002i 1050 my $a = abs(shift); # absolute values because this will yield the same gcd,
107 :     my $b = abs(shift); # but allows use of the mod operation
108 :    
109 :     # reorder such that b is the smaller number
110 :     if ($a < $b) {
111 :     my $temp = $a;
112 :     $a = $b;
113 :     $b = $temp;
114 :     }
115 : apizer 1080
116 : sh002i 1050 return $a if $b == 0;
117 : apizer 1080
118 : sh002i 1050 my $q = int($a/$b); # quotient
119 :     my $r = $a % $b; # remainder
120 :    
121 :     return $b if $r == 0;
122 :    
123 :     my $tempR = $r;
124 : apizer 1080
125 : sh002i 1050 while ($r != 0) {
126 :    
127 : apizer 1080 #keep track of what $r was in the last loop, as this is the value
128 : sh002i 1050 #we will want when $r is set to 0
129 :     $tempR = $r;
130 :    
131 :     $a = $b;
132 :     $b = $r;
133 :     $q = $a/$b;
134 :     $r = $a % $b;
135 :    
136 :     }
137 :    
138 :     $tempR;
139 :     }
140 :    
141 :    
142 :     #greatest common factor.
143 :     #same as gcf, but both names are sufficiently common names
144 :     sub gcd {
145 :     return gcf($_[0], $_[1]);
146 :     }
147 :    
148 :     #returns 1 for a prime number, else 0
149 :     #VS 6/30/2000
150 :     sub isPrime {
151 :     my $num = shift;
152 :     return 1 if ($num == 2 or $num == 3);
153 :     return 0 if ($num == 1 or $num == 0);
154 : jj 1126 for (my $i = 2; $i <= sqrt($num); $i++) { return 0 if ($num % $i == 0); }
155 : sh002i 1050 return 1;
156 :     }
157 :    
158 :     #reduces a fraction, returning an array containing ($numerator, $denominator)
159 :     #VS 7/10/2000
160 :     sub reduce {
161 :    
162 :     my $num = shift;
163 :     my $denom = shift;
164 :     my $gcd = gcd($num, $denom);
165 :    
166 :     $num = $num/$gcd;
167 :     $denom = $denom/$gcd;
168 :    
169 :     # formats such that only the numerator will be negative
170 :     if ($num/$denom < 0) {$num = -abs($num); $denom = abs($denom);}
171 :     else {$num = abs($num); $denom = abs($denom);}
172 :    
173 :     my @frac = ($num, $denom);
174 :     @frac;
175 :     }
176 :    
177 :    
178 : apizer 1080 # takes a number and fixed object, as in "$a x" and formats
179 : sh002i 1050 # to account for when $a = 0, 1, -1
180 :     # Usage: format($scalar, "quoted string");
181 :     # Example: format(-1, "\pi") returns "-\pi"
182 :     # VS 8/1/2000 - slight adaption of code from T. Shemanske of Dartmouth College
183 :     sub preformat {
184 :     my $num = shift;
185 :     my $obj = shift;
186 :     my $out;
187 :    
188 : apizer 1080
189 : sh002i 1050 if ($num == 0) { return 0; }
190 :     elsif ($num == 1) { return $obj; }
191 :     elsif ($num == -1) { return "-".$obj; }
192 :    
193 :     return $num.$obj;
194 :     }
195 :    
196 :     #factorial
197 :    
198 :     sub fact {
199 : gage 1071 P($_[0], $_[0]);
200 : sh002i 1050 }
201 : gage 1071
202 : sh002i 1050 # return 1 so that this file can be included with require
203 :     1

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9