From ddf108aa3ee735a0c48abd6658211ee4ab156a5f Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Tue, 31 Oct 2023 13:41:53 +0800 Subject: [PATCH] upd: ready to fix reverse * --- include/int2048.h | 2 +- src/int2048.cpp | 36 ++++++++++++++++++------------------ tester/cases/1.py | 2 +- tester/cases/2.py | 4 ++-- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/include/int2048.h b/include/int2048.h index b247e9d..402e249 100644 --- a/include/int2048.h +++ b/include/int2048.h @@ -39,7 +39,7 @@ root= 6 const static __int128_t kNTTMod = 180143985094819841ll; const static __int128_t kNTTRoot = 6; const static int kNTTBlockNum = 4; - const static int kNTTBlcokBase = 10000; + const static int kNTTBlockBase = 10000; size_t buf_length = 0; int *val = nullptr; diff --git a/src/int2048.cpp b/src/int2048.cpp index ee06e0f..f2b1a42 100644 --- a/src/int2048.cpp +++ b/src/int2048.cpp @@ -269,10 +269,11 @@ inline void UnsignedMinus(int2048 &A, const int2048 *const pB, bool inverse) { int blocks_A = (A.num_length + int2048::kNum - 1) / int2048::kNum; int blocks_B = (pB->num_length + int2048::kNum - 1) / int2048::kNum; if (blocks_A < blocks_B) A.ClaimMem(blocks_A * int2048::kNum); + blocks_A = (A.num_length + int2048::kNum - 1) / int2048::kNum; for (int i = (pB->num_length + int2048::kNum - 1) / int2048::kNum - 1; i >= 0; i--) { - A.val[i] -= pB->val[i]; - if (A.val[i] < 0 && i - 1 >= 0) { + if (i < blocks_B && i < blocks_A) A.val[i] -= pB->val[i]; + if (i < blocks_A && A.val[i] < 0 && i - 1 >= 0) { A.val[i] += int2048::kMod; A.val[i - 1]--; } @@ -434,12 +435,12 @@ inline void UnsignedMultiply(int2048 &A, const int2048 *pB, __int128_t *pDB = new __int128_t[NTT_blocks](); __int128_t *pDC = new __int128_t[NTT_blocks](); for (int i = 0; i < blocks_of_A; i++) { - pDA[i << 1] = A.val[i] % int2048::kNTTBlcokBase; - pDA[(i << 1) | 1] = A.val[i] / int2048::kNTTBlcokBase; + pDA[i << 1] = A.val[i] % int2048::kNTTBlockBase; + pDA[(i << 1) | 1] = A.val[i] / int2048::kNTTBlockBase; } for (int i = 0; i < blocks_of_B; i++) { - pDB[i << 1] = pB->val[i] % int2048::kNTTBlcokBase; - pDB[(i << 1) | 1] = pB->val[i] / int2048::kNTTBlcokBase; + pDB[i << 1] = pB->val[i] % int2048::kNTTBlockBase; + pDB[(i << 1) | 1] = pB->val[i] / int2048::kNTTBlockBase; } A.NTTTransform(pDA, NTT_blocks); A.NTTTransform(pDB, NTT_blocks); @@ -448,24 +449,24 @@ inline void UnsignedMultiply(int2048 &A, const int2048 *pB, A.NTTTransform(pDC, NTT_blocks, true); if (!inverse) { for (int i = 0; i < NTT_blocks - 1; i++) { - pDC[i + 1] += pDC[i] / int2048::kNTTBlcokBase; - pDC[i] %= int2048::kNTTBlcokBase; + pDC[i + 1] += pDC[i] / int2048::kNTTBlockBase; + pDC[i] %= int2048::kNTTBlockBase; } - if (pDC[NTT_blocks - 1] >= int2048::kNTTBlcokBase) + if (pDC[NTT_blocks - 1] >= int2048::kNTTBlockBase) throw "UnsignedMultiply: NTT result overflow"; } else { for (int i = NTT_blocks - 1; i > 0; i--) { - if (i - 1 >= 0) pDC[i - 1] += pDC[i] / int2048::kNTTBlcokBase; - pDC[i] %= int2048::kNTTBlcokBase; + if (i - 1 >= 0) pDC[i - 1] += pDC[i] / int2048::kNTTBlockBase; + pDC[i] %= int2048::kNTTBlockBase; } - if (pDC[0] >= int2048::kNTTBlcokBase) + if (pDC[0] >= int2048::kNTTBlockBase) throw "UnsignedMultiply: NTT result overflow"; } int flag_store = A.flag; A.ClaimMem(NTT_blocks * 4); memset(A.val, 0, A.buf_length * sizeof(int)); for (int i = 0; i < NTT_blocks / 2; i++) { - A.val[i] = pDC[(i << 1) | 1] * int2048::kNTTBlcokBase + pDC[i << 1]; + A.val[i] = pDC[(i << 1) | 1] * int2048::kNTTBlockBase + pDC[i << 1]; } A.num_length = NTT_blocks * 4; const static int kPow10[9] = {1, 10, 100, 1000, 10000, @@ -609,14 +610,13 @@ inline void UnsignedDivide(int2048 &A, const int2048 *pB) { } } if (pre_pre_same || pre_same) break; - memcpy(store[tot ^ 1], store[tot], (pow_A + 3) * sizeof(int)); + tot ^= 1; for (int i = 0; i < pow_A + 3; i++) { if (i < blocks_of_x) store[tot][i] = x.val[i]; else store[tot][i] = 0; } - tot ^= 1; } delete[] store[0]; delete[] store[1]; @@ -639,15 +639,15 @@ inline void UnsignedDivide(int2048 &A, const int2048 *pB) { UnsignedMultiply(A, &x); A.RightMoveBy((pow_B + pow_x) * int2048::kNum); /*Now we begin to process error*/ - int2048 tmp(*pB),kOne(1); + int2048 tmp(*pB), kOne(1); UnsignedMultiply(tmp, &A); while (UnsignedCmp(origin_A, tmp) < 0) { - UnsignedMinus(A,&kOne); + UnsignedMinus(A, &kOne); UnsignedMinus(tmp, pB); } UnsignedMinus(origin_A, &tmp); while (UnsignedCmp(origin_A, *pB) >= 0) { - UnsignedAdd(A,&kOne); + UnsignedAdd(A, &kOne); UnsignedMinus(origin_A, pB); } } diff --git a/tester/cases/1.py b/tester/cases/1.py index 5116f91..35973e8 100755 --- a/tester/cases/1.py +++ b/tester/cases/1.py @@ -74,7 +74,7 @@ for opt in opt_cpp: print(opt,file=sourc_cpp) print(code_cpp_suf,file=sourc_cpp) sourc_cpp.close() -system("g++ /tmp/1.cpp -I /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/include/ -L /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/build/src/ -lint2048 -o /tmp/1") +system("g++ /tmp/1.cpp -I /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/include/ -L /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/build/src/ -lint2048 -fsanitize=address -g -o /tmp/1") system("/tmp/1 > /tmp/1_cpp.out") sourc_python=open("/tmp/1.py","w") diff --git a/tester/cases/2.py b/tester/cases/2.py index dbc07dd..3889b2f 100755 --- a/tester/cases/2.py +++ b/tester/cases/2.py @@ -36,7 +36,7 @@ opt_python=[] if True: for i in range(0,10): - val=randint(-10**2,10**2) + val=randint(-10**200,10**200) opt_cpp.append("a_"+str(i)+"=int2048(\""+str(val)+"\");") opt_python.append("a_"+str(i)+"="+str(val)) opt_cpp.append("a_"+str(i)+".print(); puts(\"\");") @@ -80,7 +80,7 @@ for opt in opt_cpp: print(opt,file=sourc_cpp) print(code_cpp_suf,file=sourc_cpp) sourc_cpp.close() -system("g++ /tmp/2.cpp -I /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/include/ -L /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/build/src/ -lint2048 -g -o /tmp/2") +system("g++ /tmp/2.cpp -I /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/include/ -L /home/happyzym/CSWorkSpace/Proc/BigHomework/BH-int2048-2023/build/src/ -lint2048 -fsanitize=address -g -o /tmp/2") system("/tmp/2 > /tmp/2_cpp.out") sourc_python=open("/tmp/2.py","w")