2018年11月21日 星期三

安裝大數運算程式庫 GMP

1. 下載程式庫:
      https://gmplib.org/download/gmp/gmp-6.1.2.tar.lz
2. 安裝解壓縮程式:
     sudo apt-get install lzip
3. 解壓縮:
    tar --lzip -xvf gmp-6.1.2.tar.lz
4. 進入程式庫目錄編譯程式, 並安裝到 linux 系統:
     cd gmp-6.1.2
     ./configure
     make
     sudo make install
     # make check
     備註: 如果編譯時出現錯誤訊息: : No usable M4 in $PATH , 需要事先安裝巨集 m4:
               sudo apt-get install m4
5. 寫一個測試程式:
     // testgmp.c
    #include "gmp.h"
    #include "stdio.h"
    int main(){
           mpz_t t;           // t 是一個容器, 宣告成整數, 使用 mpz_ 的函式運算
           mpz_init(t);     // 初始化 t
           mpz_set_str(t, "123ABCF", 16); // 讓 t = 16 進制整數字串 123ABCF
           gmp_printf("t = % Zx\n", t);// 輸出 16 進制整數字串
           mpz_clear(t);// 釋放 t 的空間
     }
6. 編譯並執行:
     gcc testgmp.c -lgmp && ./a.out
7. 整數運算 mpz, 宣告資料型態 mpz_t , 參考: https://gmplib.org/manual/Integer-Functions.html#Integer-Functions
      + 加法 mpz_add(t, op1, op2) 答案 t, 被加數 op1 , 加數 op2, t = op1 + op2
      - 減法 mpz_sub(t, op1, op2)  答案 t, 被減數 op1 , 減數 op2, t = op1 - op2
      * 乘法 mpz_mul(t, op1, op2) 答案 t, 被乘數 op1 , 乘數 op2, t = op1 * op2     
      / 除法 mpz_cdiv_qr(q, r, t, divider)  商數 q, 餘數 r, 被除數 t, 除數 divider
      / 除法  mpz_cdiv_qr(q, t, divider) 商數 q, 被除數 t, 除數 divider,  q = t / divider
      / 除法 mpz_cdiv_r(r, t, divider) 餘數 r, 被除數 t, 除數 divider, r = t %  divider
      % 餘數 mpz_mod(r, t, divider) 餘數 r, 被除數 t, 除數 divider, r = t %  divider
     除法運算時,針對商及餘數包含小數時, 處理成整數的方式有好幾種方式, 其中 cdiv 前置 c 是 ceil , 而 fdiv 的 f 是 floor, tdiv 的 t 則是 truncate 的意思:
             ceil : 大於的(up towards)最接近整數, 例如 ceil(1.2) = 2, ceil(-1.2) = -1
             floor: 小於的(down towards)最接近整數, 例如 floor(1.2) = 1, floor(-1.2) = -2
             truncate: 無條件捨去成為 0, truncate(1.2) = 1, truncate(-1.2) = -1            
8. 分數運算 mpq, 資料型態 mpq_t , 參考: https://gmplib.org/manual/Rational-Number-Functions.html#Rational-Number-Functions
9. 浮點運算 mpf, 資料型態 mpf_t, 參考: https://gmplib.org/manual/Floating_002dpoint-Functions.html#Floating_002dpoint-Functions

沒有留言: