7 #include "cln/rational.h"
13 #include "cln/integer.h"
18 const cl_RA operator* (const cl_RA& r, const cl_RA& s)
20 // Methode (vgl. [Buchberger, Collins, Loos: Computer Algebra, S.201])
21 // r,s beide Integers -> klar.
23 // Bei c=0 Ergebnis 0.
25 // Falls g=1: Ergebnis (a*c)/b (mit b>1, ggT(a*c,b)=1).
26 // Sonst: b':=b/g, c':=c/g, Ergebnis (a*c')/b' (mit ggT(a*c',b')=1).
29 // g:=ggT(a,d), h:=ggT(b,c).
30 // a':=a/g, d':=d/g (nur bei g>1 bedeutet das Rechnung).
31 // b':=b/h, c':=c/h (nur bei h>1 bedeutet das Rechnung).
32 // Ergebnis ist = (a'*c')/(b'*d').
42 var const cl_I& a = numerator(r);
43 var const cl_I& b = denominator(r);
44 var const cl_I& c = s;
45 // r=a/b, s=c, bilde a/b * c.
47 { return 0; } // c=0 -> Ergebnis 0
48 var cl_I g = gcd(b,c);
51 return I_I_to_RT(a*c,b); // (a*c)/b
54 return I_I_to_RA(a*exquo(c,g),exquopos(b,g)); // (a*(c/g))/(b/g)
62 var const cl_I& a = r;
63 var const cl_I& b = numerator(s);
64 var const cl_I& c = denominator(s);
65 // r=a, s=b/c, bilde a * b/c.
67 { return 0; } // a=0 -> Ergebnis 0
68 var cl_I g = gcd(a,c);
71 return I_I_to_RT(a*b,c); // (a*b)/c
74 return I_I_to_RA(exquo(a,g)*b,exquopos(c,g)); // ((a/g)*b)/(c/g)
78 var const cl_I& a = numerator(r);
79 var const cl_I& b = denominator(r);
80 var const cl_I& c = numerator(s);
81 var const cl_I& d = denominator(s);
84 var cl_I g = gcd(a,d);
88 { ap = exquo(a,g); dp = exquopos(d,g); }
92 var cl_I h = gcd(b,c);
96 { cp = exquo(c,h); bp = exquopos(b,h); }
98 return I_I_to_RA(ap*cp,bp*dp); // (a'*c')/(b'*d')