我正在使用GMP来计算非常大的因子(例如234234!).在进行计算之前,有没有什么方法可以知道结果将会(或可能)长多少位数?
如何知道 GMP 中声明的变量的大小?或者我们如何确定 GMP 中整数的大小?
mpz_random(temp,1);
Run Code Online (Sandbox Code Playgroud)
在手册中,给出这个函数将1limb(=我的comp的32位)大小分配给“temp”....但它只有9位数字..所以我不认为32位大小的数字只包含9位数字数字..
所以请帮我知道 GMP 中整数变量的大小..
谢谢在副词..
哪个工具最适合用于访问大比特数以测试加密系统..无论是GMP库还是JAVA大整数.. ?? 在速度,记忆,功能,对crptosystems的灵活性(数学函数,如反转,pwm..etc)方面.
我在Windows上使用MPIR 2.4.0(MSVC 2010),我试图将无符号的64位整数添加到mpz_t数字.但是,似乎MPIR/GMP不支持64位整数和mpz_t之间的直接转换.这是否意味着我必须将我的uint64转换为字符串并通过mpz_init_set_str读取?这既不是很有吸引力,也不是很快 - 两次转换都没有.
我错过了什么或者在这里使用的技巧/黑客是什么?
干杯,
菲利普
我刚刚从Sourceforge 的官方项目页面安装了一个全新的mingw(32位)副本.我在包中安装了所有内容,所有编译器等等.然后我从这里下载gmp for MinGW.我将gmp-5.0.1-1-mingw32-src.tar.lzma提取到我的mingw文件夹中,然后./pkgbuild从那里运行.它继续运行几分钟,然后打印出类似的东西COMPLETED EVERYTHING OK, EVERYTHING PASS.
然后我写下这个简单的例子,检查它是否会起作用:
#include <gmpxx.h>
int main (void)
{
mpz_class a, b, c;
a = 1234;
b = "-5678";
c = a+b;
cout << "sum is " << c << "\n";
cout << "absolute value is " << abs(c) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后使用编译它g++ mycxxprog.cc -lgmpxx -lgmp.我得到的唯一答案是:
Fatal error: gmpxx.h: No such file or directory.
Run Code Online (Sandbox Code Playgroud)
有人有任何暗示吗?我真的不知道该怎么办......
我正在尝试在 Mac OS X 10.5 (Leopard) 服务器上构建GnuTLS(是的,我知道,它有点过时,但这就是该服务器目前正在运行的),并且在构建Nettle时遇到了问题:我已经构建并安装了GMP,但 Nettleconfigure找不到它。
我按如下方式构建并安装了 GMP 5.0.2(GCC 版本解决方案来自此处):
curl -O ftp://ftp.gmplib.org/pub/gmp-5.0.2/gmp-5.0.2.tar.bz2
tar xjf gmp-5.0.2.tar.bz2
pushd gmp-5.0.2
CC=gcc-4.2 CXX=g++4.2 ./configure --prefix=/usr/local
make
sudo make install
popd
Run Code Online (Sandbox Code Playgroud)
Amake check通过了所有测试,我最终安装了以下 GMP 文件:
/usr/local/include/gmp.h
/usr/local/lib/libgmp.10.dylib
/usr/local/lib/libgmp.a
/usr/local/lib/libgmp.dylib
/usr/local/lib/libgmp.la
/usr/local/share/info/gmp.info
/usr/local/share/info/gmp.info-1
/usr/local/share/info/gmp.info-2
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试构建 Nettle 2.4 时,如下所示:
curl -O http://www.lysator.liu.se/~nisse/archive/nettle-2.4.tar.gz
tar xzf nettle-2.4.tar.gz
pushd nettle-2.4
./configure --prefix=/usr/local
make
sudo make install
popd
Run Code Online (Sandbox Code Playgroud)
libhogweed它构建并安装成功,但由于缺少 GMP 而无法构建。经过进一步检查,我在输出中发现了以下警告configure:
checking for …Run Code Online (Sandbox Code Playgroud) 我正在使用 gmp 的 mpf_t 来尝试获得非常高的精度。
我的精度范围从负数万亿到正数万亿,以及这些数字的 1。但是 mpf 不支持允许负指数的幂函数,如果我想将值提高到 10^-30,有没有办法解决这个问题?
http://gmplib.org/manual/Float-Arithmetic.html#Float-Arithmetic
当我尝试使用 mpf_pow_ui 时,当我的 exp 为负数时,我的 gdp 输出:
(gdb) p exp_multiplier
$9 = {{_mp_prec = 2, _mp_size = 3, _mp_exp = 957480584338323631, _mp_d = 0x605070}}
Run Code Online (Sandbox Code Playgroud)
这最终会导致段错误。
我需要显示整数平均计算结果的前 100 位有意义的数字。系列整数存储在 mpz_t 类型的数组中,然后将其求和到 mpq_t 并除以另一个 mpq_t(计数)
代码:
mpq_t sum;
mpq_init(sum);
//same for variable count, they are filled from mpz_t
//display for check
gmp_printf("%.Qd\n", sum); <- here everything correct
gmp_printf("%.Qd\n", count); <- here also
mpq_div(sum, sum, count);
//to display with floating point
mpf_t avg;
mpf_init(avg);
mpf_set_q(avg, sum);
gmp_printf("%.100Ff\n", avg);
Run Code Online (Sandbox Code Playgroud)
最后一行的显示,假设 sum = 2, count = 3 是错误的。它在大约 10-15 位数字后上限并用 0 填充。对于 (2/3),它是 0.66666666670000...
所以有两件事:
因此对于 (2/3) 期望的输出是:
0.666...666(一百个6,末尾也有6)
我希望有一个mpz/mpfr值的numpy数组.因为我的代码:
import numpy as np
import gmpy2
A=np.ones((5,5));
print A/gmpy2.mpfr(1);
Run Code Online (Sandbox Code Playgroud)
产生:
RuntimeWarning: invalid value encountered in divide
print A/gmpy2.mpfr(1);
[[1.0 1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0 1.0]
[1.0 1.0 1.0 1.0 1.0]]
Run Code Online (Sandbox Code Playgroud)
据我所知,将gmpy mpfr转换为numpy float64是不可能的.那么我怎么能首先得到一个带有mpfr值的numpy数组呢?
谢谢.
我正在开发一些示例程序,并尝试使用 Eigen3 库提供的矩阵功能。我想将高精度整数变量(mpz_t)存储在(100,100)矩阵中。为了存储整数,已经有内置的数据类型MatrixXd。同样,只是想要高精度变量。请分享一些建议。
谢谢。