一個開源的高精度運算庫——gmp
來源:互聯網
上載者:User
全稱是GNU Multiple Precision Arithmetic Library,即GNU高精度算術運算庫,官方網站是:http://gmplib.org/
它的功能非常強大,介面很簡單,文檔詳盡,有C風格的介面也有C++的精心封裝後的介面,其中不但有普通的整數、實數、浮點數的高精度運算,還有隨機數產生,尤其是提供了非常完備的數論中的運算介面,比如Miller-Rabin素數測試演算法,大素數產生,歐幾裡德演算法,求域中元素的逆,Jacobi符號,legendre符號等。
它本身提供了很多例子程式,學習過程非常快,很容易將它們整合到自己的代碼中去。
下面是最近做一個密碼編譯演算法的時候使用gmp提供的大素數產生的一段程式,功能是找到給定數量的不小於2^127的素數,其邏輯就像列印一個字串那樣簡單:
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
int main(int argc, char **argv) {
mpz_t begin, m1, m2;
int count;
/* set begin to 2^127 */
mpz_init_set_str(begin, "170141183460469231731687303715884105728", 0);
count = (argc==1)?10:atoi(argv[1]);
while(count--) {
mpz_nextprime(begin, begin);
gmp_printf("%Zd/n", begin);
}
mpz_clear(begin);
return 0;
}
產生的素數如下:
170141183460469231731687303715884105757
170141183460469231731687303715884105773
170141183460469231731687303715884105793
170141183460469231731687303715884105829
170141183460469231731687303715884105851
170141183460469231731687303715884105979
170141183460469231731687303715884106001
170141183460469231731687303715884106031
170141183460469231731687303715884106123
170141183460469231731687303715884106207
170141183460469231731687303715884106213
170141183460469231731687303715884106231
170141183460469231731687303715884106273
170141183460469231731687303715884106303
170141183460469231731687303715884106309