MCPcopy Create free account
hub / github.com/c3d/tao3D / RecursiveMultiply

Function RecursiveMultiply

libcryptopp/cryptopp/integer.cpp:2059–2095  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2057// B[N] --- multiplicant
2058
2059void RecursiveMultiply(word *R, word *T, const word *A, const word *B, size_t N)
2060{
2061 assert(N>=2 && N%2==0);
2062
2063 if (N <= s_recursionLimit)
2064 s_pMul[N/4](R, A, B);
2065 else
2066 {
2067 const size_t N2 = N/2;
2068
2069 size_t AN2 = Compare(A0, A1, N2) > 0 ? 0 : N2;
2070 Subtract(R0, A + AN2, A + (N2 ^ AN2), N2);
2071
2072 size_t BN2 = Compare(B0, B1, N2) > 0 ? 0 : N2;
2073 Subtract(R1, B + BN2, B + (N2 ^ BN2), N2);
2074
2075 RecursiveMultiply(R2, T2, A1, B1, N2);
2076 RecursiveMultiply(T0, T2, R0, R1, N2);
2077 RecursiveMultiply(R0, T2, A0, B0, N2);
2078
2079 // now T[01] holds (A1-A0)*(B0-B1), R[01] holds A0*B0, R[23] holds A1*B1
2080
2081 int c2 = Add(R2, R2, R1, N2);
2082 int c3 = c2;
2083 c2 += Add(R1, R2, R0, N2);
2084 c3 += Add(R2, R2, R3, N2);
2085
2086 if (AN2 == BN2)
2087 c3 -= Subtract(R1, R1, T0, N);
2088 else
2089 c3 += Add(R1, R1, T0, N);
2090
2091 c3 += Increment(R2, N2, c2);
2092 assert (c3 >= 0 && c3 <= 2);
2093 Increment(R3, N2, c3);
2094 }
2095}
2096
2097// R[2*N] - result = A*A
2098// T[2*N] - temporary work space

Callers 4

RecursiveSquareFunction · 0.85
RecursiveMultiplyBottomFunction · 0.85
MultiplyTopFunction · 0.85
MultiplyFunction · 0.85

Calls 4

CompareFunction · 0.85
SubtractFunction · 0.85
AddFunction · 0.85
IncrementFunction · 0.85

Tested by

no test coverage detected