1 // operator>> on cl_MI.
7 #include "cln/modinteger.h"
12 #include "cln/integer.h"
18 const cl_MI operator>> (const cl_MI& x, sintL y) // assume 0 <= y < 2^31
22 var const cl_modint_ring& R = x.ring();
23 if (!oddp(R->modulus)) {
25 cl_error_division_by_0();
27 return (cl_MI_x)cl_notify_composite(R,2);
29 if (y == 1) // frequent case
30 return cl_MI(R, (evenp(x.rep) ? x.rep : x.rep + R->modulus) >> 1);
32 // Algorithm 1: add a multiple of m to x.rep so that it becomes
33 // divisible by 2^y (2-adic division), then shift right.
34 // asymptotical cost: O(y * log m).
35 // Algorithm 2: x * expt(2 mod m,-y) using modular integer operations.
36 // asymptotical cost: O(log y * (log m)^2).
37 // Use algorithm 1 for small y, algorithm 2 for large y.
40 cl_abort(); // not yet implemented
43 return R->div(x, expt_pos(R->canonhom(2), (cl_I)(long)y));