7 #include "cl_rational.h"
13 #include "cl_integer.h"
16 const cl_RA operator* (const cl_RA& r, const cl_RA& s)
18 // Methode (vgl. [Buchberger, Collins, Loos: Computer Algebra, S.201])
19 // r,s beide Integers -> klar.
21 // Bei c=0 Ergebnis 0.
23 // Falls g=1: Ergebnis (a*c)/b (mit b>1, ggT(a*c,b)=1).
24 // Sonst: b':=b/g, c':=c/g, Ergebnis (a*c')/b' (mit ggT(a*c',b')=1).
27 // g:=ggT(a,d), h:=ggT(b,c).
28 // a':=a/g, d':=d/g (nur bei g>1 bedeutet das Rechnung).
29 // b':=b/h, c':=c/h (nur bei h>1 bedeutet das Rechnung).
30 // Ergebnis ist = (a'*c')/(b'*d').
40 var const cl_I& a = numerator(r);
41 var const cl_I& b = denominator(r);
42 var const cl_I& c = s;
43 // r=a/b, s=c, bilde a/b * c.
45 { return 0; } // c=0 -> Ergebnis 0
46 var cl_I g = gcd(b,c);
49 return I_I_to_RT(a*c,b); // (a*c)/b
52 return I_I_to_RA(a*exquo(c,g),exquopos(b,g)); // (a*(c/g))/(b/g)
60 var const cl_I& a = r;
61 var const cl_I& b = numerator(s);
62 var const cl_I& c = denominator(s);
63 // r=a, s=b/c, bilde a * b/c.
65 { return 0; } // a=0 -> Ergebnis 0
66 var cl_I g = gcd(a,c);
69 return I_I_to_RT(a*b,c); // (a*b)/c
72 return I_I_to_RA(exquo(a,g)*b,exquopos(c,g)); // ((a/g)*b)/(c/g)
76 var const cl_I& a = numerator(r);
77 var const cl_I& b = denominator(r);
78 var const cl_I& c = numerator(s);
79 var const cl_I& d = denominator(s);
82 var cl_I g = gcd(a,d);
86 { ap = exquo(a,g); dp = exquopos(d,g); }
90 var cl_I h = gcd(b,c);
94 { cp = exquo(c,h); bp = exquopos(b,h); }
96 return I_I_to_RA(ap*cp,bp*dp); // (a'*c')/(b'*d')