diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 78cb5b2..3aea297 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -1,6 +1,6 @@ set(PROJECT_NAME ${CMAKE_PROJECT_NAME}) set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_FLAGS "-g") +set(CMAKE_CXX_FLAGS "-O2") set(ENV{MAKEFLAGS} "-j16") include_directories(${PROJECT_SOURCE_DIR}/include) link_directories(${PROJECT_SOURCE_DIR}/src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ef0718e..accb036 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,5 @@ set(PROJECT_NAME ${CMAKE_PROJECT_NAME}) set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_FLAGS "-g") +set(CMAKE_CXX_FLAGS "-O2") include_directories(${PROJECT_SOURCE_DIR}/include) add_library(int2048 STATIC int2048.cpp) \ No newline at end of file diff --git a/src/int2048.cpp b/src/int2048.cpp index bfb93de..7a27762 100644 --- a/src/int2048.cpp +++ b/src/int2048.cpp @@ -506,8 +506,11 @@ inline void UnsignedMultiply(int2048 &A, const int2048 *pB, int blocks_of_A = ((A.num_length + int2048::kNum - 1) / int2048::kNum); int blocks_of_B = ((pB->num_length + int2048::kNum - 1) / int2048::kNum); if (inverse) { + assert(pB->num_length % int2048::kNum == 0); lenght_limit = std::min(lenght_limit, pB->num_length); - blocks_of_B = lenght_limit; + blocks_of_B = lenght_limit / int2048::kNum; + // assert(blocks_of_B == + // ((pB->num_length + int2048::kNum - 1) / int2048::kNum)); } int max_blocks = blocks_of_A + blocks_of_B; int NTT_blocks = 2; @@ -708,7 +711,8 @@ inline void UnsignedDivide(int2048 &A, const int2048 *pB) { } assert(tmp_x.num_length % int2048::kNum == 0); assert(inverse_B.num_length % int2048::kNum == 0); - UnsignedMultiply(tmp_x, &inverse_B, true, inverse_B.num_length); + UnsignedMultiply(tmp_x, &inverse_B, true, + tmp_x.num_length + 3 * int2048::kNum); for (int i = 0; i < tmp_x_error + inverseB_error; i++) tmp_x.RestoreHalfBlock(); UnsignedMinus(inverse_two, &tmp_x, true); @@ -721,7 +725,7 @@ inline void UnsignedDivide(int2048 &A, const int2048 *pB) { x_error = 1; x.ProcessHalfBlock(); } - UnsignedMultiply(x, &inverse_two, true); + UnsignedMultiply(x, &inverse_two, true, inverse_two.num_length); for (int i = 0; i < x_error + inverse_two_error; i++) x.RestoreHalfBlock(); /** * now x is the next x, store[tot] stores last x, store[tot^1] stores the x