|
numerix_doc 0.4
|
#include <modular_int.hpp>
Definition at line 399 of file modular_int.hpp.
| static void inv_mod | ( | C & | a, |
| const M & | m | ||
| ) | [inline, static] |
Definition at line 459 of file modular_int.hpp.
{
if (V::template maximum_size_helper<C>::value >= 8*sizeof(C))
inv_mod_unsigned(a, m.p);
else
inv_mod_signed(a, m.p); }
Definition at line 466 of file modular_int.hpp.
{
dest = s;
inv_mod (dest, m); }
Definition at line 402 of file modular_int.hpp.
{
typedef typename unsigned_of_helper<C>::type uC;
typedef typename signed_of_helper<C>::type sC;
sC coa0=0, coa1=1, r0=p, r1=a, q, t;
if ((p == 0) && (r1 != 0)) {
q = (((uC) r0) - ((uC) r1)) / ((uC) r1) + 1;
t = r0 - q * r1;
r0 = r1;
r1 = t;
t = coa1;
coa1 = coa0 - q * coa1;
coa0 = t;
}
while (r1 != 0) {
q = r0 / r1;
t = r0 - q * r1;
r0 = r1;
r1 = t;
t = coa1;
coa1 = coa0 - q * coa1;
coa0 = t;
}
if (r0 != 1)
ERROR ("inv_mod: argument is not invertible");
a = coa0 < 0 ? p+coa0 : coa0;
}
Definition at line 430 of file modular_int.hpp.
{
C coa0=0, coa1=1, r0=p, r1=a, q, t;
bool toggle = true;
if ((p == 0) && (r1 != 0)) {
q = (r0-r1) / r1 + 1;
t = r0 - q * r1;
r0 = r1;
r1 = t;
t = coa1;
coa1 = coa0 - q * coa1;
coa0 = t;
toggle = !toggle;
}
while (r1 != 0) {
q = r0 / r1;
t = r0 - q * r1;
r0 = r1;
r1 = t;
t = coa1;
coa1 = coa0 - q * coa1;
coa0 = t;
toggle = !toggle;
}
if (r0 != 1)
ERROR ("inv_mod: argument is not invertible");
a = (toggle && (coa0 != 0)) ? p+coa0 : coa0;
}