7 #include "cl_rational.h"
15 cl_boolean logp (const cl_RA& a, const cl_RA& b, cl_RA* pl)
20 // a Integer: log(a,b) rational errechenbar -> liefern
21 // a Ratio: a=a1/a2 mit a1>0, a2>1.
22 // a1=1 und log(a2,b) rational errechenbar -> -log(a2,b) liefern
23 // b Ratio: a=a1/a2, b=b1/b2 mit a1>0, a2>0, b1>0, b2>1.
24 // log(a2,b2) rational errechenbar ->
25 // b1=1 -> bei a1=1 liefern, sonst nicht.
26 // b1>1 -> log(a1,b1) rational errechenbar und
27 // log(a1,b1)=log(a2,b2) -> liefern, sonst nicht.
28 // sonst a1,a2 vertauschen:
29 // log(a2/a1,b1/b2) versuchen (wie oben) ->
30 // -log(a2/a1,b1/b2) liefern
32 if (eq(a,1)) { // a=1 -> Ergebnis 0
33 *pl = 0; return cl_true;
45 var const cl_I& a1 = numerator(a);
46 var const cl_I& a2 = denominator(a);
52 *pl = -l; return cl_true;
57 // a rational, b Ratio
61 RA_numden_I_I(a, a1 =, a2 =);
62 var const cl_I& b1 = numerator(b);
63 var const cl_I& b2 = denominator(b);
66 // rationalen log(a2,b2) versuchen
67 if (logp(a2,b2,&l2)) {
70 { *pl = l2; return cl_true; }
75 // rationalen log(a1,b1) versuchen
78 { *pl = l2; return cl_true; }
85 // rationalen log(a1,b2) versuchen
86 if (logp(a1,b2,&l2)) {
89 { *pl = -l2; return cl_true; }
94 // rationalen log(a2,b1) versuchen
97 { *pl = -l2; return cl_true; }