1 #ifndef PhysicsTools_Utilities_Factorize_h 2 #define PhysicsTools_Utilities_Factorize_h 8 #include <boost/type_traits.hpp> 9 #include <boost/mpl/and.hpp> 10 #include <boost/mpl/not.hpp> 11 #include <boost/mpl/int.hpp> 19 static const bool value =
false;
26 public Divides0<
A> { };
29 public Divides0<
PROD_S(A, B)> { };
32 public Divides<A, void> { };
35 static const bool value =
true;
41 TEMPL(T1) struct Divides<
A, A> :
47 TEMPL(N1T1)
struct Divides<POWER_S(A, NUM(n)),
52 public Divides<POWER(A, NUM(n)), void> { };
55 static const bool value =
true;
57 static const int p = ::boost::mpl::if_c<(n <
m),
58 ::boost::mpl::int_<n>, ::boost::mpl::int_<m> >::
type::value;
64 TEMPL(N2T1) struct Divides<POWER_S(A, NUM(n)),
68 TEMPL(N1T1)
struct Divides<A, POWER_S(A, NUM(n))> :
71 TEMPL(N1T1)
struct Divides<POWER_S(A, NUM(n)), A> :
76 template<
int n,
bool positive = (n>= 0)>
77 struct abs {
enum { value = n }; };
80 struct abs<n, false> {
enum { value = -n }; };
84 TEMPL(N2) struct Divides<NUM(n), NUM(m)> {
86 static const bool value = (gcd != 1);
92 TEMPL(N1) struct Divides<NUM(n), NUM(n)> {
93 static const bool value =
true;
100 public Divides<A,
B> { };
103 public Divides<
PROD_S(A, B),
C> { };
105 TEMPL(T2)
struct Divides<MINUS_S(A), B> {
106 typedef Divides<A, B>
Div;
113 TEMPL(T2) struct Divides<MINUS_S(A), MINUS_S(B)> {
114 typedef Divides<A, B>
Div;
122 typedef Divides<A, PROD_S(B, C)>
Div;
129 TEMPL(T3)
struct Divides<A, PROD_S(B, C)> {
131 typedef Divides<arg, void>
D0;
132 typedef Divides<arg, B>
D1;
133 typedef Divides<arg, C>
D2;
134 typedef typename ::boost::mpl::if_<
D1,
D1,
141 TEMPL(T3) struct Divides<PROD_S(A, B), C> {
143 typedef Divides<arg, void>
D0;
144 typedef Divides<A, C>
D1;
145 typedef Divides<B, C>
D2;
146 typedef typename ::boost::mpl::if_<
D1,
D1,
154 TEMPL(T4) struct Divides<PROD_S(A, B), PROD_S(C, D)> {
156 typedef Divides<arg, void>
D0;
157 typedef Divides<arg, C>
D1;
158 typedef Divides<arg, D>
D2;
159 typedef typename ::boost::mpl::if_<
D1,
D1,
186 inline static type
combine(
const A& _1,
const B& _2) {
188 return f * ((_1 /
f) + (_2 / f));
195 TEMPL(T3)
struct Sum<A, PROD_S(B, C)> :
204 TEMPL(T4)
struct Sum<PROD_S(A, B), PROD_S(C, D)> :
207 TEMPL(T4)
struct Sum<MINUS_S(PROD_S(A, B)),
208 MINUS_S(PROD_S(C, D))> :
210 MINUS_S(PROD_S(C, D))> { };
213 MINUS_S(PROD_S(C, D))> :
215 MINUS_S(PROD_S(C, D))> { };
217 TEMPL(T4)
struct Sum<MINUS_S(PROD_S(A, B)),
222 TEMPL(N1T2)
struct Sum<PROD_S(A, B), NUM(n)> :
225 TEMPL(N1T2)
struct Sum<NUM(n), PROD_S(A, B)> :
const Numerical< n > & num()
typedef POWER(A, NUM(n)) arg
static type combine(const A &_1, const B &_2)
DecomposeProduct< arg, typename Div::arg > D
TEMPL(T1) struct Divides0
typedef PROD(F, SUM(RATIO(A, F), RATIO(B, F))) type
#define COMBINE(A, B, RES)
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
static type get(const PROD_S(A, B)&_)
Power< A, B >::type pow(const A &a, const B &b)
T get(const Candidate &c)
::boost::mpl::if_< D1, D1, typename::boost::mpl::if_< D2, D2, D0 >::type >::type Div