upd: ready to fix reverse *

This commit is contained in:
2023-10-31 13:41:53 +08:00
parent f72f369b2a
commit ddf108aa3e
4 changed files with 22 additions and 22 deletions

View File

@ -39,7 +39,7 @@ root= 6
const static __int128_t kNTTMod = 180143985094819841ll; const static __int128_t kNTTMod = 180143985094819841ll;
const static __int128_t kNTTRoot = 6; const static __int128_t kNTTRoot = 6;
const static int kNTTBlockNum = 4; const static int kNTTBlockNum = 4;
const static int kNTTBlcokBase = 10000; const static int kNTTBlockBase = 10000;
size_t buf_length = 0; size_t buf_length = 0;
int *val = nullptr; int *val = nullptr;

View File

@ -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_A = (A.num_length + int2048::kNum - 1) / int2048::kNum;
int blocks_B = (pB->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); 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; for (int i = (pB->num_length + int2048::kNum - 1) / int2048::kNum - 1;
i >= 0; i--) { i >= 0; i--) {
A.val[i] -= pB->val[i]; if (i < blocks_B && i < blocks_A) A.val[i] -= pB->val[i];
if (A.val[i] < 0 && i - 1 >= 0) { if (i < blocks_A && A.val[i] < 0 && i - 1 >= 0) {
A.val[i] += int2048::kMod; A.val[i] += int2048::kMod;
A.val[i - 1]--; 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 *pDB = new __int128_t[NTT_blocks]();
__int128_t *pDC = new __int128_t[NTT_blocks](); __int128_t *pDC = new __int128_t[NTT_blocks]();
for (int i = 0; i < blocks_of_A; i++) { for (int i = 0; i < blocks_of_A; i++) {
pDA[i << 1] = A.val[i] % int2048::kNTTBlcokBase; pDA[i << 1] = A.val[i] % int2048::kNTTBlockBase;
pDA[(i << 1) | 1] = A.val[i] / int2048::kNTTBlcokBase; pDA[(i << 1) | 1] = A.val[i] / int2048::kNTTBlockBase;
} }
for (int i = 0; i < blocks_of_B; i++) { for (int i = 0; i < blocks_of_B; i++) {
pDB[i << 1] = pB->val[i] % int2048::kNTTBlcokBase; pDB[i << 1] = pB->val[i] % int2048::kNTTBlockBase;
pDB[(i << 1) | 1] = pB->val[i] / int2048::kNTTBlcokBase; pDB[(i << 1) | 1] = pB->val[i] / int2048::kNTTBlockBase;
} }
A.NTTTransform(pDA, NTT_blocks); A.NTTTransform(pDA, NTT_blocks);
A.NTTTransform(pDB, 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); A.NTTTransform(pDC, NTT_blocks, true);
if (!inverse) { if (!inverse) {
for (int i = 0; i < NTT_blocks - 1; i++) { for (int i = 0; i < NTT_blocks - 1; i++) {
pDC[i + 1] += pDC[i] / int2048::kNTTBlcokBase; pDC[i + 1] += pDC[i] / int2048::kNTTBlockBase;
pDC[i] %= int2048::kNTTBlcokBase; pDC[i] %= int2048::kNTTBlockBase;
} }
if (pDC[NTT_blocks - 1] >= int2048::kNTTBlcokBase) if (pDC[NTT_blocks - 1] >= int2048::kNTTBlockBase)
throw "UnsignedMultiply: NTT result overflow"; throw "UnsignedMultiply: NTT result overflow";
} else { } else {
for (int i = NTT_blocks - 1; i > 0; i--) { for (int i = NTT_blocks - 1; i > 0; i--) {
if (i - 1 >= 0) pDC[i - 1] += pDC[i] / int2048::kNTTBlcokBase; if (i - 1 >= 0) pDC[i - 1] += pDC[i] / int2048::kNTTBlockBase;
pDC[i] %= int2048::kNTTBlcokBase; pDC[i] %= int2048::kNTTBlockBase;
} }
if (pDC[0] >= int2048::kNTTBlcokBase) if (pDC[0] >= int2048::kNTTBlockBase)
throw "UnsignedMultiply: NTT result overflow"; throw "UnsignedMultiply: NTT result overflow";
} }
int flag_store = A.flag; int flag_store = A.flag;
A.ClaimMem(NTT_blocks * 4); A.ClaimMem(NTT_blocks * 4);
memset(A.val, 0, A.buf_length * sizeof(int)); memset(A.val, 0, A.buf_length * sizeof(int));
for (int i = 0; i < NTT_blocks / 2; i++) { 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; A.num_length = NTT_blocks * 4;
const static int kPow10[9] = {1, 10, 100, 1000, 10000, 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; 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++) { for (int i = 0; i < pow_A + 3; i++) {
if (i < blocks_of_x) if (i < blocks_of_x)
store[tot][i] = x.val[i]; store[tot][i] = x.val[i];
else else
store[tot][i] = 0; store[tot][i] = 0;
} }
tot ^= 1;
} }
delete[] store[0]; delete[] store[0];
delete[] store[1]; delete[] store[1];
@ -639,15 +639,15 @@ inline void UnsignedDivide(int2048 &A, const int2048 *pB) {
UnsignedMultiply(A, &x); UnsignedMultiply(A, &x);
A.RightMoveBy((pow_B + pow_x) * int2048::kNum); A.RightMoveBy((pow_B + pow_x) * int2048::kNum);
/*Now we begin to process error*/ /*Now we begin to process error*/
int2048 tmp(*pB),kOne(1); int2048 tmp(*pB), kOne(1);
UnsignedMultiply(tmp, &A); UnsignedMultiply(tmp, &A);
while (UnsignedCmp(origin_A, tmp) < 0) { while (UnsignedCmp(origin_A, tmp) < 0) {
UnsignedMinus(A,&kOne); UnsignedMinus(A, &kOne);
UnsignedMinus(tmp, pB); UnsignedMinus(tmp, pB);
} }
UnsignedMinus(origin_A, &tmp); UnsignedMinus(origin_A, &tmp);
while (UnsignedCmp(origin_A, *pB) >= 0) { while (UnsignedCmp(origin_A, *pB) >= 0) {
UnsignedAdd(A,&kOne); UnsignedAdd(A, &kOne);
UnsignedMinus(origin_A, pB); UnsignedMinus(origin_A, pB);
} }
} }

View File

@ -74,7 +74,7 @@ for opt in opt_cpp:
print(opt,file=sourc_cpp) print(opt,file=sourc_cpp)
print(code_cpp_suf,file=sourc_cpp) print(code_cpp_suf,file=sourc_cpp)
sourc_cpp.close() 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") system("/tmp/1 > /tmp/1_cpp.out")
sourc_python=open("/tmp/1.py","w") sourc_python=open("/tmp/1.py","w")

View File

@ -36,7 +36,7 @@ opt_python=[]
if True: if True:
for i in range(0,10): 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_cpp.append("a_"+str(i)+"=int2048(\""+str(val)+"\");")
opt_python.append("a_"+str(i)+"="+str(val)) opt_python.append("a_"+str(i)+"="+str(val))
opt_cpp.append("a_"+str(i)+".print(); puts(\"\");") opt_cpp.append("a_"+str(i)+".print(); puts(\"\");")
@ -80,7 +80,7 @@ for opt in opt_cpp:
print(opt,file=sourc_cpp) print(opt,file=sourc_cpp)
print(code_cpp_suf,file=sourc_cpp) print(code_cpp_suf,file=sourc_cpp)
sourc_cpp.close() 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") system("/tmp/2 > /tmp/2_cpp.out")
sourc_python=open("/tmp/2.py","w") sourc_python=open("/tmp/2.py","w")