# 2025q1 Homework4 (quiz3+4) > contributed by < `Denny0097` > ## 2025q1 第 3 週測驗題 ### Q1 觀察以下 code 及敘述: ```c /* ceiling division without needing floating-point operations. */ static size_t ceil_div(size_t n, size_t d) { return AAAA; } ``` 並根據 function call : ```c void mpi_set_u64(mpi_t rop, uint64_t op) { size_t capacity = ceil_div(64, 31); //... ``` 可得 n > d,n 應為被除數,讓計算直接得 ceiling ,可得`AAAA= (n+d-1)/d` ```c #define INTMAX BBBB ``` `BBBB = int最大值 = 2^31-1 = 2147483647 = 0x7fffffff` ```c // ... for (size_t n = 0; n < op1->capacity; ++n) { for (size_t m = 0; m < op2->capacity; ++m) { uint64_t r = (uint64_t) op1->data[n] * op2->data[m]; uint64_t c = 0; for (size_t k = CCCC; c || r; ++k) { if (k >= tmp->capacity) mpi_enlarge(tmp, tmp->capacity + 1); tmp->data[k] += (r & INTMAX) + c; r >>= 31; c = tmp->data[k] >> 31; tmp->data[k] &= INTMAX; } } } ``` k為積在 op1 第n位與 op2 第m位相乘的 bit 位 : `CCCC = k = n + m` ```c // ... for (size_t i = start; i != (size_t) -1; --i) { mpi_mul_2exp(r, r, DDDD); if (mpi_testbit(n0, i) != 0) mpi_setbit(r, 0); if (mpi_cmp(r, d0) >= 0) { mpi_sub(r, r, d0); mpi_setbit(q, i); } } ``` 根據function名稱判斷,應是用做r = r * 2^DDDD,因為除法做位移後相減,所以使DDDD=1來完成每回合一位的位移。 ```DDDD = 1``` 根據GCD的輾轉相除以及code判斷: ```c void mpi_gcd(rop, op1, op2) { // To make sure op2 is not zero // div then get q, r // Ans : recursion -> mpi_gcd(rop, op2, r) // ... } ``` ```EEEE = mpi_gcd(rop,op2,r)``` ### Q2 ## 2025q1 第 4 週測驗題 ## Reference - [2025q1 第 3 週測驗題](https://hackmd.io/@sysprog/linux2025-quiz3) - [2025q1 第 4 週測驗題](https://hackmd.io/@sysprog/linux2025-quiz4)