7 #include "cln/rational.h"
17 cl_boolean logp (const cl_RA& a, const cl_RA& b, cl_RA* pl)
22 // a Integer: log(a,b) rational errechenbar -> liefern
23 // a Ratio: a=a1/a2 mit a1>0, a2>1.
24 // a1=1 und log(a2,b) rational errechenbar -> -log(a2,b) liefern
25 // b Ratio: a=a1/a2, b=b1/b2 mit a1>0, a2>0, b1>0, b2>1.
26 // log(a2,b2) rational errechenbar ->
27 // b1=1 -> bei a1=1 liefern, sonst nicht.
28 // b1>1 -> log(a1,b1) rational errechenbar und
29 // log(a1,b1)=log(a2,b2) -> liefern, sonst nicht.
30 // sonst a1,a2 vertauschen:
31 // log(a2/a1,b1/b2) versuchen (wie oben) ->
32 // -log(a2/a1,b1/b2) liefern
34 if (eq(a,1)) { // a=1 -> Ergebnis 0
35 *pl = 0; return cl_true;
47 var const cl_I& a1 = numerator(a);
48 var const cl_I& a2 = denominator(a);
54 *pl = -l; return cl_true;
59 // a rational, b Ratio
63 RA_numden_I_I(a, a1 =, a2 =);
64 var const cl_I& b1 = numerator(b);
65 var const cl_I& b2 = denominator(b);
68 // rationalen log(a2,b2) versuchen
69 if (logp(a2,b2,&l2)) {
72 { *pl = l2; return cl_true; }
77 // rationalen log(a1,b1) versuchen
80 { *pl = l2; return cl_true; }
87 // rationalen log(a1,b2) versuchen
88 if (logp(a1,b2,&l2)) {
91 { *pl = -l2; return cl_true; }
96 // rationalen log(a2,b1) versuchen
99 { *pl = -l2; return cl_true; }