#include <modular_int.hpp>
Definition at line 263 of file modular_int.hpp.
static void half_lshift_mod | ( | C & | dest, | |
const C & | p, | |||
const C & | lo_p, | |||
const C & | hi_p, | |||
C & | carry | |||
) | [inline, static] |
Definition at line 288 of file modular_int.hpp.
References mmx::C.
00289 { 00290 // p = hi_p * B + lo_p, return (dest * B) % p and (dest * B) / p 00291 // It is required that hi_p != 0 00292 C q = dest / hi_p, c = 0; carry = q; 00293 C r = dest - q * hi_p; 00294 q *= lo_p; carry -= (q / p); 00295 q %= p; 00296 dest = r << half_size; 00297 V::sub_mod_core (dest, q, p, c); 00298 if (c != 0) carry--; 00299 }
static void half_lshift_mod | ( | C & | dest, | |
const C & | p, | |||
const C & | lo_p, | |||
const C & | hi_p | |||
) | [inline, static] |
Definition at line 276 of file modular_int.hpp.
References mmx::C.
Definition at line 273 of file modular_int.hpp.
Definition at line 270 of file modular_int.hpp.
Definition at line 328 of file modular_int.hpp.
References mmx::C.
00328 { 00329 C hi_p = hi (p); 00330 if (hi_p) { 00331 C lo_p = lo (p); 00332 C lo_dest = lo (dest); 00333 C lo_s = lo (s); 00334 C hi_dest = hi (dest); 00335 C hi_s = hi (s); 00336 C c= 0, cc= 0; 00337 dest = lo_dest * lo_s; 00338 reduce_mod_core (dest, p, cc); 00339 C t = lo_dest * hi_s; 00340 half_lshift_mod (t, p, lo_p, hi_p, c); cc += c; c= 0; 00341 V::add_mod_core (dest, t, p, c); cc += c; c= 0; 00342 t = hi_dest * lo_s; 00343 half_lshift_mod (t, p, lo_p, hi_p, c); cc += c; c= 0; 00344 V::add_mod_core(dest, t, p, c); cc += c; c= 0; 00345 t = hi_dest * hi_s; 00346 half_lshift_mod (t, p, lo_p, hi_p, c); cc += c << half_size; c= 0; 00347 half_lshift_mod (t, p, lo_p, hi_p, c); cc += c; c= 0; 00348 V::add_mod_core(dest, t, p, c); cc += c; c= 0; 00349 V::add_mod_core(dest, carry, p, c); carry = cc + c; 00350 } 00351 else { 00352 dest = dest * s + carry; 00353 if (p != 0) { carry= dest / p; dest %= p; } 00354 } 00355 }
Definition at line 301 of file modular_int.hpp.
References mmx::C.
00301 { 00302 C hi_p = hi (p); 00303 if (hi_p) { 00304 C lo_p = lo (p); 00305 C lo_dest = lo (dest); 00306 C lo_s = lo (s); 00307 C hi_dest = hi (dest); 00308 C hi_s = hi (s); 00309 dest = lo_dest * lo_s; 00310 V::reduce_mod_core (dest, p); 00311 C t = lo_dest * hi_s; 00312 half_lshift_mod (t, p, lo_p, hi_p); 00313 V::add_mod_core (dest, t, p); 00314 t = hi_dest * lo_s; 00315 half_lshift_mod (t, p, lo_p, hi_p); 00316 V::add_mod_core(dest, t, p); 00317 t = hi_dest * hi_s; 00318 half_lshift_mod (t, p, lo_p, hi_p); 00319 half_lshift_mod (t, p, lo_p, hi_p); 00320 V::add_mod_core(dest, t, p); 00321 } 00322 else { 00323 dest *= s; 00324 if (p != 0) dest %= p; 00325 } 00326 }
Definition at line 264 of file modular_int.hpp.
Definition at line 265 of file modular_int.hpp.