43 namespace Gecode {
namespace Int {
namespace Arithmetic {
49 template<
class VA,
class VB,
class Ops>
56 ModEvent me = x0.lq(home,ops.fnroot(x1.max()));
61 ModEvent me = x0.gq(home,ops.cnroot(x1.min()));
66 ModEvent me = x1.lq(home,ops.pow(x0.max()));
71 ModEvent me = x1.gq(home,ops.pow(x0.min()));
79 template<
class VA,
class VB,
class Ops>
85 template<
class VA,
class VB,
class Ops>
92 assert(!x1.assigned());
98 template<
class VA,
class VB,
class Ops>
105 template<
class VA,
class VB,
class Ops>
111 template<
class VA,
class VB,
class Ops>
128 assert((x0.
min() < 0) && (0 < x0.
max()));
130 assert(x1.
min() >= 0);
131 int u = ops.fnroot(x1.
max());
135 ops.pow(-x0.
min()))));
137 assert((x1.
min() < 0) && (0 < x1.
max()));
155 if (static_cast<unsigned int>(ops.exp()) >=
sizeof(
int) * CHAR_BIT) {
160 ops.exp(ops.even() ? 2 : 1);
163 if (ops.exp() == 0) {
166 }
else if (ops.exp() == 1) {
171 assert(ops.exp() != 0);
185 if ((x0.
min() >= 0) || ((x1.
min() >= 0) && !ops.even()))
188 if (ops.even() && (x0.
max() <= 0))
192 if (!ops.even() && ((x0.
max() <= 0) || (x1.
max() <= 0)))
199 assert((x0.
min() < 0) && (x0.
max() > 0));
203 ops.pow(x0.
max()))));
228 if ((x0.min() >= 0) || ((x1.min() >= 0) && !ops.even()))
230 ::
post(home(*
this),x0,x1,ops)));
232 if (ops.even() && (x0.max() <= 0))
236 if (!ops.even() && ((x0.max() <= 0) || (x1.max() <= 0)))
243 if (x0.assigned() && x1.assigned())
244 return (ops.pow(x0.val()) == x1.val()) ?
282 return ops.fnroot(x);
298 return -
ops.fnroot(-x);
300 return ops.fnroot(x);
309 template<
class VA,
class VB,
class Ops>
315 template<
class VA,
class VB,
class Ops>
321 if (!x0.assigned()) {
322 assert(!x1.assigned());
328 template<
class VA,
class VB,
class Ops>
335 template<
class VA,
class VB,
class Ops>
341 template<
class VA,
class VB,
class Ops>
352 template<
class VA,
class VB,
class Ops>
357 return x0.assigned() ?
393 if (static_cast<unsigned int>(ops.exp()) >=
sizeof(
int) * CHAR_BIT) {
398 ops.exp(ops.even() ? 2 : 1);
401 if (ops.exp() == 0) {
404 }
else if (ops.exp() == 1) {
409 assert(ops.exp() != 0);
423 if ((x0.
min() >= 0) || ((x1.
min() >= 0) && !ops.even()))
426 if (ops.even() && (x0.
max() <= 0))
430 if (!ops.even() && ((x0.
max() <= 0) || (x1.
max() <= 0)))
437 assert((x0.
min() < 0) && (x0.
max() > 0));
441 ops.pow(x0.
max()))));
477 if ((x0.min() >= 0) || ((x1.min() >= 0) && !ops.even()))
479 ::
post(home(*
this),x0,x1,ops)));
481 if (ops.even() && (x0.max() <= 0))
485 if (!ops.even() && ((x0.max() <= 0) || (x1.max() <= 0)))
492 if (x0.assigned() && x1.assigned())
493 return (ops.pow(x0.val()) == x1.val()) ?
502 using namespace Iter::Values;
503 Positive<ViewValues<IntView> >
pos(
i);
504 Negative<ViewValues<IntView> >
neg(j);
509 Map<Minus,ValuesMapPow<Ops>,
true> sm(m,vmp);
511 Map<Minus,ValuesMapPow<Ops>,
true> >
u(sp,sm);
522 using namespace Iter::Values;