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; }