Merge lp://staging/~ubuntu-fr-scripts/ufrs-math/lib-bc into lp://staging/ufrs-math
- lib-bc
- Merge into math
Proposed by
Jean-Mi
Status: | Merged |
---|---|
Approved by: | Jean-Mi |
Approved revision: | 4 |
Merge reported by: | Jean-Mi |
Merged at revision: | not available |
Proposed branch: | lp://staging/~ubuntu-fr-scripts/ufrs-math/lib-bc |
Merge into: | lp://staging/ufrs-math |
Diff against target: | None lines |
To merge this branch: | bzr merge lp://staging/~ubuntu-fr-scripts/ufrs-math/lib-bc |
Related bugs: | |
Related blueprints: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Jean-Mi | Approve | ||
Review via email: mp+5058@code.staging.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Jean-Mi (jeanmi) wrote : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added directory 'bc-lib' |
2 | === added file 'bc-lib/README.bc-lib' |
3 | --- bc-lib/README.bc-lib 1970-01-01 00:00:00 +0000 |
4 | +++ bc-lib/README.bc-lib 2009-03-31 00:25:36 +0000 |
5 | @@ -0,0 +1,10 @@ |
6 | +# Bibliothèque de fonctions pour GNU bc |
7 | +# |
8 | +# Auteurs : Jean-Michel Juzan ainsi que d'autre membres |
9 | +# de la communauté du libre |
10 | +# |
11 | +# export BCLIB="/usr/share/ufrs-math/bc-lib" |
12 | +# Usage : bc -l $BCLIB/nom_bibliothèque.bc |
13 | +# |
14 | +# Dépend de bc |
15 | +# |
16 | |
17 | === added file 'bc-lib/anglelog.bc' |
18 | --- bc-lib/anglelog.bc 1970-01-01 00:00:00 +0000 |
19 | +++ bc-lib/anglelog.bc 2009-03-21 02:39:06 +0000 |
20 | @@ -0,0 +1,36 @@ |
21 | +### AngleLog.BC - logarithmic function that are semi-linear, |
22 | +# changing gradient at each power of the base for GNU bc. |
23 | + |
24 | +# run with funcs.bc |
25 | + |
26 | +## Specific functions for base 10 |
27 | + |
28 | +# Generate the x-th number in the sequence: |
29 | +# 1,2,3,4,5,6,7,8,9,10,20,30,...,90,100,200,300,...,900,1000,2000,... |
30 | +# e.g. al10(0) = 1 ; al10(11) = 30 |
31 | +define al10(x) { |
32 | + return( (rem(x,9)+1) * 10^int(x/9) ) |
33 | +} |
34 | + |
35 | +# Invert the above |
36 | +# e.g. ial10(50) = 13 ; ial10(1) = 0 |
37 | +define ial10(x) { |
38 | + auto k; |
39 | + k = int(log(10,x)) |
40 | + return( 9*k + x/10^k - 1) |
41 | +} |
42 | + |
43 | +## Generalised functions for any base b |
44 | + |
45 | +# al(10,x) is equivalent to the above al10(x) |
46 | +define al(b,x) { |
47 | + return( (rem(x,b-1)+1) * b^int(x/(b-1)) ) |
48 | +} |
49 | + |
50 | +# Invert the previous function |
51 | +define ial(b,x) { |
52 | + auto k |
53 | + k = int(log(b,x)) |
54 | + return( (b-1)*k + x/b^k - 1) |
55 | +} |
56 | + |
57 | |
58 | === added file 'bc-lib/cf.bc' |
59 | --- bc-lib/cf.bc 1970-01-01 00:00:00 +0000 |
60 | +++ bc-lib/cf.bc 2009-03-21 02:39:06 +0000 |
61 | @@ -0,0 +1,97 @@ |
62 | +### CF.BC - Continued fraction experimentation for GNU bc |
63 | + |
64 | +# Create a continued fraction representation of x in the global array cf[] |
65 | +define cf(x) { |
66 | + auto sign, i, s3 |
67 | + s3=int(scale/2); |
68 | + sign=sgn(x);x*=sign |
69 | + for(i=0;i<=s3;i++) { |
70 | + cf[i]=int(x) |
71 | + if(cf[i]>10^s3)break; |
72 | + x-=cf[i] |
73 | + if(x==0){i+=1;break} |
74 | + x=1/x |
75 | + } |
76 | + cf[i]=0 |
77 | +} |
78 | + |
79 | +# Create a continued fraction representation of x in the global array cf[] |
80 | +# using alternating signs |
81 | +define cf2(x) { |
82 | + auto sign, i, s3 |
83 | + s3=int(scale/2); |
84 | + sign=sgn(x);x*=sign |
85 | + for(i=0;i<=s3;i++) { |
86 | + cf[i]=1+int(x) |
87 | + if(cf[i]>10^s3)break; |
88 | + x-=cf[i] |
89 | + if(i!=2*int(i/2))cf[i]*=-1 |
90 | + if(x==0){i+=1;break} |
91 | + x=1/-x |
92 | + } |
93 | + cf[i]=0 |
94 | +} |
95 | + |
96 | +# Output the global array cf[] formatted as a continued fraction |
97 | +define printcf() { |
98 | + auto i; |
99 | + print "[", cf[0], "; "; |
100 | + i=1;if(cf[i]!=0)for(i=1;cf[i+1]!=0;i++)print cf[i], ", "; |
101 | + print cf[i], "]\n"; |
102 | +} |
103 | + |
104 | +# Convert global array cf[] back into a number |
105 | +define cf2num() { |
106 | + auto n, i; |
107 | + for(i=0;cf[i]!=0;i++){} |
108 | + n=cf[--i] |
109 | + for(;i>=0;i--)n=1/n+cf[i] |
110 | + return(n); |
111 | +} |
112 | + |
113 | +# Turn the alternating signed continued fraction representation of x back |
114 | +# into a number by first taking the absolute value of the chain |
115 | +define cfflip(x) { |
116 | + cf2(x) |
117 | + for(i=0;cf[i]!=0;i++)cf[i]=abs(cf[i]) |
118 | + return(cf2num()); |
119 | +} |
120 | + |
121 | +# Turn the alternating signed continued fraction representation of x back |
122 | +# into a number by first taking the absolute value less one of the chain |
123 | +define cfflip1(x) { |
124 | + cf2(x) |
125 | + for(i=0;cf[i]!=0;i++)cf[i]=abs(cf[i])-1 |
126 | + return(cf2num()); |
127 | +} |
128 | + |
129 | +# Turn the binary representation of x into a continued fraction-like |
130 | +# structure using global array cf[]. |
131 | +# e.g. 0.1001000011111101110111 -> [0;1,2,1,4,6,1,3,1,3] |
132 | +define bincf(x) { |
133 | + auto i,b,bb,n,j; |
134 | + x=abs(x);if(x>1)x=frac(x) |
135 | + x*=2;b=int(x);x-=b;n=1;j=1;cf[0]=0 |
136 | + for(i=0;i<scale;i++){ |
137 | + x*=2;bb=int(x) |
138 | + if(bb==b){n+=1}else{cf[j]=n;j+=1;n=1} |
139 | + b=bb;x-=b |
140 | + } |
141 | + if(n!=0){cf[j]=n;j+=1} |
142 | + cf[j-1]*=b |
143 | +} |
144 | + |
145 | +# Read a continued fraction as a representation of alternating groups of |
146 | +# bits in a binary number. |
147 | +# e.g. [1;4,1,4,1,4,1,4,1...] -> 0.11110111101111011110... |
148 | +define cfbin() { |
149 | + auto n,i,b,x; |
150 | + #cf[0]=0; |
151 | + for(i=1;cf[i]!=0;i++){} |
152 | + n=cf[--i];b=1;x=0 |
153 | + for(;i>=0;i--){ |
154 | + for(j=0;j<n;j++)x=x/2+b |
155 | + b=1-b |
156 | + } |
157 | + return(x) |
158 | +} |
159 | |
160 | === added file 'bc-lib/collatz.bc' |
161 | --- bc-lib/collatz.bc 1970-01-01 00:00:00 +0000 |
162 | +++ bc-lib/collatz.bc 2009-03-21 02:39:06 +0000 |
163 | @@ -0,0 +1,113 @@ |
164 | +### Collatz.BC - The 3x+1 or hailstones problem for GNU bc |
165 | + |
166 | +## Here we'll be using the modified rules of |
167 | +## Odd -> (3x+1)/2 |
168 | +## Even -> x/2 |
169 | +## ...as otherwise the usual odd step (3x+1) is always followed by |
170 | +## the even step. This way each rule has a 50/50 distribtion. |
171 | + |
172 | +# Generate the next hailstone 5 -> (3*5+1)/2 = 8; 8 -> 8/2 = 4; |
173 | +define cz_next(x) { |
174 | + auto os;if(x<=1)return(1) |
175 | + os=scale;scale=0;x/=1 |
176 | + if(x%2)x=3*x+1;x/=2 |
177 | + scale=os |
178 | + return(x) |
179 | +} |
180 | + |
181 | +# Take a guess at the previous hailstone - since in some cases there are |
182 | +# two choices, this function always chooses the lower option. |
183 | +# e.g. 5 comes from both 3 [(3*(3)+1)/2] and 10 [10/2] |
184 | +# - this function chooses 3. |
185 | +define cz_prev(x) { |
186 | + auto os;if(x<=1)return(1) |
187 | + os=scale;scale=0;x/=1 |
188 | + x=2*x-1;if(x%3){x+=1}else{x/=3} |
189 | + scale=os |
190 | + return(x) |
191 | +} |
192 | + |
193 | +# Determine the hailstone chain length to 1 |
194 | +# e.g. [5 -> 8 -> 4 -> 2 -> 1] = 4 steps |
195 | +define cz_chlen(x) { |
196 | + auto os,c;if(x<=1)return(0) |
197 | + os=scale;scale=0;x/=1 |
198 | + c=0 |
199 | + while(x!=1){ |
200 | + c+=1 |
201 | + if(x%2)x=3*x+1;x/=2 |
202 | + } |
203 | + scale=os |
204 | + return(c) |
205 | +} |
206 | + |
207 | +# Add the values of all the hailstones in a chain. |
208 | +# [5 -> 8 -> 4 -> 2 -> 1] => 5 + 8 + 4 + 2 + 1 = 20 |
209 | +define cz_chsum(x) { |
210 | + auto os,s;if(x<=1)return(0) |
211 | + os=scale;scale=0;x/=1 |
212 | + s=x |
213 | + while(x!=1){ |
214 | + if(x%2)x=3*x+1;x/=2 |
215 | + s+=x |
216 | + } |
217 | + scale=os |
218 | + return(s) |
219 | +} |
220 | + |
221 | +# Print the whole hailstone chain of numbers from x |
222 | +define cz_chain(x) { |
223 | + auto os;if(x<=1)return(0) |
224 | + os=scale;scale=0;x/=1 |
225 | + while(x!=1){ |
226 | + x |
227 | + if(x%2)x=3*x+1;x/=2 |
228 | + } |
229 | + scale=os |
230 | + return(1) |
231 | +} |
232 | + |
233 | +# Find the highest 'altitude' that the hailstone chain for x reaches |
234 | +define cz_chmax(x) { |
235 | + auto os,m;if(x<=1)return(0) |
236 | + os=scale;scale=0;x/=1 |
237 | + m=0 |
238 | + while(x!=1){ |
239 | + if(x>m)m=x |
240 | + if(x%2)x=3*x+1;x/=2 |
241 | + } |
242 | + scale=os |
243 | + return(m) |
244 | +} |
245 | + |
246 | +# Generate a binary number representing a hailstone choice path |
247 | +define cz_8tp(x) { # 8-tree path |
248 | +# all numbers lead back to 8, this function maps the path as a binary |
249 | +# number with the bit representing 8 as most significant. |
250 | +# (8) = 1, (5 -> 8) = 10, (16 -> 8) = 11, (10 -> 5 -> 8) = 101, etc |
251 | + auto os,p,t;if(x<4)return(0) |
252 | + os=scale;scale=0;x/=1 |
253 | + p=0;t=1 |
254 | + while(x!=8){ |
255 | + if(x%2){x=(3*x+1)/2}else{x/=2;p+=t} |
256 | + t*=2 |
257 | + } |
258 | + p+=t |
259 | + scale=os |
260 | + return(p) |
261 | +} |
262 | + |
263 | +# Generate a hailstone from its path's binary number |
264 | +define cz_i8tp(p) { # convert an 8-tree path back into a number |
265 | + auto os,msb,x;if(p<1)return(0) |
266 | + os=scale;scale=0;p/=1 |
267 | + msb=1;while(msb<=p)msb*=2;msb/=2 |
268 | + x=8;p-=msb;msb/=2 |
269 | + while(msb){ |
270 | + while(msb>p){scale=os;x=(2*x-1)/3;scale=0; msb/=2} |
271 | + if(msb){scale=os;x*=2;scale=0; p-=msb;msb/=2} |
272 | + } |
273 | + p=x/1;if(p==x)x=p # remove zeroes after dp if there are any |
274 | + scale=os |
275 | + return(x) |
276 | +} |
277 | |
278 | === added file 'bc-lib/complex.bc' |
279 | --- bc-lib/complex.bc 1970-01-01 00:00:00 +0000 |
280 | +++ bc-lib/complex.bc 2009-03-21 02:39:06 +0000 |
281 | @@ -0,0 +1,200 @@ |
282 | +### Complex.BC - Rudimentary complex number handling for GNU BC |
283 | + |
284 | +## Not to be regarded as suitable for any purpose |
285 | +## Not guaranteed to return correct answers |
286 | + |
287 | +# Read a digit from the decimal representation of a number |
288 | +# read_digit(3210.987, -1) returns 9 as that is the digit in |
289 | +# the 10^-1 position. |
290 | +define read_digit(number, place) { |
291 | + auto os,d;os = scale |
292 | + number*=10^-place |
293 | + scale=0 |
294 | + d = (number%10)/1 |
295 | + scale=os |
296 | + return(d) |
297 | +} |
298 | + |
299 | +# MakeComplex: Turn two numbers into one by interleaving the digits |
300 | +define makecomplex(r,i) { |
301 | + auto c, rd, id, ri, ii, j, sign |
302 | + |
303 | + r /= 1 |
304 | + i /= 1 |
305 | + ri = length(r)-scale |
306 | + ii = length(i)-scale |
307 | + |
308 | + sign = 1 |
309 | + if (r<0){r*=-1;sign+=2} |
310 | + if (i<0){i*=-1;sign+=1} |
311 | + |
312 | + if(ri<ii)ri=ii |
313 | + scale *= 2 |
314 | + |
315 | + c = 0/1 |
316 | + |
317 | + for(j=-scale;j<ri;j++) { |
318 | + rd = read_digit(r, j) |
319 | + id = read_digit(i, j) |
320 | + c += (rd*10+id)*100^j |
321 | + } |
322 | + |
323 | + c += 100^j*sign |
324 | + |
325 | + scale /= 2 |
326 | + return(c) |
327 | + |
328 | +} |
329 | + |
330 | +# workhorse for real & imag |
331 | +define realimag_(c,f) { |
332 | + auto x, sign, cs, ci, j, os |
333 | + os = scale |
334 | + cs = scale(c);ci = length(c)-cs-1 |
335 | + |
336 | + sign = read_digit(c,ci) |
337 | + |
338 | + scale = cs/2 |
339 | + |
340 | + x = 0 |
341 | + for(j=-scale;j*2<ci;j++) { |
342 | + x += 10^j * read_digit(c,j*2+f) |
343 | + } |
344 | + |
345 | + if ( (sign == 2+f) || (sign == 4) )x*=-1 |
346 | + |
347 | + scale = os |
348 | + return(x) |
349 | +} |
350 | + |
351 | +# Extract the real part of a generated complex number |
352 | +define real(c) { |
353 | + return realimag_(c,1) |
354 | +} |
355 | + |
356 | +# Extract the imaginary part of a generated complex number |
357 | +define imag(c) { |
358 | + return realimag_(c,0) |
359 | +} |
360 | + |
361 | +# Print a generated complex number |
362 | +# (normal print functions don't work on complex numbers) |
363 | +define printc(c) { |
364 | + auto r,i |
365 | + r = real(c)/1 |
366 | + i = imag(c)/1 |
367 | + print r |
368 | + if(i<0){print " -";i*=-1}else{print " +"} |
369 | + print " i*" |
370 | + return(i) |
371 | +} |
372 | + |
373 | +## Basic math - ordinary bc operators don't work on these special |
374 | +## interleaved complex numbers |
375 | + |
376 | +# Add two complex numbers and return another complex number |
377 | +define cadd(c1,c2) { |
378 | + return makecomplex(real(c1)+real(c2),imag(c1)+imag(c2)) |
379 | +} |
380 | + |
381 | +# Subtract a complex number from another, returning complex |
382 | +define csub(c1,c2) { |
383 | + return makecomplex(real(c1)-real(c2),imag(c1)-imag(c2)) |
384 | +} |
385 | + |
386 | +# Multiply two complex, return complex |
387 | +define cmul(c1,c2) { |
388 | + auto r1,r2,i1,i2; |
389 | + r1 = real(c1) |
390 | + i1 = imag(c1) |
391 | + r2 = real(c2) |
392 | + i2 = imag(c2) |
393 | + return makecomplex(r1*r2-i1*i2, r2*i1+r1*i2) |
394 | +} |
395 | + |
396 | +# Calculates the absolute value of a complex number |
397 | +# NB: returns a standard bc number and not a new fangled 'complex' |
398 | +define cabs(c) { |
399 | + return sqrt(real(c)^2+imag(c)^2) |
400 | +} |
401 | + |
402 | +# Returns the complex conjugate of a complex number |
403 | +# ...is faster than the hashed out return line |
404 | +define cconj(c) { |
405 | + #return makecomplex(real(c), -imag(c)) |
406 | + return c - 2*10^(length(c)-scale(c)-1) |
407 | +} |
408 | + |
409 | +# Divide one complex by another, returning a third |
410 | +define cdiv(c1,c2) { |
411 | + auto r1,r2,i1,i2,aa; |
412 | + r1 = real(c1) |
413 | + r2 = real(c2) |
414 | + i1 = imag(c1) |
415 | + i2 = imag(c2) |
416 | + aa = r2^2+i2^2 |
417 | + return makecomplex((r1*r2+i1*i2)/aa, (r2*i1-r1*i2)/aa) |
418 | +} |
419 | + |
420 | +# Negate a complex number (i.e. multiply by -1) |
421 | +# ...faster than cmul(c, makecomplex(-1,0)) |
422 | +# ...or the hashed out return line |
423 | +define cneg(c) { |
424 | + auto sign, t; |
425 | + # return makecomplex(-real(c), -imag(c)) |
426 | + t = length(c) - scale(c) - 1 |
427 | + sign = read_digit(c,t) |
428 | + c += (5-2*sign)*(10^t) |
429 | + return(c) |
430 | +} |
431 | + |
432 | +## Basic Math II - fast[er] squaring, square roots and integer power |
433 | + |
434 | +# Square a complex number |
435 | +define csquare(c) { |
436 | + auto r,i |
437 | + r = real(c) |
438 | + i = imag(c) |
439 | + return makecomplex(r^2-i^2, 2*r*i) |
440 | +} |
441 | + |
442 | +# Find the primary square root of a complex number |
443 | +define csqrt(c) { |
444 | + auto r,i, sr, si |
445 | + r = real(c) |
446 | + i = imag(c) |
447 | + if(i==0){if(r>=0){ |
448 | + return(makecomplex(sqrt(r),0)) |
449 | + } else { |
450 | + return(makecomplex(0,sqrt(-r))) |
451 | + }} |
452 | + sr = sqrt((sqrt(r^2+i^2)+r)/2) |
453 | + si = i/sr/2 |
454 | + return makecomplex(sr,si) |
455 | +} |
456 | + |
457 | +# subfunctions for use by cintpow |
458 | +define mod(n,m) {auto s;s=scale;scale=0;n%=m;scale=s;return(n)} |
459 | +define int(n) {auto s;s=scale;scale=0;n/=1;scale=s;return(n)} |
460 | + |
461 | +# Raise a complex number [c] to an integer power [n] |
462 | +# NB: n is a standard bc number and not a complex |
463 | +define cintpow(c, n) { |
464 | + auto x |
465 | + x = makecomplex(1,0) |
466 | + n = int(n) |
467 | + if(n<0)return( cdiv(x,cintpow(c,-n)) ) |
468 | + if(n==0)return( x ) |
469 | + if(n==1)return( c ) |
470 | + if(n==2)return( csquare(c) ) |
471 | + while(n) { |
472 | + if(mod(n,2)) { |
473 | + x = cmul(x, c) ; n -= 1 |
474 | + #print "DEBUG: cintpow - odd_ (",n,")\n" |
475 | + } else { |
476 | + c = csquare(c) ; n = int(n/2) |
477 | + #print "DEBUG: cintpow - even (",n,")\n" |
478 | + } |
479 | + } |
480 | + return x |
481 | +} |
482 | |
483 | === added file 'bc-lib/electric.bc' |
484 | --- bc-lib/electric.bc 1970-01-01 00:00:00 +0000 |
485 | +++ bc-lib/electric.bc 2009-03-21 02:39:06 +0000 |
486 | @@ -0,0 +1,314 @@ |
487 | +### electric.bc - a large number of functions for use with GNU BC |
488 | + |
489 | +## Not to be regarded as suitable for any purpose |
490 | +## Not guaranteed to return correct answers |
491 | +# |
492 | +# jmj(at)bowlfr.org |
493 | + |
494 | +# Calcule du nombre pi |
495 | + |
496 | +# (loi d'OHM) : Calcul de la résistance d'un circuit connaissant la tension appliquée et l'intensité du courant. |
497 | +# Énoncé : La résistance, exprimée en ohms, s'obtient en divisant la tension exprimée en volts par l'intensité du courant, exprimée en ampères. |
498 | +# La formule peut aussi s'appliquer en exprimant la tension et l'intensité du courant respectivement en sous-multiples (ou en multiples) du volt et de l'ampère ; en particulier, on peut exprimer la tension en millivolts (mV ; 1 mV = 0,001 V) et l'intensité du courant en milliampères (mA ; 1 mA = 0,001 A) et ainsi la résistance sera exprimée en ohms. |
499 | +# Cependant, si la tension est exprimée en volts et l'intensité du courant en milliampères (mA ; 1 mA = 0,001 A), la résistance sera exprimée en kilo-ohms (kW ; 1 kW = 1 000 W). On exprime quelquefois la tension en volts et l'intensité du courant en microampères (µA ; 1 µA = 0,000 001 A) ; dans ce cas, en appliquant la formule, on obtient la résistance exprimée en mégohms (MW ; 1 MW = 1 000 000 W). |
500 | +# r = résistance en W (ohm) |
501 | +# v = tension en V (volt) |
502 | +# i = intensité du courant en A (ampère) |
503 | + |
504 | +define r2vi(v,i) { |
505 | + return( v/i ) |
506 | +} |
507 | + |
508 | +# (loi d'OHM) : Calcul de la tension appliquée à un circuit connaissant la résistance et l'intensité du courant |
509 | +# La formule peut aussi s'appliquer en exprimant la résistance et l'intensité du courant respectivement avec les sous-multiples de l'ohm et de l'ampère ; on peut en particulier exprimer la résistance en kilo-ohms (kW) et l'intensité du courant en milliampères (mA) et ainsi la tension sera exprimée en volts. |
510 | +# v = tension en V (volt) |
511 | +# r = résistance en W (ohm) |
512 | +# i = intensité du courant en A (ampère) |
513 | + |
514 | +define v2ri(r,i) { |
515 | + return( r*i ) |
516 | +} |
517 | + |
518 | +# (loi d'OHM) : Calcul de l'intensité du courant connaissant la résistance et la tension appliquée au circuit. |
519 | +# La formule peut aussi s'appliquer en exprimant la tension et la résistance respectivement avec les sous-multiples et multiples du volt et de l'ohm. Par exemple, la tension peut être exprimée en millivolts (mV) et la résistance en ohm (W) : dans ce cas, l'intensité du courant sera exprimée en milliampères (mA) ; de même, la tension peut être exprimée en volts et la résistance en kilo-ohms (kW), l'intensité du courant sera exprimée en milliampères. |
520 | +# i = intensité du courant en A (ampère) |
521 | +# v = tension en V (volt) |
522 | +# r = résistance en W (ohm) |
523 | + |
524 | +define i2vr(v,r) { |
525 | + return( v/r ) |
526 | +} |
527 | + |
528 | +# Calcul de la résistance totale d'un circuit formé de plusieurs résistances reliées en série connaissant leurs valeurs. |
529 | +# Énoncé : La valeur de la résistance équivalente à plusieurs résistances reliées en série est obtenue en faisant la somme des valeurs de chaque résistance. |
530 | +# Les valeurs de résistance doivent toutes être exprimées dans la même unité de mesure (W, kW, MW). |
531 | +# rt = résistance équivalente totale |
532 | +# r1 = valeur de la première résistance |
533 | +# r2 = valeur de la deuxième résistance |
534 | +# rn = valeur de la dernière résistance |
535 | + |
536 | +define r2rt () { |
537 | + i = 1 |
538 | + print " Veuillez entrer les valeurs des résistances.\n" |
539 | + print " Sortez en mettant 0 comme valeur.\n\n" |
540 | + while (1) { |
541 | + "Valeur R" ; i |
542 | + r = read() |
543 | + if (r == 0) break; |
544 | + rt += r |
545 | + i += 1 |
546 | + } |
547 | + return( rt ) |
548 | +} |
549 | + |
550 | +# Calcul de la conductance totale d'un circuit formé de plusieurs résistances reliées en parallèle connaissant leurs valeurs. |
551 | +# Énoncé : La conductance résultante de l'association de plusieurs résistances reliées en parallèle s'obtient en faisant la somme des conductances de chaque résistance, (voir théorie 2 dans la rubrique sommaire électronique). |
552 | +# Les valeurs des conductances doivent toutes être exprimées dans la même unité de mesure (S ou mS ou µS). |
553 | +# gt = conductance totale |
554 | +# g1 = conductance de la première résistance |
555 | +# g2 = conductance de la deuxième résistance |
556 | +# gn = conductance de la dernière résistance |
557 | + |
558 | +define c2ct () { |
559 | + i = 1 |
560 | + print " Veuillez entrer les valeurs des conductances.\n" |
561 | + print " Sortez en mettant 0 comme valeur.\n\n" |
562 | + while (1) { |
563 | + "Valeur G" ; i |
564 | + g = read() |
565 | + if (g == 0) break; |
566 | + gt += g |
567 | + i += 1 |
568 | + } |
569 | + return( gt ) |
570 | +} |
571 | + |
572 | +# Calcul de la résistance équivalente à plusieurs résistances reliées en parallèle connaissant leurs valeurs. |
573 | +# Énoncé : La résistance équivalente à plusieurs résistances reliées en parallèle s'obtient en effectuant les calculs en trois temps : d'abord on calcule la conductance de chaque résistance ; puis on calcule la conductance totale des résistances en parallèle ; enfin, on calcule la résistance équivalente, c'est-à-dire la résistance qui correspond à la conductance totale |
574 | +# Les valeurs de résistance doivent toutes être exprimées dans la même unité de mesure (W, kW, MW). |
575 | +# re = résistance équivalente |
576 | +# r1 = valeur de la première résistance |
577 | +# r2 = valeur de la deuxième résistance |
578 | +# rn = valeur de la dernière résistance |
579 | + |
580 | +define r2re () { |
581 | + i = 1 |
582 | + print " Veuillez entrer les valeurs des résistances.\n" |
583 | + print " Sortez en mettant 0 comme valeur.\n\n" |
584 | + while (1) { |
585 | + "Valeur R" ; i |
586 | + r = read() |
587 | + if (r == 0) break; |
588 | + rtemp += 1/r |
589 | + i += 1 |
590 | + rt = 1/rtemp |
591 | + } |
592 | + return( rt ) |
593 | +} |
594 | + |
595 | +# Calcul de la résistance équivalente de deux résistances reliées en parallèle connaissant leurs valeurs. |
596 | +# Énoncé : La résistance équivalente de deux résistances reliées en parallèle s'obtient en multipliant les valeurs des deux résistances et en divisant le tout par la somme de ces deux valeurs. |
597 | +# Il est possible d'utiliser r2re () pour ce calcul |
598 | +# Les valeurs de résistance doivent toutes être exprimées dans la même unité de mesure (W, kW, MW). |
599 | +# re = résistance équivalente |
600 | +# r1 = valeur de la première résistance |
601 | +# r2 = valeur de la deuxième résistance |
602 | + |
603 | +define re (r1,r2) { |
604 | + return( (r1*r2)/( r1+r2) ) |
605 | +} |
606 | + |
607 | +# Calcul de la valeur de la résistance à mettre en parallèle avec une autre résistance de valeur connue pour obtenir une résistance équivalente donnée. |
608 | +# Énoncé : La valeur de la résistance à mettre en parallèle avec une autre résistance de valeur connue pour obtenir une résistance équivalente donnée se calcule en multipliant la valeur de la résistance connue par la résistance équivalente, le tout divisé par la différence de ces deux valeurs. |
609 | +# ri = résistance inconnue |
610 | +# r = valeur de la résistance disponible |
611 | +# re = résistance équivalente que l'on veut obtenir |
612 | +# Les valeurs de résistance doivent toutes être exprimées dans la même unité de mesure (W, kW, MW). |
613 | + |
614 | +define ri (r,re) { |
615 | + return( (r*re)/(r-re) ) |
616 | +} |
617 | + |
618 | +# Calcul de la résistance équivalente à deux ou plusieurs résistances de même valeur reliées en parallèle. |
619 | +# Énoncé : La résistance équivalente de deux ou plusieurs résistances de valeurs égales reliées en parallèle s'obtient en divisant la valeur par le nombre de résistances. |
620 | +# La résistance équivalente sera exprimée dans la même unité de mesure que celle utilisée pour exprimer la valeur des résistances. |
621 | +# Re = résistance équivalente |
622 | +# R = valeur des résistances |
623 | +# n = nombre de résistances |
624 | + |
625 | +define rn2re (r,n) { |
626 | + return( (r/n ) |
627 | +} |
628 | + |
629 | +# Calcul de la force électromotrice (f.e.m.) obtenue en reliant en série deux ou plusieurs piles, connaissant la force électromotrice de chaque pile. |
630 | +# Énoncé : En mettant en série deux ou plusieurs piles, on obtient une force électromotrice égale à la somme des forces électromotrices de chaque pile. |
631 | +# Les forces électromotrices doivent toutes être exprimées dans la même unité de mesure. |
632 | +# et = force électromotrice totale |
633 | +# e1 = force électromotrice de la première pile |
634 | +# e2 = force électromotrice de la deuxième pile |
635 | +# en = force électromotrice de la dernière pile. |
636 | + |
637 | +define en2et () { |
638 | + i = 1 |
639 | + print " Veuillez entrer les valeurs des forces électromotrices.\n" |
640 | + print " Sortez en mettant 0 comme valeur.\n\n" |
641 | + while (1) { |
642 | + "Valeur E" ; i |
643 | + e = read() |
644 | + if (r == 0) break; |
645 | + et += e |
646 | + i += 1 |
647 | + } |
648 | + return( et ) |
649 | +} |
650 | + |
651 | +# Calcul de la résistance interne d'une pile connaissant sa f.e.m. (tension à vide lorsqu'elle ne fournit aucun courant) et la tension en charge lorsqu'elle fournit un courant donné. |
652 | +# Énoncé : La résistance interne d'une pile est donnée par la différence entre la f.e.m. et la tension en charge, le tout divisé par le courant fourni. |
653 | +# ri = résistance interne en W (ohm) |
654 | +# e = f.e.m. "tension à vide" en V (volt) |
655 | +# v = tension en charge en V (volt) |
656 | +# i = courant fournit en A (ampère). |
657 | + |
658 | +define evi2ri (e,v,i) { |
659 | + return( (e-v)/i ) |
660 | +} |
661 | + |
662 | +# Calcul de la puissance électrique d'un appareil connaissant la tension appliquée et l'intensité du courant absorbé. |
663 | +# Énoncé : La puissance électrique, exprimée en watts, s'obtient en multipliant la tension, exprimée en volts, par l'intensité du courant exprimée en ampères. |
664 | +# p = puissance électrique en W (watt) |
665 | +# v = tension en V (volt) |
666 | +# i = intensité du courant en A (ampère) |
667 | + |
668 | +define vi2p (v,i) { |
669 | + return( v*i ) |
670 | +} |
671 | + |
672 | +# Calcul de l'intensité du courant absorbé par un appareil connaissant la tension appliquée et sa puissance électrique. |
673 | +# i = intensité du courant en A (ampère) |
674 | +# p = puissance électrique en W (watt) |
675 | +# v = tension appliquée en V (volt) |
676 | + |
677 | +define pv2i (p,v) { |
678 | + return( p/v ) |
679 | +} |
680 | + |
681 | +# Calcul de la tension appliquée à un appareil connaissant l'intensité du courant absorbé et la puissance électrique de celui-ci. |
682 | +# v = tension appliquée en V (volt) |
683 | +# p = puissance électrique en W (watt) |
684 | +# i = intensité du courant absorbé en A (ampère). |
685 | + |
686 | +define pi2v (p,i) { |
687 | + return( p/i ) |
688 | +} |
689 | + |
690 | +# Calcul de l'énergie électrique consommée par un appareil connaissant sa puissance électrique et sa durée de fonctionnement. |
691 | +# Énoncé : L'énergie consommée par un appareil, exprimée en watts-secondes, s'obtient en multipliant la puissance de l'appareil, exprimée en watts, par le temps de fonctionnement exprimé en secondes. |
692 | +# Le watt-seconde (W.s), unité de mesure utilisée pour exprimer la quantité d'énergie électrique consommée, est équivalent à 1 joule (J), unité de mesure de l'énergie et du travail mécanique. |
693 | +# 1 W.s = 1 J |
694 | +# En pratique, pour indiquer la consommation domestique et industrielle de l'énergie électrique, on utilise un multiple du watt-seconde, c'est-à-dire le kilowatt-heure (kW.h). |
695 | +# 1 kW.h = 3 600 000 W.s ; 1 W.s = 1 / 3 600 000 kW.h |
696 | +# Le résultat de l'exemple précédent peut s'exprimer en kW.h au moyen de l'équivalence : |
697 | +# 180 000 W.s = 180 000 / 3 600 000 kW.h = 0,05 kW.h |
698 | +# Si dans la formule 88, la puissance est exprimée en kilowatts (kW ; 1 kW = 1000 W) et le temps en heures (h, 1 h = 60 mn = 3 600 s), l'énergie consommée sera exprimée en kilowatts-heures. |
699 | +# Par exemple, si P = 800 W = 0,8 kW et "t" = 30 mn = 0,5 h, l'énergie consommée sera de : |
700 | +# W = 0,8 x 0,5 = 0,4 kW.h |
701 | +# w = énergie consommée en W.s (watt-seconde) |
702 | +# p = puissance électrique en W (watt) |
703 | +# t = temps en s (secondes) |
704 | + |
705 | +define pt2w (p,t) { |
706 | + return( p*t ) |
707 | +} |
708 | + |
709 | +# Calcul de la puissance électrique dissipée par effet Joule dans une résistance connaissant l'intensité du courant et la valeur de cette résistance. |
710 | +# Énoncé : La puissance électrique, exprimée en watts, dissipée dans une résistance s'obtient en multipliant la résistance, exprimée en ohms, par le carré du courant qui la traverse, exprimé en ampères. |
711 | +# p = puissance électrique en W (watt) |
712 | +# r = résistance en W (ohm) |
713 | +# i = intensité du courant en A (ampère) |
714 | + |
715 | +define ri2p (r,i) { |
716 | + return( r*i^2 ) |
717 | +} |
718 | + |
719 | +# Calcul de la valeur d'une résistance connaissant la puissance électrique dissipée et l'intensité du courant qui la traverse. |
720 | +# r = résistance en W (ohm) |
721 | +# p = puissance dissipée en W (watt) |
722 | +# i = intensité du courant en A (ampère) |
723 | + |
724 | +define pi2r (p,i) { |
725 | + return( p/i^2 ) |
726 | +} |
727 | + |
728 | +# Calcul de l'intensité du courant qui parcourt une résistance connaissant la puissance électrique dissipée et la valeur de cette résistance. |
729 | +# Énoncé : L'intensité du courant, exprimée en ampères, qui parcourt une résistance, s'obtient en divisant la puissance dissipée exprimée en watts par la résistance exprimée en ohms, et en extrayant la racine carrée du quotient obtenu. |
730 | +# i = intensité du courant en A (ampère) |
731 | +# p = puissance dissipée en W (watt) |
732 | +# r = résistance en W (ohm) |
733 | + |
734 | +define pr2i (p,r) { |
735 | + return( sqrt(p/r) ) |
736 | +} |
737 | + |
738 | +# Calcul de la puissance électrique dissipée par effet Joule dans une résistance connaissant la tension appliquée et la valeur de cette résistance. |
739 | +# Énoncé : La puissance électrique, exprimée en watts, dissipée dans une résistance s'obtient en divisant le carré de la tension, exprimée en volts, par la résistance exprimée en ohms. |
740 | +# p = puissance électrique en W (watt) |
741 | +# v = tension en V (volt) |
742 | +# r = résistance en W (ohm) |
743 | + |
744 | +define vr2p (v,r) { |
745 | + return( v^2/r ) |
746 | +} |
747 | + |
748 | +# Calcul de la valeur d'une résistance connaissant la puissance électrique dissipée et la tension appliquée. |
749 | +# r = résistance en W (ohm) |
750 | +# v = tension appliquée en V (volt) |
751 | +# p = puissance électrique dissipée en W (watt) |
752 | + |
753 | +define vp2r (v,p) { |
754 | + return( v^2/p ) |
755 | +} |
756 | + |
757 | +# Calcul de la tension appliquée à une résistance connaissant la puissance électrique dissipée et la valeur de cette résistance. |
758 | +# Énoncé : La tension appliquée à une résistance, exprimée en volts, s'obtient en multipliant la puissance dissipée exprimée en watts, par la résistance exprimée en ohms et en extrayant la racine carrée du produit obtenu. |
759 | +# v = tension en V (volt) |
760 | +# p = puissance dissipée en W (watt) |
761 | +# r = résistance en W (ohm) |
762 | + |
763 | +define pr2v (p,r) { |
764 | + return( sqrt(p*r) ) |
765 | +} |
766 | + |
767 | +# Calcul de la quantité de chaleur obtenue en transformant par effet Joule une quantité d'énergie électrique donnée (pour le calcul de l'énergie électrique, voir la formule pt2w(p,t). |
768 | +# Énoncé : La quantité de chaleur exprimée en kilo-calories produite dans une résistance par effet Joule s'obtient en multipliant l'énergie électrique exprimée en watts-secondes (Joule) dissipée dans cette résistance par le nombre 0,000238. |
769 | +# qc = 0,000238 W (Valeur approchée par défaut) |
770 | +# qc = quantité de chaleur en kilo-calories |
771 | +# w = énergie électrique en W.s (watt-seconde) ou bien en J (Joule) |
772 | +# Données : Énergie électrique dissipée par une résistance W = 0,5 kW.h (kilowatt-heure) = 3 600 000 x 0,5 = 1 800 000 W.s (pour l'équivalence entre le kilowatt-heure et le watt-seconde, voir l'observation qui suit la formule pt2w(p,t). |
773 | +# Quantité de chaleur produite par la résistance : Qc = 0,000 238 x 1 800 000 = 428,4 kcal. |
774 | + |
775 | +define qcw2qc (w) { |
776 | + # convertion en W.s ou Joule |
777 | + return( qc ) |
778 | +} |
779 | + |
780 | +# Calcul de la résistance à chaud d'un conducteur connaissant l'augmentation de température du matériau et la résistance du conducteur à la température ambiante (20° C). |
781 | +# Énoncé : En augmentant la température d'un conducteur, on augmente sa résistance électrique. Pour le calcul de la résistance à chaud d'un conducteur, il faut compléter l'énoncé de la façon suivante : la résistance à chaud, exprimée en ohms, s'obtient en additionnant la résistance du conducteur à la température ambiante (20° C) avec le produit du coefficient de température du matériau, de la résistance à la température ambiante et de l'augmentation de température exprimée en degrés Celsius. |
782 | +# Les coefficients de température des principaux matériaux conducteurs sont reportés dans la dernière colonne de droite du tableau III (nous reportons la même figure 1 ci-dessous). |
783 | +# rt = résistance à chaud (à la température t) en W (ohm) |
784 | +# r20 = résistance à froid (à la température de 20° C) en W (ohm) |
785 | +# a = coefficient de température du matériau |
786 | +# t = température du conducteur chaud en °C (degrés Celsius) |
787 | +# t - 20 = augmentation de température en °C (degrés Celsius) |
788 | +# Données relatives à un conducteur de tungstène : R20 = 30 W (résistance à froid du conducteur) ; = 0,0045 (coefficient de température du tungstène) ; t = 320° C (température du conducteur). |
789 | +# Augmentation de température du conducteur : t - 20 = 320 - 20 = 300° C |
790 | +# Résistance à chaud du conducteur : Rt = 30 + 0,0045 x 30 x 300 = 30 + 40,5 = 70,5 W |
791 | + |
792 | + |
793 | +# Calcul de la résistance par mètre à froid (à 20° C) d'un conducteur connaissant sa section et la résistivité du matériau. |
794 | +# (R / m) = (p / S) |
795 | +# R / m = résistance par mètre en W / m (ohm par mètre) |
796 | +# p = résistivité en µW.m (microhm-mètre) |
797 | +# S = section en mm2 |
798 | +# * Cette formule est tirée de la formule 64 ("voir formulaire mathématiques 2 - 1ère partie") en donnant à la longueur du conducteur la valeur de 1 mètre *. |
799 | + |
800 | + |
801 | |
802 | === added file 'bc-lib/funcs.bc' |
803 | --- bc-lib/funcs.bc 1970-01-01 00:00:00 +0000 |
804 | +++ bc-lib/funcs.bc 2009-03-21 02:39:06 +0000 |
805 | @@ -0,0 +1,447 @@ |
806 | +### Funcs.BC - a large number of functions for use with GNU BC |
807 | + |
808 | +## Not to be regarded as suitable for any purpose |
809 | +## Not guaranteed to return correct answers |
810 | + |
811 | +scale=100; |
812 | +define pi(){return(a(1)*4)} ; pi = pi() |
813 | + e = e(1) |
814 | +define phi(){return((1+sqrt(5))/2)} ; phi = phi() |
815 | +define psi(){return((1-sqrt(5))/2)} ; psi = psi() |
816 | + |
817 | +### Reset base to ten |
818 | +define resetbase() { ibase=1+1+1+1+1+1+1+1+1+1;obase=ibase; } |
819 | +d0=0;d1=1;d2=2;d3=3;d4=4;d5=5;d6=6;d7=7;d8=8;d9=9 |
820 | +d10=10;d11=11;d12=12;d13=13;d14=14;d15=15;d16=16;d17=17;d18=18;d19=19 |
821 | +d20=20;d21=21;d22=22;d23=23;d24=24;d25=25;d26=26;d27=27;d28=28;d29=29 |
822 | +d30=30;d31=31;d32=32;d33=33;d34=34;d35=35;d36=36;d37=37;d38=38;d39=39 |
823 | + |
824 | +### Integer and Rounding |
825 | + |
826 | +# Round to next integer nearest 0: -1.99 -> 1, 0.99 -> 0 |
827 | +define int(x) { auto os;os=scale;scale=0;x/=1;scale=os;return(x) } |
828 | + |
829 | +# Round down to integer below x |
830 | +define floor(x) { auto xx;xx=int(x);if(xx>x)xx-=1;return(xx) } |
831 | + |
832 | +# Round up to integer above x |
833 | +define ceil(x) { return(-floor(-x)) } |
834 | + |
835 | +# Fractional part of x: 12.345 -> 0.345 |
836 | +define frac(x) { return(x-floor(x)) } |
837 | + |
838 | +# Absolute value of x |
839 | +define abs(x) { if(x<0)return(-x)else return(x) } |
840 | + |
841 | +# Sign of x |
842 | +define sgn(x) { if(x<0)return(-1)else if(x>0)return(1);return(0) } |
843 | + |
844 | +# Round x up to next multiple of y |
845 | +define rup(x,y) { return(y*ceil(x/y)) } |
846 | + |
847 | +# Round x down to previous multiple of y |
848 | +define rdn(x,y) { return(y*floor(x/y)) } |
849 | + |
850 | +# Round x to the nearest multiple of y |
851 | +define rnd(x,y) { return(y*floor(x/y+.5)) } |
852 | + |
853 | +# Find the remainder of x/y |
854 | +define rem(x,y) { return(x-rdn(x,y)) } |
855 | + |
856 | +# Greatest common divisor of x and y |
857 | +define gcd(x,y) { auto r;while(y>0){r=rem(x,y);x=y;y=r};return(x) } |
858 | + |
859 | +# Lowest common multiple of x and y |
860 | +define lcm(x,y) { return (x*y/gcd(x,y)) } |
861 | + |
862 | +# Output function - prints a and b as a fraction in smallest terms |
863 | +define sft(a,b) { #smallest fractional terms |
864 | + auto c,d,e |
865 | + c=gcd(a,b); |
866 | + d=int(a/c); |
867 | + e=int(b/c); |
868 | + print a,"/",b," = ",d,"/",e,"\n"; |
869 | + return(d/e) |
870 | +} |
871 | + |
872 | +### Exponential / Logs / Trig |
873 | + |
874 | +# Raise x to the y-th power |
875 | +define pow(x,y) { |
876 | + auto yy;yy=int(y) |
877 | + if (y==yy) { return(x^yy); } |
878 | + return( e(y*l(x)) ); |
879 | +} |
880 | + |
881 | +# y-th root of x [ x^(1/y) ] |
882 | +define root(x,y) { |
883 | + auto iy,iyy; |
884 | + iy=1/y;iyy=int(iy) |
885 | + if (iy==iyy) { return(x^iyy); } |
886 | + scale+=5;y=e(l(x)/y);scale-=5;y=y/1+10^-scale |
887 | + x=int(y);if(x==y)y=x |
888 | + return( y ); |
889 | +} |
890 | + |
891 | +# workhorse function for powrem |
892 | +define powrem_(x,y,m) { |
893 | + auto r, y2; |
894 | + if(y==0)return(1) |
895 | + if(y==1){if(x<m){return(x)}else{return(x-m*(x/m))}} |
896 | + y2=y/2 |
897 | + r=powrem_(x,y2,m); if(r>=m)r%=m |
898 | + r^=2 ; if(r>=m)r%=m |
899 | + if(2*y2!=y){r*=x ; if(r>=m)r%=m} |
900 | + return( r ) |
901 | +} |
902 | + |
903 | +# Raise x to the y-th power, modulo m |
904 | +define powrem(x,y,m) { |
905 | + auto os,r; |
906 | + os=scale;scale=0 |
907 | + if(x<0){ |
908 | + print "powrem: base is negative, rectifying...\n" |
909 | + x*=-1 |
910 | + } |
911 | + if(x!=x/1){ |
912 | + print "powrem: base is not an integer, truncating...\n" |
913 | + x/=1 |
914 | + } |
915 | + if(y<0){ |
916 | + print "powrem: exponent is negative, rectifying...\n" |
917 | + y*=-1 |
918 | + } |
919 | + if(y!=y/1){ |
920 | + print "powrem: exponent is not an integer, truncating...\n" |
921 | + y/=1 |
922 | + } |
923 | + if(m<0){ |
924 | + print "powrem: modulus is negative, rectifying...\n" |
925 | + m*=-1 |
926 | + } |
927 | + if(m!=m/1){ |
928 | + print "powrem: modulus is not an integer, truncating...\n" |
929 | + m/=1 |
930 | + } |
931 | + if(m==0){ |
932 | + print "powrem: modulus is zero - doing full calculation!\n" |
933 | + return x^y |
934 | + } |
935 | + r=powrem_(x,y,m) |
936 | + scale=os |
937 | + return( r ) |
938 | +} |
939 | + |
940 | +# Logarithm of y, base x: log(2, 32) = 5 because 2^5 = 32 |
941 | +define log(x,y) { return(l(y)/l(x)) } |
942 | + |
943 | +# Sine |
944 | +#efine s(x) { predefined } |
945 | +# Cosine |
946 | +#efine c(x) { predefined } |
947 | +# Tangent |
948 | +define t(x) { auto c;c=c(x);if(c==0)c+=10^-scale;return(s(x)/c) } |
949 | + |
950 | +# Secant |
951 | +define sc(x) { return(1/s(x)) } |
952 | +# Cosecant |
953 | +define cs(x) { return(1/c(x)) } |
954 | +# Cotangent |
955 | +define ct(x) { auto s;s=s(x);if(s==0)s+=10^-scale;return(c(x)/s) } |
956 | + |
957 | +# Arcsine |
958 | +define as(x) { if(abs(x)==1)return(2*a(1)*x)else return( a(x/sqrt(1-x^2)) ) } |
959 | +# Arccosine |
960 | +define ac(x) { return 2*a(1)-as(x) } |
961 | + |
962 | +# Arctangent (one argument) |
963 | +#efine a(x) { single argument arctangent is predefined } |
964 | + |
965 | +# Arctangent (two arguments) |
966 | +define at(x,y) { |
967 | + auto p; |
968 | + if(x==0&&y==0)return(0) |
969 | + p=(1-sgn(y))*2*a(1)*(2*(x>=0)-1) |
970 | + if(x==0||y==0)return(p) |
971 | + return(p+a(x/y)) |
972 | +} |
973 | + |
974 | +# Arcsecant |
975 | +define asc(x) { return( a(x/sqrt(x^2-1)) ) } |
976 | +# Arccosecant |
977 | +define acs(x) { return( asc(x)+2*a(1)*(sgn(x)-1) ) } |
978 | +# Arctangent |
979 | +define act(x) { return( a(x)+2*a(1) ) } |
980 | + |
981 | +# Hyperbolic Sine |
982 | +define sh(x) { auto t;t=e(x);return((t-1/t)/2) } |
983 | +# Hyperbolic Cosine |
984 | +define ch(x) { auto t;t=e(x);return((t+1/t)/2) } |
985 | +# Hyperbolic Tangent |
986 | +define th(x) { auto t;t=e(2*x)-1;return(t/(t+2)) } |
987 | + |
988 | +# Hyperbolic Secant |
989 | +define sch(x) { return(1/ch(x)) } |
990 | +# Hyperbolic Cosecant |
991 | +define csh(x) { return(1/sh(x)) } |
992 | +# Hyperbolic Cotangent |
993 | +define cth(x) { return(1/th(x)) } |
994 | + |
995 | +# Hyperbolic Arcsine |
996 | +define ash(x) { return( l(x+sqrt(x^2+1)) ) } |
997 | +# Hyperbolic Arccosine |
998 | +define ach(x) { return( l(x+sqrt(x^2-1)) ) } |
999 | +# Hyperbolic Arctangent |
1000 | +define ath(x) { return( l((1+x)/(1-x))/2 ) } |
1001 | + |
1002 | +# Hyperbolic Arcsecant |
1003 | +define asch(x) { return( l((sqrt(1-x^2)+1)/x) ) } |
1004 | +# Hyperbolic Arccosecant |
1005 | +define acsh(x) { return( l((sqrt(1+x^2)*sgn(x)+1)/x) ) } |
1006 | +# Hyperbolic Arccotangent |
1007 | +define acth(x) { return( l((x+1)/(x-1))/2 ) } |
1008 | + |
1009 | +define grad(x) { auto s;s=s(a(1)-x);if(s==0)s+=10^-scale;return(s(x)/s) } |
1010 | +define agrad(x) { return( x/sqrt(1+x^2) ) } |
1011 | +define chord(x) { return( 2* s(x/2) ) } |
1012 | +define achord(x) { return( 2*as(x/2) ) } |
1013 | + |
1014 | +# Length of the diagonal vector (0,0)-(x,y) [pythagoras] |
1015 | +define pyth(x,y) { return(sqrt(x^2+y^2)) } |
1016 | +define pyth3(x,y,z) { return(sqrt(x^2+y^2+z^2)) } |
1017 | + |
1018 | +### Triangular numbers |
1019 | + |
1020 | +# xth triangular number |
1021 | +define tri(x) { |
1022 | + auto xx |
1023 | + x=x*(x+1)/2;xx=int(x) |
1024 | + if(x==xx)return(xx) |
1025 | + return(x) |
1026 | +} |
1027 | + |
1028 | +# 'triangular root' of x |
1029 | +define trirt(x) { |
1030 | + auto xx |
1031 | + x=(sqrt(1+8*x)-1)/2;xx=int(x) |
1032 | + if(x==xx)return(xx) |
1033 | + return(x) |
1034 | +} |
1035 | + |
1036 | +# Workhorse for following 2 functions |
1037 | +define tri_step_(t,s) { |
1038 | + auto tt |
1039 | + t=t+(1+s*sqrt(1+8*t))/2;tt=int(t) |
1040 | + if(tt==t)return(tt) |
1041 | + return(t) |
1042 | +} |
1043 | + |
1044 | +# Turn tri(x) into tri(x+1) without knowing x |
1045 | +define tri_succ(t) { |
1046 | + return(tri_step_(t,0+1)) |
1047 | +} |
1048 | + |
1049 | +# Turn tri(x) into tri(x-1) without knowing x |
1050 | +define tri_pred(t) { |
1051 | + return(tri_step_(t,0-1)) |
1052 | +} |
1053 | + |
1054 | +### Fibonacci |
1055 | + |
1056 | +# n-th Fibonacci number |
1057 | +define fib(x){ |
1058 | + auto a,b,c,os |
1059 | + os=scale;scale=0;x/=1 |
1060 | + a=0;b=1;c=1 |
1061 | + if(x<0){scale=os;return(fib(-x)*((-1)^(1-x)))} |
1062 | + if(x==0){scale=os;return(0)} |
1063 | + while(--x){ |
1064 | + c=a+b;a=b;b=c |
1065 | + } |
1066 | + scale=os;return(c) |
1067 | +} |
1068 | + |
1069 | +define fibf(n) { return( (pow(phi,n)-pow(psi,n))/sqrt(5) ) } |
1070 | + |
1071 | +# n-th Lucas number |
1072 | +define luc(x){ |
1073 | + auto a,b,c,os |
1074 | + os=scale;scale=0;x/=1 |
1075 | + a=2;b=1;c=3 |
1076 | + if(x<0){scale=os;return(luc(-x)*((-1)^(-x)))} |
1077 | + if(x==0){scale=os;return(2)} |
1078 | + if(x==1){scale=os;return(1)} |
1079 | + while(--x){ |
1080 | + c=a+b;a=b;b=c |
1081 | + } |
1082 | + scale=os;return(c) |
1083 | +} |
1084 | + |
1085 | +define lucf(n) { return( pow(phi,n)+pow(psi,n) ) } |
1086 | + |
1087 | +### Factorials |
1088 | + |
1089 | +# x! |
1090 | +define factorial(x) { |
1091 | + auto i,xx |
1092 | + if(x<0)return(0) |
1093 | + if(x<2)return(1) |
1094 | + xx=1;for(i=x;i>=1;i--)xx*=i |
1095 | + return(xx) |
1096 | +} |
1097 | + |
1098 | +# Gosper's approximation to the natural log of n! |
1099 | +define gosper(n) { return( n*(l(n)-1) + ( l(2*n+1/3)+ l(pi()) )/2 ) } |
1100 | + |
1101 | +# Gosper's approximation to n! |
1102 | +define gfactorial(n) { return ceil(e(gosper(n))) } |
1103 | + |
1104 | +# logarithm of x! |
1105 | +define lnfactorial(x) { |
1106 | + auto i,xx,max |
1107 | + if(x<0)return(-10^100) |
1108 | + if(x<2)return(0) |
1109 | + max=2500 # Arbitrary large value |
1110 | + if(x<max)return( l(factorial(x)) ) |
1111 | + xx=l(factorial(max)) |
1112 | + for(i=x;i>max;i--)xx+=l(i) |
1113 | + return(xx) |
1114 | +} |
1115 | + |
1116 | +# Number of permutations of r items from a group of n |
1117 | +define permutation(n,r) { |
1118 | + auto i,p |
1119 | + if(n<0||r<0||r>n)return(0) |
1120 | + p=1;for(i=n;i>n-r;i--)p*=i |
1121 | + return(p) |
1122 | +} |
1123 | + |
1124 | +# Number of combinations of r items from a group of n |
1125 | +define combination(n,r) { |
1126 | + if(n<0||r<0||r>n)return(0) |
1127 | + if(2*r>n)r=n-r |
1128 | + return( permutation(n,r)/factorial(r) ) |
1129 | +} |
1130 | + |
1131 | +# y-th factorial of x: x!_y |
1132 | +define multifactorial(y,x) { |
1133 | + auto i,xx; |
1134 | + xx=1;for(i=x;i>=1;i-=y)xx*=i |
1135 | + return(xx); |
1136 | +} |
1137 | + |
1138 | +### Digit related functions |
1139 | + |
1140 | +# The base ten number created by appending the base ten numbers |
1141 | +# from 1 to x, i.e. 1, 12, 123, ..., 123456789101112, etc. |
1142 | +define dc(x) { |
1143 | + if (x<=0) return(0); |
1144 | + return(x+dc(x-1)*10^int(1+log(10,x))); |
1145 | +} |
1146 | + |
1147 | +# Sum of digits in a number: 1235 -> 11. ibase modifies base used |
1148 | +define digitsum(x) { |
1149 | + auto os,xx,t; |
1150 | + os=scale;scale=0 |
1151 | + t=0;while(x>=1){ xx=x/ibase;t+=x-xx*ibase;x=xx } |
1152 | + scale=os |
1153 | + return(t) |
1154 | +} |
1155 | + |
1156 | +# Product of digits+1 less #digits |
1157 | +# e.g. 235 -> (2+1)(3+1)(5+1)-3 = 3*4*6 - 3 = 69 |
1158 | +define digitprod(x) { |
1159 | + auto os,xx,t,c; |
1160 | + os=scale;scale=0 |
1161 | + t=1;c=0;while(x>=1){ xx=x/ibase;t*=(x-xx*ibase+1);x=xx;c+=1 } |
1162 | + scale=os |
1163 | + return(t-c) |
1164 | +} |
1165 | + |
1166 | +# Number of digits in the base 'ibase' representation of x |
1167 | +define digits(x) { |
1168 | + auto os,c; |
1169 | + if(x<0)return(digits(-x)) |
1170 | + if(x==0||x==1)return(1) |
1171 | + os=scale;scale=10 |
1172 | + c=ceil(log(ibase,x))-3;if(c<0)c=0 |
1173 | + scale=0 |
1174 | + x/=ibase^c |
1175 | + while(x){c+=1;x/=ibase} |
1176 | + scale=os |
1177 | + return(c) |
1178 | +} |
1179 | + |
1180 | +# Reverse the digits in x (use ibase) |
1181 | +define reverse(x) { |
1182 | + auto os,y; |
1183 | + os=scale;scale=0 |
1184 | + y = 0 |
1185 | + while(x) { |
1186 | + y = ibase*y + x%ibase |
1187 | + x /= ibase |
1188 | + } |
1189 | + scale=os |
1190 | + return(y) |
1191 | +} |
1192 | + |
1193 | +### Formatted output |
1194 | + |
1195 | +# workhorse function for expnot and engnot |
1196 | +define ezznot_(x,f,z) { |
1197 | + auto m, e, ms, es, l10, os, ns; |
1198 | + os=scale ; ns=scale+6 ; scale=ns |
1199 | + ms = 1 |
1200 | + if (x < 0) { ms = -1 ; x *= -1 } |
1201 | + |
1202 | + l10 = l(10) |
1203 | + x = l(x)/l10 |
1204 | + es = 1 |
1205 | + if (x < 0) { es = -1 ; x *= -1 } |
1206 | + |
1207 | + scale=0 |
1208 | + e = x/z; if(es==-1)e+=1 ; e*=z |
1209 | + scale=ns |
1210 | + m = e(l10*es*(x-e)) + 10^-(os+1) |
1211 | + scale=f |
1212 | + m /= 1 |
1213 | + scale=os |
1214 | + |
1215 | + print ms*m,"*10^" |
1216 | + return(es*e) |
1217 | +} |
1218 | + |
1219 | +# Exponential notation - display x in the form a.bbbbbbb*10^cc |
1220 | +define expnot(x,f) { # f = sig. fig. |
1221 | + return ezznot_(x,f,1) |
1222 | +} |
1223 | + |
1224 | +# Engineering notation - display x in the form a.bbbbbbb*10^cc |
1225 | +# where cc is a multiple of 3 |
1226 | +define engnot(x,f) { # f = sig. fig. |
1227 | + return ezznot_(x,f,3) |
1228 | +} |
1229 | + |
1230 | +# Truncate trailing zeroes from a scaled number |
1231 | +define trunc(x) { |
1232 | + auto os,i;os=scale |
1233 | + for(i=0;i<=os;i++){ |
1234 | + scale=i |
1235 | + if(x==x/1){ |
1236 | + x=x/1 |
1237 | + scale=os |
1238 | + return(x) |
1239 | + } |
1240 | + } |
1241 | +} |
1242 | + |
1243 | +# Print an integer in a field width |
1244 | +define intprint(n, w){ # w is field width |
1245 | + auto os,m,i; |
1246 | + os=scale;scale=0;n/=1 |
1247 | + m=n;w+=(m!=0);if(m<0){m*=-1;w-=1} |
1248 | + for(;m>0;w--){m/=10} |
1249 | + for(i=1;i<w;i++)print " " |
1250 | + scale=os;return(n) |
1251 | +} |
1252 | +#print "funcs.bc loaded\n"; |
1253 | |
1254 | === added file 'bc-lib/geometrie.bc' |
1255 | --- bc-lib/geometrie.bc 1970-01-01 00:00:00 +0000 |
1256 | +++ bc-lib/geometrie.bc 2009-03-21 02:39:06 +0000 |
1257 | @@ -0,0 +1,262 @@ |
1258 | +### geometrie.bc - a large number of functions for use with GNU BC |
1259 | + |
1260 | +## Not to be regarded as suitable for any purpose |
1261 | +## Not guaranteed to return correct answers |
1262 | +# |
1263 | +# jmj(at)bowlfr.org |
1264 | + |
1265 | +# Calcule du nombre pi |
1266 | +define pi() { |
1267 | + scale=20 |
1268 | + return(4*a(1)) |
1269 | +} |
1270 | + |
1271 | +# Calcul de la surface d'un triangle connaissant les valeurs de la base et de la hauteur |
1272 | +# b = base |
1273 | +# h = hauteur |
1274 | +define s2tq(b,h) { |
1275 | + return( (b*h)/2 ) |
1276 | +} |
1277 | + |
1278 | +# Calcul de la surface d'un triangle équilatéral, "triangle ayant trois côtés égaux" connaissant la longueur du côté |
1279 | +# c = côté |
1280 | +define s2te(c) { |
1281 | + return( (sqrt(3)/4)*c^2 ) |
1282 | +} |
1283 | + |
1284 | +# Calcul de la surface d'un triangle isocèle "triangle ayant deux côtés égaux" connaissant la valeur des côtés égaux et de la base. |
1285 | +# b = base |
1286 | +# c = côté |
1287 | +define s2ti(b,c) { |
1288 | + return( b/2*sqrt(c^2-(b/2)^2)) |
1289 | +} |
1290 | + |
1291 | +# Calcul de la surface d'un triangle scalène "triangle ayant trois côtés inégaux" connaissant la longueur des côtés. |
1292 | +# a = côté |
1293 | +# b = côté |
1294 | +# c = côté |
1295 | +define s2ts(a,b,c) { |
1296 | + p = (a+b+c)/2 |
1297 | + return( sqrt(p*(p-a)*(p-b)*(p-c))) |
1298 | +} |
1299 | + |
1300 | +# Calcul de l'hypoténuse d'un triangle rectangle connaissant les deux autres côtés (le triangle rectangle est un triangle ayant un angle de 90° ; l'hypoténuse est le plus grand côté, les deux autres côtés forment l'angle de 90°) |
1301 | +# a = côté |
1302 | +# b = côté |
1303 | +define h2tr(a,b) { |
1304 | + return( sqrt(a^2+b^2)) |
1305 | +} |
1306 | + |
1307 | +# Calcul d'un côté d'un triangle rectangle connaissant les longueurs de l'hypoténuse et de l'autre côté |
1308 | +# h = hypoténuse |
1309 | +# b = côté |
1310 | +define c2tr(h,b) { |
1311 | + return( sqrt(h^2-b^2)) |
1312 | +} |
1313 | + |
1314 | +# Calcul de la surface d'un triangle rectangle connaissant les deux côtés de l'angle droit. |
1315 | +# a = côté |
1316 | +# b = côté |
1317 | +define s2tr(a,b) { |
1318 | + return( (a*b)/2 ) |
1319 | +} |
1320 | + |
1321 | +# Calcul de la diagonale d'un carré connaissant la longueur du côté |
1322 | +# c = côté |
1323 | +define d2ca(c) { |
1324 | + return( sqrt(2)*c ) |
1325 | +} |
1326 | + |
1327 | +# Calcul de la surface d'un carré connaissant la longueur du côté |
1328 | +# c = côté |
1329 | +define s2cac(c) { |
1330 | + return( c^2 ) |
1331 | +} |
1332 | + |
1333 | +# Calcul de la surface d'un carré connaissant la longueur de la diagonale |
1334 | +# d = diagonale |
1335 | +define s2cad(d) { |
1336 | + return( d^2/2 ) |
1337 | +} |
1338 | + |
1339 | +# Calcul de la diagonale d'un rectangle connaissant les valeurs de la base et de la hauteur |
1340 | +# b = base |
1341 | +# h = hauteur |
1342 | +define d2r(b,h) { |
1343 | + return( sqrt(b^2+h^2) ) |
1344 | +} |
1345 | + |
1346 | +# Calcul de la surface d'un rectangle ou parallélogramme connaissant les valeurs de la base et de la hauteur. |
1347 | +# b = base |
1348 | +# h = hauteur |
1349 | +define s2r(b,h) { |
1350 | + return( b*h ) |
1351 | +} |
1352 | + |
1353 | +# Calcul de la surface d'un losange connaissant la longueur des diagonales |
1354 | +# (le losange est un quadrilatère ayant quatre côtés égaux et des angles adjacents inégaux). |
1355 | +# d1 = grande diagonale |
1356 | +# d2 = petite diagonale |
1357 | + |
1358 | +define s2l(d1,d2) { |
1359 | + return( (d1*d2)/2 ) |
1360 | +} |
1361 | + |
1362 | +# Calcul de la surface d'un trapèze connaissant les valeurs des deux bases et de la hauteur. |
1363 | +# h = hauteur |
1364 | +# b1 = petite base |
1365 | +# b2 = grande base |
1366 | + |
1367 | +define s2t(h,b1,b2) { |
1368 | + return( (h*(b1+b2))/2 ) |
1369 | +} |
1370 | + |
1371 | +# Calcul de la surface d'un pentagone régulier connaissant la longueur des côtés (le pentagone régulier est un polygone ayant cinq côtés égaux et cinq angles égaux) |
1372 | +# c = côté |
1373 | +define s2p(c) { |
1374 | + return( 1.72*c^2 ) |
1375 | +} |
1376 | + |
1377 | +# Calcul de la surface d'un hexagone régulier connaissant la longueur d'un côté (l'hexagone régulier est un polygone ayant six côtés égaux et six angles internes égaux) |
1378 | +# c = côté |
1379 | +define s2h(c) { |
1380 | + return( 2.6*c^2 ) |
1381 | +} |
1382 | + |
1383 | +# Calcul du périmètre d'un cercle (circonférence) connaissant la valeur du diamètre |
1384 | +# d = diamètre |
1385 | +define p2c(d) { |
1386 | + return( pi()*d ) |
1387 | +} |
1388 | + |
1389 | +# Calcul de la surface d'un cercle connaissant la valeur du diamètre |
1390 | +# d = diamètre |
1391 | +define s2c(d) { |
1392 | + return( pi()/4*d^2 ) |
1393 | +} |
1394 | + |
1395 | +# Calcul de la longueur d'un arc de cercle connaissant la valeur de l'angle au centre et la longueur du rayon |
1396 | +# v = valeur de l'angle au centre (en degré) |
1397 | +# r = rayon |
1398 | +define l2ac(v,r) { |
1399 | + return( pi()/180*v*r ) |
1400 | +} |
1401 | + |
1402 | +# Calcul de la surface d'un secteur circulaire connaissant la valeur de l'angle au centre et la longueur du rayon (un secteur circulaire est la surface plane délimitée par un arc de cercle et deux rayons). |
1403 | +# v = valeur de l'angle au centre (en degré)grand diamètre |
1404 | +# r = rayon |
1405 | +define s2sc(v,r) { |
1406 | + return( pi()/360*v*r^2 ) |
1407 | +} |
1408 | + |
1409 | +# Calcul de la surface d'une couronne circulaire connaissant la valeur des deux diamètres (une couronne circulaire est la surface plane comprise entre deux circonférences concentriques). |
1410 | +# d1 = grand diamètre |
1411 | +# d2 = petit diamètre |
1412 | +define s2cc(d1,d2) { |
1413 | + return( pi()/4*(d1^2 - d2^2) ) |
1414 | +} |
1415 | + |
1416 | +# Calcul de la surface d'un segment de parabole connaissant la valeur de la base et de la hauteur (on appelle segment de parabole la surface plane comprise entre un arc de parabole et la corde sous-tendue entre les extrémités de l'arc). |
1417 | +# b = base |
1418 | +# h = hauteur |
1419 | +define s2sp(b,h) { |
1420 | + return( 2/3*b*h ) |
1421 | +} |
1422 | + |
1423 | +# Calcul de la surface d'une ellipse connaissant la longueur des deux axes |
1424 | +# a = grand axe |
1425 | +# b = petit axe |
1426 | +define s2e(a,b) { |
1427 | + return( pi()/4*a*b ) |
1428 | +} |
1429 | + |
1430 | +# Calcul de la longueur d'une hélice connaissant le nombre de spires, les valeurs du diamètre et de la hauteur |
1431 | +# n = nombre de spires |
1432 | +# d = diamètre |
1433 | +# h = hauteur |
1434 | +define l2h(n,d,h) { |
1435 | + return( sqrt(pi()^2*n^2*d^2+h^2) ) |
1436 | +} |
1437 | + |
1438 | +# Calcul du volume d'un cube connaissant la longueur de l'arête |
1439 | +# a = arête |
1440 | +define v2cu(a) { |
1441 | + return( a^3 ) |
1442 | +} |
1443 | + |
1444 | +# Calcul d'une diagonale d'un cube |
1445 | +# d = diagonale |
1446 | +# a = arête |
1447 | +define d2cu(a) { |
1448 | + return( a*sqrt(3) ) |
1449 | +} |
1450 | + |
1451 | +# Calcul du volume d'un parallélépipède connaissant les valeurs de la longueur et de la largeur de la base, et la hauteur |
1452 | +# a = longueur de la base |
1453 | +# b = largeur de la base |
1454 | +# h = hauteur |
1455 | +define v2pa(a,b,h) { |
1456 | + return( a*b*h ) |
1457 | +} |
1458 | + |
1459 | +# Calcul du volume d'un cylindre connaissant les valeurs du diamètre et de la hauteur |
1460 | +# d = diamètre |
1461 | +# h = hauteur |
1462 | +define v2cy(d,h) { |
1463 | + return( pi()/4*d^2*h ) |
1464 | +} |
1465 | + |
1466 | +# Calcul du volume d'un cylindre creux connaissant les valeurs des deux diamètres et de la hauteur |
1467 | +# d1 = diamètre externe |
1468 | +# d2 = diamètre interne |
1469 | +# h = hauteur |
1470 | +define v2cyc(d1,d2,h) { |
1471 | + return( pi()/4*(d1^2-d2^2)*h ) |
1472 | +} |
1473 | + |
1474 | +# Calcul du volume d'un anneau à section carrée connaissant les valeurs des diamètres externes et internes |
1475 | +# d1 = diamètre externe |
1476 | +# d2 = diamètre interne |
1477 | +define v2a(d1,d2) { |
1478 | + return( pi()/8*(d1-d2)^2*(d1+d2) ) |
1479 | +} |
1480 | + |
1481 | +# Calcul du volume d'un tore (anneau à section circulaire) connaissant la valeur du diamètre extérieur et celle du diamètre de la section de l'anneau |
1482 | +# d1 = diamètre externe |
1483 | +# d2 = diamètre interne |
1484 | +define v2t(d1,d2) { |
1485 | + return( pi()^2/4*(d1-d2)*d2^2 ) |
1486 | +} |
1487 | + |
1488 | +# Calcul de la surface d'une sphère connaissant la valeur du diamètre |
1489 | +# d = diamètre |
1490 | +define s2s(d) { |
1491 | + return( pi()*d^2 ) |
1492 | +} |
1493 | + |
1494 | +# Calcul du volume d'une sphère connaissant la valeur du diamètre |
1495 | +# d = diamètre |
1496 | +define v2s(d) { |
1497 | + return( pi()/6*d^3 ) |
1498 | +} |
1499 | + |
1500 | +# Calcul de la surface d'une calotte sphérique connaissant les valeurs du diamètre du contour et de la hauteur |
1501 | +# d = diamètre du contour |
1502 | +# h = hauteur de la calotte |
1503 | +define s2cs(d,h) { |
1504 | + return( pi()/4*(d^2+4*h^2 ) ) |
1505 | +} |
1506 | + |
1507 | +# Calcul du volume d'une calotte sphérique connaissant la valeur du diamètre de la base et de la hauteur |
1508 | +# d = diamètre de la base |
1509 | +# h = hauteur de la calotte |
1510 | +define v2cs(d,h) { |
1511 | + return( pi()*h^2*((3*d^2+4*h^2)/(24*h)) ) |
1512 | +} |
1513 | + |
1514 | +# Calcul du volume d'une paraboloïde connaissant la valeur du diamètre de la base et de la hauteur |
1515 | +# d = diamètre de la base |
1516 | +# h = hauteur de la paraboloïde |
1517 | +define v2pb(d,h) { |
1518 | + return( pi()/8*d^2*h ) |
1519 | +} |
1520 | |
1521 | === added file 'bc-lib/intdiff.bc' |
1522 | --- bc-lib/intdiff.bc 1970-01-01 00:00:00 +0000 |
1523 | +++ bc-lib/intdiff.bc 2009-03-21 02:39:06 +0000 |
1524 | @@ -0,0 +1,78 @@ |
1525 | +### IntDiff.BC - numeric differentiation and integration of |
1526 | +### a single variable function with GNU bc |
1527 | + |
1528 | +## Not guaranteed for any particular purpose |
1529 | + |
1530 | +define f(x) { return x^2 } # example - redefine in later code/bc session |
1531 | + |
1532 | +# Numerically differentiate the global function f(x) |
1533 | +define dfxdx(x) { |
1534 | + auto eps, os; |
1535 | + os = scale |
1536 | + scale = 0 |
1537 | + eps = os/2 |
1538 | + scale = os |
1539 | + eps = 10^-eps |
1540 | + return (f(x+eps)-f(x-eps))/(2*eps) |
1541 | +} |
1542 | + |
1543 | +# New global variable like 'scale' - determines accuracy of numerical |
1544 | +# integration at the expense of time. Don't set above 15 unless this |
1545 | +# is running on a really fast machine! |
1546 | +depth = 10 |
1547 | + |
1548 | +# Numerically integrate the global function f(x) between x = a and x = b |
1549 | +define ifxdx(a,b) { |
1550 | + auto h,s,t |
1551 | + h = 2^-depth |
1552 | + s = (b - a) * h |
1553 | + for(i=a+s;i<b;i+=s)t+=f(i);t+=(f(a)+f(b))/2;t*=s |
1554 | + return t |
1555 | +} |
1556 | + |
1557 | +# glai - guess limit at infinity |
1558 | +# Assumes p, q and r are 3 consecutive convergents to a limit and |
1559 | +# attempts to extrapolate precisely what that limit is after an infinite |
1560 | +# number of iterations. |
1561 | + |
1562 | +# 0 = glai returns function result only |
1563 | +# 1 = glai commentates on interesting convergents |
1564 | +glaitalk = 1 |
1565 | + |
1566 | +define glai(p,q,r) { |
1567 | + auto m,n |
1568 | + m = q^2-p*r |
1569 | + n = 2*q-p-r |
1570 | + if(n==0)if(m==0){ |
1571 | + if(glaitalk)print "glai: Constant series detected\n" |
1572 | + return p |
1573 | + }else{ |
1574 | + if(glaitalk)print "glai: Arithmetic progression detected: limit is infinite\n" |
1575 | + return 1/0 |
1576 | + } |
1577 | + if(m==0){ |
1578 | + if(glaitalk)print "glai: Geometric progression detected: limit wraps to zero!\n" |
1579 | + return 0 |
1580 | + } |
1581 | + return m/n |
1582 | +} |
1583 | + |
1584 | +# Examples: |
1585 | +# glai(x,x+1,x+2) causes a division by zero error as the limit of |
1586 | +# an arithmetic progression is infinite |
1587 | +# glai(a*k,a*k^2,a*k^3) returns zero! The limit of a geometric |
1588 | +# progression in p-adics is precisely that, |
1589 | +# and somehow this simple function 'knows'. |
1590 | +# glai(63.9, 63.99, 63.999) returns 64 - correctly predicting the |
1591 | +# limit of the sequence. |
1592 | + |
1593 | +# Run consecutive convergents to the ifxdx function through glai() |
1594 | +# attaining "better" accuracy with slightly fewer calculations |
1595 | +define ifxdx_g(a,b) { |
1596 | + auto p,q,r |
1597 | + depth -= 3 ; p = ifxdx(a,b) |
1598 | + depth += 1 ; q = ifxdx(a,b) |
1599 | + depth += 1 ; r = ifxdx(a,b) |
1600 | + depth += 1 |
1601 | + return glai(p,q,r) |
1602 | +} |
1603 | |
1604 | === added file 'bc-lib/logic.bc' |
1605 | --- bc-lib/logic.bc 1970-01-01 00:00:00 +0000 |
1606 | +++ bc-lib/logic.bc 2009-03-21 02:39:06 +0000 |
1607 | @@ -0,0 +1,103 @@ |
1608 | +### Logic.BC - Do bitwise functions with GNU bc |
1609 | + |
1610 | +# Perform a bitwise logical AND of x and y |
1611 | +define and(x,y) { |
1612 | + auto z, t, xx, yy, os; |
1613 | + os=scale;scale=0 |
1614 | + z=0;t=1;for(;x||y;){ |
1615 | + xx=x/2;yy=y/2 |
1616 | + z+=t*((x-2*xx)&&(y-2*yy)) |
1617 | + t*=2;x=xx;y=yy |
1618 | + } |
1619 | + scale=os;return (z) |
1620 | +} |
1621 | + |
1622 | +# Perform a bitwise logical OR of x and y |
1623 | +define or(x,y) { |
1624 | + auto z, t, xx, yy, os; |
1625 | + os=scale;scale=0 |
1626 | + z=0;t=1;for(;x||y;){ |
1627 | + xx=x/2;yy=y/2 |
1628 | + z+=t*((x-2*xx)||(y-2*yy)) |
1629 | + t*=2;x=xx;y=yy |
1630 | + } |
1631 | + scale=os;return (z) |
1632 | +} |
1633 | + |
1634 | +# Perform a bitwise logical EXCLUSIVE-OR of x and y |
1635 | +define xor(x,y) { |
1636 | + auto z, t, xx, yy, os; |
1637 | + os=scale;scale=0 |
1638 | + z=0;t=1;for(;x||y;){ |
1639 | + xx=x/2;yy=y/2 |
1640 | + z+=t*((x-2*xx)!=(y-2*yy)) |
1641 | + t*=2;x=xx;y=yy |
1642 | + } |
1643 | + scale=os;return (z) |
1644 | +} |
1645 | + |
1646 | +# Perform a bitwise logical NOT of x |
1647 | +define not(x,w) { |
1648 | + # w is bit width |
1649 | + # w is implicitly expanded to the bit-width of x if |
1650 | + # it is not wide enough |
1651 | + auto z, t, xx, os; |
1652 | + os=scale;scale=0 |
1653 | + z=0;t=1;for(;x||(w>0);w--){ |
1654 | + xx=x/2;z+=t*(1-x+2*xx) |
1655 | + t*=2;x=xx |
1656 | + } |
1657 | + scale=os;return (z) |
1658 | +} |
1659 | + |
1660 | +# Perform a bitwise logical LEFT-SHIFT of x by n places |
1661 | +define shl(x,n,w) { # w is bit width |
1662 | + auto os;os=scale;scale=0 |
1663 | + x=(x*2^n)%(2^w) |
1664 | + scale=os;return(x) |
1665 | +} |
1666 | + |
1667 | +# Perform a bitwise logical RIGHT-SHIFT of x by n places |
1668 | +define shr(x,n,w) { # w is bit width |
1669 | + auto os;os=scale;scale=0 |
1670 | + x=(x/2^n)%(2^w) |
1671 | + scale=os;return(x) |
1672 | +} |
1673 | + |
1674 | +# Reverse bits in x |
1675 | +define bitrev(x,w) { # w is bit width, w = 0 -> use number if bits in x |
1676 | + auto os,z;os=scale;scale=0 |
1677 | + if(w){x%=(2^w)}else{for(;2^w<x;w++){}} |
1678 | + z=0;for(;w;w--){z=z*2+(x%2);x/=2} |
1679 | + scale=os;return(z) |
1680 | +} |
1681 | + |
1682 | +# Perform XOR on binary floating point representations of x and y |
1683 | +define xorf(x,y){ |
1684 | + auto os,t |
1685 | + os=scale;scale=0 |
1686 | + t=2^(4*os) |
1687 | + x*=t;y*=t |
1688 | + scale=os |
1689 | + return( xor(x,y)/t ) |
1690 | +} |
1691 | + |
1692 | +# Perform OR on binary floating point representations of x and y |
1693 | +define orf(x,y){ |
1694 | + auto os,t |
1695 | + os=scale;scale=0 |
1696 | + t=2^(4*os) |
1697 | + x*=t;y*=t |
1698 | + scale=os |
1699 | + return( or(x,y)/t ) |
1700 | +} |
1701 | + |
1702 | +# Perform AND on binary floating point representations of x and y |
1703 | +define andf(x,y){ |
1704 | + auto os,t |
1705 | + os=scale;scale=0 |
1706 | + t=2^(4*os) |
1707 | + x*=t;y*=t |
1708 | + scale=os |
1709 | + return( and(x,y)/t ) |
1710 | +} |
1711 | |
1712 | === added file 'bc-lib/pdhi.bc' |
1713 | --- bc-lib/pdhi.bc 1970-01-01 00:00:00 +0000 |
1714 | +++ bc-lib/pdhi.bc 2009-03-21 02:39:06 +0000 |
1715 | @@ -0,0 +1,69 @@ |
1716 | +# pdhi - Pan Digital Halving Index with GNU bc |
1717 | +# Returns how many times x must be divided by 2 before |
1718 | +# the result contains all digits from 0 to 9 (if ibase = 10). |
1719 | +# e.g. 3339 -> 1669.5 -> 834.75 -> 417.375 -> |
1720 | +# 208.6875 -> 104.34375 -> 52.171875 -> |
1721 | +# 26.0859375 -> 13.04296875, i.e. 8 times |
1722 | + |
1723 | +# Uses ibase as the base for divisions (usually 10) |
1724 | + |
1725 | +define pdhi(x) { |
1726 | + auto d[],xi,xf,c,r,pdhi,lim,i; |
1727 | + if(x<0)x*=-1 |
1728 | + c=1;pdhi=-1;lim=int(10/ibase+3)*scale |
1729 | + while(c){ |
1730 | + pdhi+=1 |
1731 | + xi=int(x);xf=x-xi |
1732 | + while(xi){ |
1733 | + r=int(xi/ibase) |
1734 | + d[xi-ibase*r]=1 |
1735 | + xi=r |
1736 | + } |
1737 | + for(i=lim ; i && xf ; i--){ |
1738 | + #while(xf){ |
1739 | + xf*=ibase |
1740 | + r=int(xf) |
1741 | + d[r]=1 |
1742 | + xf-=r |
1743 | + } |
1744 | + c=ibase |
1745 | + for(r=0;r<ibase;r++){c-=d[r];d[r]=0} |
1746 | + x/=2 |
1747 | + } |
1748 | + return pdhi; |
1749 | +} |
1750 | + |
1751 | +# pdmi(x, m) - Pan Digital Multiplying Index |
1752 | +# Returns how many times x must be multiplied by m before |
1753 | +# the result contains all digits from 0 to 9 (if ibase = 10). |
1754 | +# e.g. pdmi(3339,0.5) -> 1669.5 -> 834.75 -> 417.375 -> |
1755 | +# 208.6875 -> 104.34375 -> 52.171875 -> |
1756 | +# 26.0859375 -> 13.04296875, i.e. 8 times |
1757 | + |
1758 | +# Uses ibase as the base for divisions (usually 10) |
1759 | + |
1760 | +define pdmi(x,m) { |
1761 | + auto d[],xi,xf,c,r,pdmi,lim,i; |
1762 | + if(x<0)x*=-1 |
1763 | + c=1;pdmi=-1;lim=int(10/ibase+3)*scale |
1764 | + while(c){ |
1765 | + pdmi+=1 |
1766 | + xi=int(x);xf=x-xi |
1767 | + while(xi){ |
1768 | + r=int(xi/ibase) |
1769 | + d[xi-ibase*r]=1 |
1770 | + xi=r |
1771 | + } |
1772 | + for(i=lim ; i && xf ; i--){ |
1773 | + #while(xf){ |
1774 | + xf*=ibase |
1775 | + r=int(xf) |
1776 | + d[r]=1 |
1777 | + xf-=r |
1778 | + } |
1779 | + c=ibase |
1780 | + for(r=0;r<ibase;r++){c-=d[r];d[r]=0} |
1781 | + x*=m |
1782 | + } |
1783 | + return pdmi; |
1784 | +} |
1785 | |
1786 | === added file 'bc-lib/primes.bc' |
1787 | --- bc-lib/primes.bc 1970-01-01 00:00:00 +0000 |
1788 | +++ bc-lib/primes.bc 2009-03-21 02:39:06 +0000 |
1789 | @@ -0,0 +1,131 @@ |
1790 | +### Primes.BC - Primes and factorisation (rudimentary) with GNU bc |
1791 | + |
1792 | +# funcs.bc is required to run this library |
1793 | + |
1794 | +# Returns 2, 3, or number of form 6n[+-]1 |
1795 | +define aq(x) { |
1796 | + if(x<0)return(-aq(-x)) |
1797 | + if(x<3)return(x+1) |
1798 | + x-=3;x+=int(x/2) |
1799 | + return(x+x+5) |
1800 | +} |
1801 | + |
1802 | +# Inverse of the above |
1803 | +define iaq(x) { |
1804 | + if(x<0)return(-iaq(-x)) |
1805 | + if(x<4)return(x-1) |
1806 | + return((rem(x+3,6)+x+x)/6+1) |
1807 | +} |
1808 | + |
1809 | +# Returns 2, 3, 5 or number of form 30n[+-]{1,7,11,13} |
1810 | +define aq30(x) { |
1811 | + auto os, e, r, rh, s |
1812 | + os=scale;scale=0;x/=1 |
1813 | + if(x<0){x=-aq30(-x);scale=os;return(x)} |
1814 | + if(x<4){x=x+1+x/3 ;scale=os;return(x)} |
1815 | + x-=3 ; e=x/8 |
1816 | + r=x%8 ; rh=r/4 |
1817 | + s=1-2*rh ; r=s*r+7*rh |
1818 | + scale=os;return( 30*(e+rh)-s*(r^2-7*r-1) ) |
1819 | +} |
1820 | + |
1821 | +# Inverse of the above |
1822 | +define iaq30(x) { |
1823 | + auto os, e, r |
1824 | + os=scale;scale=0;x/=1 |
1825 | + if(x<0){x=-iaq30(-x);scale=os;return(x)} |
1826 | + if(x<7){x=x-1-x/5 ;scale=os;return(x)} |
1827 | + e=x/30;r=x%30 |
1828 | + #r+=(31-r)/30#not needed with bc integer division |
1829 | + r=r/6+(r-2)/7 |
1830 | + scale=os;return(8*e+r +3) |
1831 | +} |
1832 | + |
1833 | +# Cyrek's Approximation to the Prime Counting Function pi(x) |
1834 | +define aprimepi(x) { |
1835 | + auto a,b,lx,k |
1836 | + lx=l(x)/l(10) |
1837 | + a=pow(lx,2/(3*lx)) |
1838 | + b=1+2/(17*pow(ch(lx-e(2)),1/32)) |
1839 | + k=1+l(a/b) |
1840 | + return(x*k/l(x)) |
1841 | +} |
1842 | + |
1843 | +# Output the prime factors of x |
1844 | +define fac(x) { |
1845 | + auto os,j[],ji,p,n,c,xx;#oldscale,jump,jump-index,prime,nth,count,xx |
1846 | + os=scale;scale=0;x/=1 |
1847 | + if(x<0){print"-1*\\\n";x*=-1} |
1848 | + if(x==0){return 0} |
1849 | + j[0]=4;j[1]=2;j[2]=4;j[3]=2;j[4]=4;j[5]=6;j[6]=2;j[7]=6 |
1850 | + for(p=2;p<7;p+=p-1){ |
1851 | + xx=x/p |
1852 | + c=0;while(x==p*xx){c+=1;x=xx;xx=x/p} |
1853 | + if(c){print p;if(c>1){print "^",c};print "*\\\n"} |
1854 | + } |
1855 | + ji=7;p=7 |
1856 | + while(p^2<=x){ |
1857 | + xx=x/p |
1858 | + c=0;while(x==p*xx){c+=1;x=xx;xx=x/p} |
1859 | + if(c){print p;if(c>1){print "^",c};print "*\\\n"} |
1860 | + p+=j[ji=(ji+1)%8] |
1861 | + } |
1862 | + if(x>1)print x,"*\\\n" |
1863 | + scale=os;return(1) |
1864 | +} |
1865 | + |
1866 | +# Determine whether x is prime |
1867 | +define is_prime(x) { |
1868 | + auto os,j[],ji,p,n,xx;#oldscale,jump,jump-index,prime,nth,xx |
1869 | + os=scale;scale=0;x/=1 |
1870 | + if(x<0){return 0} |
1871 | + j[0]=4;j[1]=2;j[2]=4;j[3]=2;j[4]=4;j[5]=6;j[6]=2;j[7]=6 |
1872 | + for(p=2;p<7;p+=p-1){if(x==p){return 1};xx=x/p;if(x==p*xx){return 0}} |
1873 | + ji=7;p=7 |
1874 | + while(p^2<=x){ |
1875 | + xx=x/p;if(x==p*xx){return 0} |
1876 | + p+=j[ji=(ji+1)%8] |
1877 | + } |
1878 | + scale=os;return(1) |
1879 | +} |
1880 | + |
1881 | +# Determine whether x is y-th power-free |
1882 | +# e.g. has_freedom(51, 2) will return whether 51 is square-free |
1883 | +# Special case: has_freedom(x, 1) returns whether x is prime |
1884 | +define has_freedom(x,y) { |
1885 | + auto os,j[],ji,p,py,n,xx;#oldscale,jump,jump-index,prime,nth,xx |
1886 | + os=scale;scale=0;x/=1 |
1887 | + if(y==1){return is_prime(x)} |
1888 | + if(x<0||y<1){return 0} |
1889 | + j[0]=4;j[1]=2;j[2]=4;j[3]=2;j[4]=4;j[5]=6;j[6]=2;j[7]=6 |
1890 | + for(p=2;p<7;p+=p-1){if(x==p){return 1};py=p^y;xx=x/py;if(x==py*xx){return 0}} |
1891 | + ji=7;p=7;py=p^y |
1892 | + while(py<=x){ |
1893 | + xx=x/py;if(x==py*xx){return 0} |
1894 | + p+=j[ji=(ji+1)%8];py=p^y |
1895 | + } |
1896 | + scale=os;return(1) |
1897 | +} |
1898 | + |
1899 | +# Fill the global prime[] array with g primes |
1900 | +define genprimes(g) { |
1901 | + auto os,j[],ji,i,x,xx,p,p2,pflag |
1902 | + #os-oldscale,j[]-jumps,ji-jumpindex,i-primeindex,x-primecandidate |
1903 | + #xx-x/p,p-prime,pflag-is.x.prime? |
1904 | + os=scale;scale=0 |
1905 | + j[0]=4;j[1]=2;j[2]=4;j[3]=2;j[4]=4;j[5]=6;j[6]=2;j[7]=6 |
1906 | + prime[0]=1;prime[1]=2;prime[2]=3;prime[3]=5;prime[4]=7;primetop=4 |
1907 | + if(g<100)g=100;if(g>65535)g=65535 |
1908 | + for(i=primetop+1;i<=g;i++)prime[i]=0 |
1909 | + ji=0;x=11 |
1910 | + while(primetop<g){ |
1911 | + i=2;p=prime[i];pflag=1 |
1912 | + while(p^2<=x){ |
1913 | + xx=x/p;if(x==p*xx){pflag=0;break} |
1914 | + i+=1;p=prime[i] |
1915 | + } |
1916 | + if(pflag){primetop+=1;prime[primetop]=x;}#print primetop,": ",x,"\n"} |
1917 | + x+=j[ji=(ji+1)%8] |
1918 | + } |
1919 | + scale=os;return(prime[primetop]) |
1920 | +} |
1921 | |
1922 | === added file 'bc-lib/ss.bc' |
1923 | --- bc-lib/ss.bc 1970-01-01 00:00:00 +0000 |
1924 | +++ bc-lib/ss.bc 2009-03-21 02:39:06 +0000 |
1925 | @@ -0,0 +1,32 @@ |
1926 | +## ss.bc calculate the value of sum[n=1..oo] x^(2^(-n))-1 with GNU bc |
1927 | +## i.e. sum of repeated square roots, less one. |
1928 | + |
1929 | +define ss(x) { |
1930 | + auto s,t,os; |
1931 | + if(x<=0){print "Negative Infinity\n";-1/0} |
1932 | + scale+=6 |
1933 | + s=x ; os=s+1 |
1934 | + t=0;while(os!=s){ |
1935 | + os=s |
1936 | + s=sqrt(s) |
1937 | + t+=s-1 |
1938 | + } |
1939 | + scale-=6;t/=1 |
1940 | + return(t); |
1941 | +} |
1942 | + |
1943 | +define ss_n(n,x) { # Generalisation of ss; ss(x) == ss_n(2,x) |
1944 | + auto s,t,os; |
1945 | + if(x<=0){print "Negative Infinity\n";-1/0} |
1946 | + if(n==2)return(ss(x)) |
1947 | + if(n<=1){print "Infinity\n";1/0} |
1948 | + scale+=6 |
1949 | + s=x ; os=s+1 |
1950 | + t=0;while(os!=s){ |
1951 | + os=s |
1952 | + s=e(l(s)/n) |
1953 | + t+=s-1 |
1954 | + } |
1955 | + scale-=6;t/=1 |
1956 | + return(t); |
1957 | +} |
1958 | |
1959 | === added file 'bc-lib/thermometer.bc' |
1960 | --- bc-lib/thermometer.bc 1970-01-01 00:00:00 +0000 |
1961 | +++ bc-lib/thermometer.bc 2009-03-21 02:39:06 +0000 |
1962 | @@ -0,0 +1,70 @@ |
1963 | +### Temperature.BC - Conversions of temperature scales to other scales for GNU bc |
1964 | + |
1965 | +## Celcius to... ########################################### |
1966 | + |
1967 | +# ... Farenheit |
1968 | +define c2f(c) { return (c * 1.8 + 32) } |
1969 | + |
1970 | +# ... Kelvin |
1971 | +define c2k(c) { return (c + 273.15) } |
1972 | + |
1973 | +# ... Reamur |
1974 | +define c2re(c) { return (c * 0.8) } |
1975 | + |
1976 | +# ... Rankine |
1977 | +define c2ra(c) { return (c * 1.8 + 491.67) } |
1978 | + |
1979 | +## Farenheit to... ######################################## |
1980 | + |
1981 | +# ... Celcius |
1982 | +define f2c(f) { return ((f - 32)/1.8) } |
1983 | + |
1984 | +# ... Kelvin |
1985 | +define f2k(f) { return ((f + 459.67)/1.8) } |
1986 | + |
1987 | +# ... Reamur |
1988 | +define f2re(f) { return ((f - 32)/2.25) } |
1989 | + |
1990 | +# ... Rankine |
1991 | +define f2ra(f) { return (f + 459.67) } |
1992 | + |
1993 | +## Kelvin to... ########################################### |
1994 | + |
1995 | +# ... Celcius |
1996 | +define k2c(k) { return (k - 273.15) } |
1997 | + |
1998 | +# ... Farenheit |
1999 | +define k2f(k) { return (k * 1.8 - 459.67) } |
2000 | + |
2001 | +# ... Reamur |
2002 | +define k2re(k) { return ((k - 273.15)*0.8) } |
2003 | + |
2004 | +# ... Rankine |
2005 | +define k2ra(k) { return (k * 1.8) } |
2006 | + |
2007 | +## Reamur to... ########################################## |
2008 | + |
2009 | +# ... Celcius |
2010 | +define re2c(r) { return (r / 0.8) } |
2011 | + |
2012 | +# ... Farenheit |
2013 | +define re2f(r) { return (r * 2.25 + 32) } |
2014 | +# ... Kelvin |
2015 | +define re2k(r) { return (r / 0.8 + 273.15) } |
2016 | + |
2017 | +# ... Rankine |
2018 | +define re2ra(r) { return (r * 2.25 + 491.67) } |
2019 | + |
2020 | +## Rankine to... ######################################### |
2021 | + |
2022 | +# ... Celcius |
2023 | +define ra2c(r) { return (r / 1.8 + 273.15) } |
2024 | + |
2025 | +# ... Farenheit |
2026 | +define ra2f(r) { return (r - 459.67) } |
2027 | + |
2028 | +# ... Kelvin |
2029 | +define ra2k(r) { return (r / 1.8) } |
2030 | + |
2031 | +# ... Reamur |
2032 | +define ra2re(r) { return ((r / 1.8 + 273.15)*0.8) } |
Le répertoire est prêt pour l'intégration dans la branche principale