Tag: gmp

肢体在任意精度整数的词汇表中?

“肢体”在任意精度整数的域中指的是什么?

将ull转换为mpz_t

我看到问题mpz_t的post到无符号长时间转换(gmp lib)和Chris Jester-Young给了我答案 mpz_t ull2mpz(unsigned long long ull) { char buf[40]; int len; mpz_t result; len = snprintf(buf, sizeof buf, “%llx”); if (len >= sizeof buf) { /* oops */ } mpz_init(result); len = gmp_sscanf(buf, “%Zx”, result); if (len != 1) { /* oops */ } return result; } 这里的问题是, 如何将GMP C参数约定转换为更自然的东西? mpz_t是一个数组。 我怎样才能避免这种情况(不做那么奇怪的事情,只返回一个值)? 如果我写的话 […]

GMP上的精度损失mpf_add。 我的数字去了哪里?

我总结了两个负浮点数: char * lhs = “-2234.6016114467412141”; char * rhs = “-4939600281397002.2812”; 根据Perl,使用bignum和Math :: BigFloat,答案是 -4939600281399236.8828114467412141 但是,根据GMP,使用下面的代码,答案是 -4939600281399236.88281 我哪里出错了? 剩下的“14467412141”怎么了? #include “stdafx.h” #include “gmp-static\gmp.h” #include /* For _MAX_PATH definition */ #include #include #include #define F(x) mpf_t x; mpf_init( x ); void main(void) { F(f_lhs); F(f_rhs); F(f_res); char * resbuff; mp_exp_t exp; char * lhs = “-2234.6016114467412141”; […]

如何将GMP C参数约定转换为更自然的东西?

例如,我想做这样的事情: #include typedef mpz_t Integer; // Integer F(Integer a,Integer b,Integer c,Integer d) { Integer ret = times(plus(a,b),plus(c,d)); } 但是,GMP不允许我这样做,显然mpz_t是一个数组,所以我得到错误: error: ‘F’ declared as function returning an array 所以相反,我必须做这样的事情: void F(Integer ret,Integer a,Integer b,Integer c,Integer d) { Integer tmp1,tmp2; plus(tmp1,a,b); plus(tmp2,c,d); times(ret,tmp1,tmp2); } 这是不自然的,并不遵循可以组成C(或一般数学)表达式的逻辑方式。 事实上,你不能用数学方式编写任何东西,因为显然你不能返回GMP数字! 如果我想编写 – 例如 – 一个简单的yacc / bison样式解析器,使用+, – ,/,*等将简单语法转换为使用GMP实现给定表达式的C代码,它似乎会变得更加困难,因为我必须跟踪所有中间值。 那么,我怎样才能强迫GMP屈服于我的意愿并接受更合理的语法? 我可以安全地“欺骗”并将mpz_t转换为void […]

避免在libgmp中中止

我有一些使用libgmp的代码。 在某些时候,用户可以请求非常大数量的阶乘。 不幸的是,这导致libgmp引发中止信号。 例如,以下代码: #include #include #include int main() { mpz_t result; mpz_init(result); mpz_fac_ui(result, 20922789888000); std::cout << mpz_get_si(result) << std::endl; } 结果是: $ ./test gmp: overflow in mpz type Aborted 显然,产生的数字非常大。 无论如何,还是比中止更优雅地处理错误。 这是一个基于GUI的应用程序,它中止是处理此类问题的最不可取的方法。

GMP mpz_array_init是一个过时的函数 – 我们应该如何初始化mpz数组?

我只使用了几次GNU MP Bignum库 ,我有兴趣看到我以前分配/启动数组的方式现在已经过时了。 从整数特殊function : 5.16特殊function 本节中的function用于各种特殊目的。 大多数应用程序不需要它们。 – function:void mpz_array_init(mpz_t integer_array,mp_size_t array_size,mp_size_t fixed_num_bits) This is an obsolete function. Do not use it. 这就是我分配和初始化mpz_t数组的mpz_t 。 int array_size = 100; mpz_t *num_arr; num_arr = malloc(arr_size * sizeof(mpz_t)); mpz_array_init(*num_arr, array_size, 1024); 这仍然可以没有和错误或警告,顺便说一句,但现在这个function被列为过时,在C中使用GMP分配数组的正确方法是什么?

关于typedef中单实例数组的一些问题

我正在使用GNU Multi-Precision(GMP)库代码使用任意长度的整数来阅读一些代码。 MP整数的类型是mpz_t如gmp.h头文件中所定义。 但是,我对这个库定义的mpz_t类型的低级定义有一些疑问。 在标题代码中: /* THIS IS FROM THE GNU MP LIBRARY gmp.h HEADER FILE */ typedef struct { /* SOME OTHER STUFF HERE */ } __mpz_struct; typedef __mpz_struct mpz_t[1]; 第一个问题: [1]是否与__mpz_struct相关联? 换句话说, typedef是将mpz_t类型定义为__mpz_struct数组,只出现一次? 第二个问题:为什么arrays? (为什么只出现一次?)这是我听说过的结构黑客之一吗? 第三个问题(可能与第二个问题间接相关): mpz_init_set(mpz_t, unsigned long int)函数的GMP文档说只使用它作为pass-by-value,尽管可以假设这个函数会修改其内容被调用的函数(因此需要pass-by-reference)语法。 参考我的代码: /* FROM MY CODE */ mpz_t fact_val; /* declaration */ mpz_init_set_ui(fact_val, 1); […]

如何用字符串中的1024位数字初始化gmp中的mpz_t?

我想在gmp中初始化一个mpz_t变量,其值非常大,如1024位大整数。 我怎么能这样做? 我是gmp的新手。 任何帮助,将不胜感激。

如何序列化GMP mpf类型?

似乎GMP只提供了mpf(浮点)类型的字符串序列化: mpf_get_str() , mpf_class::get_str() mpz(整数)类型具有原始字节的附加接口: mpz_out_raw() http://gmplib.org/manual/Function-Index.html 我错过了什么吗? 有谁知道可以序列化GMP浮标的另一个库? 有谁知道另一个提供强大序列化的bignum lib? 编辑:我很高兴序列化MPFR的mpfr_t,同样似乎只提供字符串输出: http ://www.mpfr.org/mpfr-current/mpfr.html#Function-Index

你如何写一个bigint库/ libgmp是如何工作的?

我知道在各种平台上有很多针对C的BigInt库以及如何使用它们但我很感兴趣:它们是如何工作的? 我将如何建立自己的图书馆(我不会尝试,没有必要重新发明轮子,但我对它会如何发生感兴趣)? 任何人都可以指向我可能解释程序/基础知识的教程等吗? 谢谢, Ninefingers。