anchor.diff:    MultiplyKaratsuba(x[1] - x[0], y[0] - y[1], z1);
     Add(z1, z2 + z0, z1);
   
  -  Result := z0;
  -  Result.AddWithOffset(z2, k * 2);
  -  Result.AddWithOffset(z1, k);
  -
  +  Shift := k * CLimbBits;
  +
  +  Result := z0 + ((z1 + z2 shl Shift) shl Shift);
     Result.FSize := (Result.FSize and SizeMask) or LSign;
   end;
   
  
positive.code: 
    // Step 9: c0 <- v0, c1 <- v1 - t1, c2 <- t2 - v0 - vinf, c3 <- t1 - t2, c4 <- vinf
    Shift := k * CLimbBits;
    // Note: The next line is slightly faster than AddWithOffset, but, more importantly,
    //       it produces the correct result, while AddWithOffset doesn't always do that (at least in Win32).
    Result := (((((((vinf shl Shift) + t1 - t2) shl Shift) + t2 - v0 - vinf) shl Shift) + v1 - t1) shl Shift) + v0;
  
    Result.FSize := (Result.FSize and SizeMask) or Sign;
  end;
  
  
negative.code:     class procedure DivTwoDigitsByOne(const Left, Right: BigInteger; N: Integer;
        var Quotient, Remainder: BigInteger); static;
  
      // Karatsuba and Toom-Cook helper function
      // Split BigInteger into smaller BigIntegers of size BlockSize.
      function Split(BlockSize, BlockCount: Integer): TArray<BigInteger>;
  
  