Botan 1.10.17
Botan::Modular_Reducer Class Reference

#include <reducer.h>

Public Member Functions

BigInt cube (const BigInt &x) const
const BigIntget_modulus () const
bool initialized () const
 Modular_Reducer ()
 Modular_Reducer (const BigInt &mod)
BigInt multiply (const BigInt &x, const BigInt &y) const
BigInt reduce (const BigInt &x) const
BigInt square (const BigInt &x) const

Detailed Description

Modular Reducer (using Barrett's technique)

Definition at line 18 of file reducer.h.

Constructor & Destructor Documentation

◆ Modular_Reducer() [1/2]

◆ Modular_Reducer() [2/2]

Botan::Modular_Reducer::Modular_Reducer ( const BigInt & mod)

Definition at line 16 of file reducer.cpp.

17 {
18 if(mod <= 0)
19 throw Invalid_Argument("Modular_Reducer: modulus must be positive");
20
21 modulus = mod;
22 mod_words = modulus.sig_words();
23
24 modulus_2 = Botan::square(modulus);
25
26 mu = BigInt(BigInt::Power2, 2 * MP_WORD_BITS * mod_words) / modulus;
27 }
BigInt square(const BigInt &x)
Definition mp_numth.cpp:18
const size_t MP_WORD_BITS
Definition mp_core.h:18
std::invalid_argument Invalid_Argument
Definition exceptn.h:20

References Botan::BigInt::BigInt(), Botan::MP_WORD_BITS, Botan::BigInt::Power2, Botan::BigInt::sig_words(), and Botan::square().

Member Function Documentation

◆ cube()

BigInt Botan::Modular_Reducer::cube ( const BigInt & x) const
inline

Cube mod p

Parameters
x
Returns
(x * x * x) % p

Definition at line 47 of file reducer.h.

48 { return multiply(x, this->square(x)); }
BigInt square(const BigInt &x) const
Definition reducer.h:39
BigInt multiply(const BigInt &x, const BigInt &y) const
Definition reducer.h:31

References multiply(), and square().

◆ get_modulus()

const BigInt & Botan::Modular_Reducer::get_modulus ( ) const
inline

Definition at line 21 of file reducer.h.

21{ return modulus; }

◆ initialized()

bool Botan::Modular_Reducer::initialized ( ) const
inline

Definition at line 50 of file reducer.h.

50{ return (mod_words != 0); }

◆ multiply()

BigInt Botan::Modular_Reducer::multiply ( const BigInt & x,
const BigInt & y ) const
inline

Multiply mod p

Parameters
x
y
Returns
(x * y) % p

Definition at line 31 of file reducer.h.

32 { return reduce(x * y); }
BigInt reduce(const BigInt &x) const
Definition reducer.cpp:32

References reduce().

Referenced by cube(), and Botan::ressol().

◆ reduce()

BigInt Botan::Modular_Reducer::reduce ( const BigInt & x) const

Definition at line 32 of file reducer.cpp.

33 {
34 if(mod_words == 0)
35 throw Invalid_State("Modular_Reducer: Never initalized");
36
37 if(x.cmp(modulus, false) < 0)
38 {
39 if(x.is_negative())
40 return x + modulus; // make positive
41 return x;
42 }
43 else if(x.cmp(modulus_2, false) < 0)
44 {
45 BigInt t1 = x;
46 t1.set_sign(BigInt::Positive);
47 t1 >>= (MP_WORD_BITS * (mod_words - 1));
48 t1 *= mu;
49
50 t1 >>= (MP_WORD_BITS * (mod_words + 1));
51 t1 *= modulus;
52
53 t1.mask_bits(MP_WORD_BITS * (mod_words + 1));
54
55 BigInt t2 = x;
56 t2.set_sign(BigInt::Positive);
57 t2.mask_bits(MP_WORD_BITS * (mod_words + 1));
58
59 t2 -= t1;
60
61 if(t2.is_negative())
62 {
63 BigInt b_to_k1(BigInt::Power2, MP_WORD_BITS * (mod_words + 1));
64 t2 += b_to_k1;
65 }
66
67 while(t2 >= modulus)
68 t2 -= modulus;
69
70 if(x.is_positive())
71 return t2;
72 else
73 return (modulus - t2);
74 }
75 else
76 {
77 // too big, fall back to normal division
78 return (x % modulus);
79 }
80 }
Invalid_State(const std::string &err)
Definition exceptn.h:27

References Botan::BigInt::cmp(), Botan::Invalid_State::Invalid_State(), Botan::BigInt::is_negative(), Botan::BigInt::is_positive(), Botan::BigInt::mask_bits(), Botan::MP_WORD_BITS, Botan::BigInt::Positive, Botan::BigInt::Power2, and Botan::BigInt::set_sign().

Referenced by multiply(), and square().

◆ square()

BigInt Botan::Modular_Reducer::square ( const BigInt & x) const
inline

Square mod p

Parameters
x
Returns
(x * x) % p

Definition at line 39 of file reducer.h.

40 { return reduce(Botan::square(x)); }

References reduce(), and Botan::square().

Referenced by cube(), and Botan::ressol().


The documentation for this class was generated from the following files: