// m > 1, standard representation, no tricks
-static void std_fprint (cl_heap_modint_ring* R, cl_ostream stream, const _cl_MI &x)
+namespace cln {
+
+static void std_fprint (cl_heap_modint_ring* R, std::ostream& stream, const _cl_MI &x)
{
fprint(stream,R->_retract(x));
fprint(stream," mod ");
return x.rep;
}
-static const _cl_MI std_random (cl_heap_modint_ring* R, cl_random_state& randomstate)
+static const _cl_MI std_random (cl_heap_modint_ring* R, random_state& randomstate)
{
return _cl_MI(R, random_I(randomstate,R->modulus));
}
// k = 3 for nn <= 69.8
// ... k for nn <= k*(k+1)*2^(2k)/(2^(k+1)-k-2)
var cl_I n = y;
- var uintL nn = integer_length(n);
+ var uintC nn = integer_length(n);
// n has nn bits.
if (nn <= 8) {
// k = 1, normal Left-Right Binary algorithm.
- var uintL _n = FN_to_UL(n);
+ var uintL _n = FN_to_UV(n);
var _cl_MI a = x;
for (var int i = nn-2; i >= 0; i--) {
a = R->_square(a);
else if (nn <= 1721160) k = 14;
else if (nn <= 3933180) k = 15;
else /* if (nn <= 8914120) */ k = 16;
- var uintL nnk = ceiling(nn,k); // number of base-2^k digits in n
+ var uintC nnk = ceiling(nn,k); // number of base-2^k digits in n
var uint16* n_digits = cl_alloc_array(uint16,nnk);
// Split n into base-2^k digits.
{
var const uintL k_mask = bit(k)-1;
var uintD carry = 0;
var unsigned int carrybits = 0;
- for (var uintL i = 0; i < nnk; i++) {
+ for (var uintC i = 0; i < nnk; i++) {
if (carrybits >= k) {
n_digits[i] = carry & k_mask;
carry = carry >> k;
// Compute maximum odd base-2^k digit.
var uintL maxodd = 1;
if (k <= 8) {
- for (var uintL i = 0; i < nnk; i++) {
+ for (var uintC i = 0; i < nnk; i++) {
var uintL d = n_digits[i];
if (d > 0) {
d = odd_table[d];
}
}
} else {
- for (var uintL i = 0; i < nnk; i++) {
+ for (var uintC i = 0; i < nnk; i++) {
var uintL d = n_digits[i];
if (d > 0) {
var uintL d2; ord2_32(d,d2=);
for ( ; d2>0; d2--)
a = R->_square(a);
}
- for (var sintL i = nnk-2; i >= 0; i--) {
+ for (var sintC i = nnk-2; i >= 0; i--) {
// Compute a := a^(2^k) * x^n_digits[i].
var uintL d = n_digits[i];
var uintL d2;
SUBCLASS_cl_heap_modint_ring()
public:
// Constructor.
- cl_heap_modint_ring_std (const cl_I& m)
- : cl_heap_modint_ring (m, &std_setops, &std_addops, &std_mulops) {}
+ cl_heap_modint_ring_std (const cl_I& m);
// Virtual destructor.
~cl_heap_modint_ring_std () {}
};
+
+static void cl_heap_modint_ring_std_destructor (cl_heap* pointer)
+{
+ (*(cl_heap_modint_ring_std*)pointer).~cl_heap_modint_ring_std();
+}
+
+cl_class cl_class_modint_ring_std = {
+ cl_heap_modint_ring_std_destructor,
+ cl_class_flags_modint_ring
+};
+
+// Constructor.
+inline cl_heap_modint_ring_std::cl_heap_modint_ring_std (const cl_I& m)
+ : cl_heap_modint_ring (m, &std_setops, &std_addops, &std_mulops)
+{
+ type = &cl_class_modint_ring_std;
+}
+
+} // namespace cln