| 2282 | // A[N] ----- an odd number as input |
| 2283 | |
| 2284 | void RecursiveInverseModPower2(word *R, word *T, const word *A, size_t N) |
| 2285 | { |
| 2286 | if (N==2) |
| 2287 | { |
| 2288 | T[0] = AtomicInverseModPower2(A[0]); |
| 2289 | T[1] = 0; |
| 2290 | s_pBot[0](T+2, T, A); |
| 2291 | TwosComplement(T+2, 2); |
| 2292 | Increment(T+2, 2, 2); |
| 2293 | s_pBot[0](R, T, T+2); |
| 2294 | } |
| 2295 | else |
| 2296 | { |
| 2297 | const size_t N2 = N/2; |
| 2298 | RecursiveInverseModPower2(R0, T0, A0, N2); |
| 2299 | T0[0] = 1; |
| 2300 | SetWords(T0+1, 0, N2-1); |
| 2301 | MultiplyTop(R1, T1, T0, R0, A0, N2); |
| 2302 | MultiplyBottom(T0, T1, R0, A1, N2); |
| 2303 | Add(T0, R1, T0, N2); |
| 2304 | TwosComplement(T0, N2); |
| 2305 | MultiplyBottom(R1, T1, R0, T0, N2); |
| 2306 | } |
| 2307 | } |
| 2308 | |
| 2309 | // R[N] --- result = X/(2**(WORD_BITS*N)) mod M |
| 2310 | // T[3*N] - temporary work space |
no test coverage detected