20 template<
class Num,
class Den>
26 typedef SRational<SInt<1>,
SInt<1> > UnitRational;
31 template<
class A,
class B,
int C>
34 template<
class A,
class B>
39 template<
bool S1,
class N1,
bool S2,
class N2, base_t B>
43 typedef typename Div<TN1,TN2>::ModResult Mod;
48 template<
bool S1,
class N1, base_t B1,
bool S2,
class N2, base_t B2>
50 :
public __GCD<SBigInt<S2,N2,B2>, SBigInt<S1,N1,B1>, 1> {};
52 template<
bool S,
class N1, base_t Base,
int_t N2>
54 typedef typename Div<SBigInt<S,N1,Base>,
SInt<N2> >::ModResult Mod;
59 template<
bool S,
class N1, base_t Base,
int_t N2>
61 :
public __GCD<SInt<N2>, SBigInt<S,N1,Base>, 1> {};
63 template<
bool S,
class N1, base_t Base,
int_t N2>
66 static const int_t N = Evaluate2Int<SBigInt<S,N1,Base>, int_t>::Value;
67 static const int C = (N2<N) ? -1 : (N2>N) ? 1 : 0;
71 template<
bool S,
class N1, base_t Base,
int_t N2>
73 :
public __GCD<SBigInt<S,N1,Base>, SInt<N2>, 1> {};
75 template<
int_t N1,
int_t N2>
77 static const int_t N = N1%N2;
78 static const int C = (N2<N) ? -1 : (N2>N) ? 1 : 0;
82 template<
int_t N1,
int_t N2>
84 :
public __GCD<SInt<N2>, SInt<N1>, 1> {};
86 template<
bool S1,
bool S2,
class N, base_t Base>
91 template<
bool S,
class N, base_t Base>
101 template<
bool S,
class N, base_t Base>
108 typedef typename __SwitchToBigInt<N>::Result Result;
112 template<
class N1,
class N2>
114 typedef typename Abs<N1>::Result AN1;
115 typedef typename Abs<N2>::Result AN2;
121 template<
bool S1,
class T1,
bool S2,
class T2, base_t B>
122 class GCD<
SBigInt<S1,Loki::Typelist<SInt<0>,T1>,B>,
123 SBigInt<S2,Loki::Typelist<SInt<0>,T2>,B> > {
125 typedef typename CreateBigInt<Next,B>::Result NextBig;
126 typedef Loki::Typelist<SInt<0>,
typename NextBig::Num> NList;
133 template<
class N,
class D>
134 class Simplify<SRational<N,D> > {
135 typedef typename Abs<N>::Result AN;
136 typedef typename GCD<AN,D>::Result T;
137 typedef typename Div<N,T>::DivResult Num;
138 typedef typename Div<D,T>::DivResult Den;
140 typedef SRational<Num,Den> Result;
144 template<
class N1,
class D1,
class N2,
class D2>
145 class Mult<SRational<N1,D1>, SRational<N2,D2> > {
146 typedef typename GCD<N1,D2>::Result G1;
147 typedef typename GCD<N2,D1>::Result G2;
148 typedef typename Div<N1,G1>::DivResult NN1;
149 typedef typename Div<N2,G2>::DivResult NN2;
150 typedef typename Div<D2,G1>::DivResult DD2;
151 typedef typename Div<D1,G2>::DivResult DD1;
152 typedef typename Mult<NN1,NN2>::Result Num;
153 typedef typename Mult<DD1,DD2>::Result Den;
155 typedef SRational<Num,Den> Result;
158 template<
class N,
class D>
159 class Mult<SRational<N,D>, SRational<N,D> > {
160 typedef typename Mult<N,N>::Result Num;
161 typedef typename Mult<D,D>::Result Den;
163 typedef SRational<Num,Den> Result;
166 template<
int_t N1,
int_t D1,
int_t N2,
int_t D2>
168 static const int_t Num = N1*N2;
169 static const int_t Den = D1*D2;
170 typedef typename GCD<SInt<Num>,
SInt<Den> >::Result T;
171 typedef typename __SwitchToBigInt<Num/T::value>::Result NumT;
172 typedef typename __SwitchToBigInt<Den/T::value>::Result DenT;
174 typedef SRational<NumT,DenT> Result;
177 template<
int_t N,
int_t D>
179 static const int_t Num = N*N;
180 static const int_t Den = D*D;
181 typedef typename __SwitchToBigInt<Num>::Result NumT;
182 typedef typename __SwitchToBigInt<Den>::Result DenT;
184 typedef SRational<NumT,DenT> Result;
187 template<
class N,
class D,
int_t Num>
188 class Mult<SRational<N,D>,
SInt<Num> > {
189 typedef typename GCD<SInt<Num>,D>::Result G;
190 typedef typename Div<SInt<Num>,G>::DivResult Num1;
191 typedef typename Div<D,G>::DivResult D1;
192 typedef typename Mult<N,Num1>::Result Numer;
194 typedef SRational<Numer,D1> Result;
197 template<
class N,
class D,
int_t Num>
198 class Mult<
SInt<Num>, SRational<N,D> > :
public Mult<SRational<N,D>,SInt<Num> > {};
200 template<
class N,
class D,
bool S,
class NList,
unsigned int Base>
201 class Mult<SRational<N,D>,
SBigInt<S,NList,Base> > {
203 typedef typename GCD<Num,D>::Result G;
204 typedef typename Div<Num,G>::DivResult Num1;
205 typedef typename Div<D,G>::DivResult D1;
206 typedef typename Mult<N,Num1>::Result Numer;
208 typedef SRational<Numer,D1> Result;
211 template<
class N,
class D,
bool S,
class NList,
unsigned int Base>
212 class Mult<
SBigInt<S,NList,Base>,SRational<N,D> > :
public Mult<SRational<N,D>,SBigInt<S,NList,Base> > {};
216 template<
class Numer,
class Denom>
217 struct Negate<SRational<Numer,Denom> > {
218 typedef typename Negate<Numer>::Result NewNumer;
219 typedef SRational<NewNumer,Denom> Result;
224 template<
class N1,
class D1,
class N2,
class D2>
225 class Add<SRational<N1,D1>, SRational<N2,D2> > {
226 typedef typename GCD<D1,D2>::Result G;
227 typedef typename Div<D1,G>::DivResult DD1;
228 typedef typename Div<D2,G>::DivResult DD2;
229 typedef typename Mult<N1,DD2>::Result T1;
230 typedef typename Mult<N2,DD1>::Result T2;
231 typedef typename Add<T1,T2>::Result Num;
232 typedef typename Mult<DD1,D2>::Result Den;
234 typedef SRational<Num,Den> Result;
237 template<
class N,
class D,
int_t Num>
238 class Add<SRational<N,D>,
SInt<Num> > {
240 typedef typename Add<
241 typename Mult<D,T>::Result,N>::Result Numer;
243 typedef SRational<Numer,D> Result;
246 template<
class N,
class D,
int_t Num>
247 class Add<
SInt<Num>, SRational<N,D> > :
public Add<SRational<N,D>,SInt<Num> > {};
250 template<
class N,
class D,
bool S,
class NList, base_t Base>
251 class Add<SRational<N,D>,
SBigInt<S,NList,Base> > {
253 typedef typename Add<
254 typename Mult<D,T>::Result,N>::Result Numer;
256 typedef SRational<Numer,D> Result;
259 template<
class N,
class D,
bool S,
class NList, base_t Base>
260 class Add<
SBigInt<S,NList,Base>,SRational<N,D> > :
public Add<SRational<N,D>,SBigInt<S,NList,Base> > {};
264 template<
class N1,
class D1,
class N2,
class D2>
265 class Sub<SRational<N1,D1>, SRational<N2,D2> >
266 :
public Add<SRational<N1,D1>, typename Negate<SRational<N2,D2> >::Result> { };
268 template<
class N,
class D,
int_t Num>
269 class Sub<SRational<N,D>,
SInt<Num> > :
public Add<SRational<N,D>,SInt<-Num> > { };
271 template<
class N,
class D,
int_t Num>
272 class Sub<
SInt<Num>, SRational<N,D> > :
public Add<SInt<Num>, typename Negate<SRational<N,D> >::Result> { };
276 template<
class N,
class D>
277 struct Check<SRational<N,D> >
279 typedef typename Check<N>::Result CheckN;
280 typedef typename Check<D>::Result CheckD;
281 typedef SRational<CheckN,CheckD> Result;