cao-0.1: backend_lib/C_generic/CAO_mod.cpp
#include "CAO_mod.h"
CAO_RES CAO_mod_decl(CAO_mod * a, CAO_int n)
{
ZZ _n = *(ZZ *) n;
CAO_mod_s *_a = (CAO_mod_s *) malloc(sizeof(CAO_mod_s));
ZZ_p::init(_n);
_a->val = new ZZ_p();
_a->bak = new ZZ_pBak();
_a->bak->save();
(*a) = (CAO_mod) _a;
return CAO_OK;
}
CAO_RES CAO_mod_init(CAO_mod a, const char *val)
{
istringstream ins;
CAO_mod_s *_a = (CAO_mod_s *) a;
_a->bak->restore();
ins.str(val);
ins >> *_a->val;
_a->bak->save();
return CAO_OK;
}
CAO_RES _CAO_mod_init(CAO_mod a, CAO_int b)
{
stringstream ss;
CAO_mod_s *_a = (CAO_mod_s *) a;
ZZ *_b = (ZZ *) b;
_a->bak->restore();
ss << *_b;
ss >> *_a->val;
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_assign(CAO_mod a, CAO_mod b)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_b = (CAO_mod_s *) b;
_a->bak->restore();
*_a->val = *_b->val;
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_assign_one(CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
_a->bak->restore();
set(*_a->val);
return CAO_OK;
}
CAO_RES CAO_mod_assign_zero(CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
_a->bak->restore();
clear(*_a->val);
return CAO_OK;
}
CAO_RES CAO_mod_clone(CAO_mod * a, CAO_mod b)
{
CAO_mod_s *_a = (CAO_mod_s *) malloc(sizeof(CAO_mod_s));
CAO_mod_s *_b = (CAO_mod_s *) b;
_b->bak->restore();
_a->val = new ZZ_p(*_b->val);
_a->bak = new ZZ_pBak();
_a->bak->save();
_b->bak->save();
*a = _a;
return CAO_OK;
}
CAO_RES CAO_mod_dispose(CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
delete(_a->val);
delete(_a->bak);
free(_a);
return CAO_OK;
}
CAO_RES CAO_mod_add(CAO_mod r, CAO_mod a, CAO_mod b)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_b = (CAO_mod_s *) b;
CAO_mod_s *_r = (CAO_mod_s *) r;
_a->bak->restore();
*_r->val = (*_a->val) + (*_b->val);
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_addTo(CAO_mod r, CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_r = (CAO_mod_s *) r;
_a->bak->restore();
*_r->val += (*_a->val);
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_sub(CAO_mod r, CAO_mod a, CAO_mod b)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_b = (CAO_mod_s *) b;
CAO_mod_s *_r = (CAO_mod_s *) r;
_a->bak->restore();
*_r->val = (*_a->val) - (*_b->val);
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_subTo(CAO_mod r, CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_r = (CAO_mod_s *) r;
_a->bak->restore();
*_r->val -= (*_a->val);
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_mul(CAO_mod r, CAO_mod a, CAO_mod b)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_b = (CAO_mod_s *) b;
CAO_mod_s *_r = (CAO_mod_s *) r;
_a->bak->restore();
*_r->val = (*_a->val) * (*_b->val);
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_div(CAO_mod r, CAO_mod a, CAO_mod b)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_b = (CAO_mod_s *) b;
CAO_mod_s *_r = (CAO_mod_s *) r;
_a->bak->restore();
*_r->val = (*_a->val) / (*_b->val);
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_pow(CAO_mod r, CAO_mod a, CAO_int b)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
ZZ *_b = (ZZ *) b;
CAO_mod_s *_r = (CAO_mod_s *) r;
_a->bak->restore();
*_r->val = power(*_a->val, *_b);
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_sym(CAO_mod r, CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_r = (CAO_mod_s *) r;
_a->bak->restore();
*_r->val = -(*_a->val);
_a->bak->save();
return CAO_OK;
}
CAO_bool _CAO_mod_equal(CAO_mod a, CAO_mod b)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_b = (CAO_mod_s *) b;
_a->bak->restore();
CAO_bool r = (*_a->val == *_b->val);
_a->bak->save();
return r;
}
CAO_bool _CAO_mod_nequal(CAO_mod a, CAO_mod b)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_b = (CAO_mod_s *) b;
_a->bak->restore();
CAO_bool r = (*_a->val != *_b->val);
_a->bak->save();
return r;
}
CAO_RES CAO_mod_dump(CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
_a->bak->restore();
std::cout << *_a->val << " mod " << ZZ_p::modulus() << "\n";
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_cast_int(CAO_int b, CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
ZZ *_b = (ZZ *) b;
_a->bak->restore();
*_b = rep(*_a->val);
_a->bak->save();
return CAO_OK;
}
CAO_RES CAO_mod_cast_mod(CAO_mod b, CAO_mod a)
{
CAO_mod_s *_a = (CAO_mod_s *) a;
CAO_mod_s *_b = (CAO_mod_s *) b;
_b->bak->restore();
stringstream ss(stringstream::in | stringstream::out);
ss << *_a->val;
ss >> *_b->val;
_b->bak->save();
return CAO_OK;
}
CAO_RES CAO_int_cast_mod(CAO_mod b, CAO_int a)
{
CAO_mod_s *_b = (CAO_mod_s *) b;
ZZ *_a = (ZZ *) a;
_b->bak->restore();
stringstream ss(stringstream::in | stringstream::out);
ss << *_a;
ss >> *_b->val;
_b->bak->save();
return CAO_OK;
}