| 2114 | } |
| 2115 | |
| 2116 | Integer Integer::InverseMod(const Integer &m) const |
| 2117 | { |
| 2118 | assert(m.NotNegative()); |
| 2119 | |
| 2120 | if (IsNegative() || *this>=m) |
| 2121 | return (*this%m).InverseMod(m); |
| 2122 | |
| 2123 | if (m.IsEven()) |
| 2124 | { |
| 2125 | if (!m || IsEven()) |
| 2126 | return Zero(); // no inverse |
| 2127 | if (*this == One()) |
| 2128 | return One(); |
| 2129 | |
| 2130 | Integer u = m.InverseMod(*this); |
| 2131 | return !u ? Zero() : (m*(*this-u)+1)/(*this); |
| 2132 | } |
| 2133 | |
| 2134 | SecBlock<word> T(m.reg.size * 4); |
| 2135 | Integer r((word)0, m.reg.size); |
| 2136 | unsigned k = AlmostInverse(r.reg, T, reg, reg.size, m.reg, m.reg.size); |
| 2137 | DivideByPower2Mod(r.reg, r.reg, k, m.reg, m.reg.size); |
| 2138 | return r; |
| 2139 | } |
| 2140 | |
| 2141 | // ******************************************************** |
| 2142 |
no test coverage detected