modulus_inv_int_naive< V > Struct Template Reference

#include <modular_int.hpp>

List of all members.

Static Public Member Functions


Detailed Description

template<typename V>
struct mmx::modulus_inv_int_naive< V >

Definition at line 399 of file modular_int.hpp.


Member Function Documentation

static void inv_mod ( C dest,
const C s,
const M &  m 
) [inline, static]

Definition at line 470 of file modular_int.hpp.

00470                                             {
00471     dest = s;
00472     inv_mod (dest, m); }

static void inv_mod ( C a,
const M &  m 
) [inline, static]

Definition at line 463 of file modular_int.hpp.

Referenced by modulus_inv_int_naive< modulus_mul_int_naive< modulus_add_int_naive< modulus_reduction_int_naive< modulus_normalization_int_naive< modulus_maximum_size_int< size > > > > > >::inv_mod().

00463                              {
00464     if (V::template maximum_size_helper<C>::value >= 8*sizeof(C))
00465       inv_mod_unsigned(a, m.p);
00466     else
00467       inv_mod_signed(a, m.p); }

static void inv_mod_signed ( C a,
const C p 
) [inline, static]

Definition at line 402 of file modular_int.hpp.

Referenced by modulus_inv_int_naive< modulus_mul_int_naive< modulus_add_int_naive< modulus_reduction_int_naive< modulus_normalization_int_naive< modulus_maximum_size_int< size > > > > > >::inv_mod().

00402                                     {
00403     typedef typename unsigned_of_helper<C>::type uC;
00404     typedef typename signed_of_helper<C>::type sC;
00405     sC coa0=0, coa1=1, r0=p, r1=a, q, t;        
00406     if ((p == 0) && (r1 != 0)) {
00407       q = (((uC) r0) - ((uC) r1)) / ((uC) r1) + 1;
00408       t = r0 - q * r1;
00409       r0 = r1;
00410       r1 = t;
00411       t = coa1;
00412       coa1 = coa0 - q * coa1;
00413       coa0 = t;
00414     }
00415     while (r1 != 0) {
00416       q = r0 / r1;
00417       t = r0 - q * r1;
00418       r0 = r1;
00419       r1 = t;
00420       t = coa1;
00421       coa1 = coa0 - q * coa1;
00422       coa0 = t;
00423     }
00424     if (r0 != 1)
00425       ERROR ("inv_mod: argument is not invertible");
00426     a = coa0 < 0 ? p+coa0 : coa0;
00427   }

static void inv_mod_unsigned ( C a,
const C p 
) [inline, static]

Definition at line 430 of file modular_int.hpp.

Referenced by modulus_inv_int_naive< modulus_mul_int_naive< modulus_add_int_naive< modulus_reduction_int_naive< modulus_normalization_int_naive< modulus_maximum_size_int< size > > > > > >::inv_mod().

00430                                       {
00431     C coa0=0, coa1=1, r0=p, r1=a, q, t; 
00432     bool toggle = true;
00433     if ((p == 0) && (r1 != 0)) {
00434       q = (r0-r1) / r1 + 1;
00435       t = r0 - q * r1;
00436       r0 = r1;
00437       r1 = t;
00438       t = coa1;
00439       coa1 = coa0 - q * coa1;
00440       coa0 = t;
00441       toggle = !toggle;
00442     }
00443     while (r1 != 0) {
00444       q = r0 / r1;
00445       t = r0 - q * r1;
00446       r0 = r1;
00447       r1 = t;
00448       t = coa1;
00449       coa1 = coa0 - q * coa1;
00450       coa0 = t;
00451       toggle = !toggle;
00452     }
00453     if (r0 != 1)
00454       ERROR ("inv_mod: argument is not invertible");
00455     a = (toggle && (coa0 != 0)) ? p+coa0 : coa0;
00456   }

static bool is_invertible_mod ( const C s,
const M &  m 
) [inline, static]

Definition at line 459 of file modular_int.hpp.

00459                                              {
00460     return abs (gcd (s, m.p)) == 1; }


The documentation for this struct was generated from the following file:

Generated on 6 Dec 2012 for numerix by  doxygen 1.6.1