MCPcopy Create free account
hub / github.com/Tripwire/tripwire-open-source / RecursiveSquare

Function RecursiveSquare

src/cryptlib/integer.cpp:518–545  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

516// A[N] --- number to be squared
517
518void RecursiveSquare(word *R, word *T, const word *A, unsigned int N)
519{
520 assert(N && N%2==0);
521
522 if (N==2)
523 AtomicSquare(R, A[0], A[1]);
524 else if (N==4)
525 {
526 AtomicSquare(R, A[0], A[1]);
527 AtomicSquare(R+4, A[2], A[3]);
528 AtomicMultiply(T, A[0], A[1], A[2], A[3]);
529 word carry = Add(R+2, R+2, T, 4);
530 carry += Add(R+2, R+2, T, 4);
531 Increment(R+6, 2, carry);
532 }
533 else
534 {
535 const unsigned int N2 = N/2;
536
537 RecursiveSquare(R0, T2, A0, N2);
538 RecursiveSquare(R2, T2, A1, N2);
539 RecursiveMultiply(T0, T2, A0, A1, N2);
540
541 word carry = Add(R1, R1, T0, N);
542 carry += Add(R1, R1, T0, N);
543 Increment(R3, N2, carry);
544 }
545}
546
547// R[N] - bottom half of A*B
548// T[N] - temporary work space

Callers 2

AsymmetricMultiplyFunction · 0.85
SquareMethod · 0.85

Calls 4

AtomicSquareFunction · 0.85
AtomicMultiplyFunction · 0.85
IncrementFunction · 0.85
RecursiveMultiplyFunction · 0.85

Tested by

no test coverage detected