我需要准确地得到210位数的平方根,我认为GMP是正确的工具,我做错了什么?
#include <stdlib.h>
#include <stdio.h>
#include "gmp.h"
int
main (int argc, char *argv[])
{
mpz_t sq_me, sq_out, test;
mpz_init(sq_me);
mpz_init(sq_out);
mpz_init(test);
mpz_set_str (sq_me, argv[1], 10);
mpz_sqrt(sq_out, sq_me);
mpz_mul(test,sq_out,sq_out);
gmp_printf ("%Zd\n\n", sq_out);
gmp_printf ("%Zd\n\n", test);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
24524664490027821197651766357308801846702678767833275974341445171506160083003858 72169522083993320715491036268271916798640797767232430056005920356312465612184658 17904100131859299619933817012149335034875870551067
49522383313031109809242226159886283348695660460381271324714928680654813093947239 9634016783775955618921028
24524664490027821197651766357308801846702678767833275974341445171506160083003858 72169522083993320715491034366358025027526868495267716284867043049443779615862887 47102011391915422793532619329760963626718900576784
我需要得到大数的所有素数因子,这些因子可以很容易地达到1k位.这些数字实际上是随机的,所以它应该不难.我该如何有效地做到这一点?我使用C++和GMP库.
编辑:我猜你们都误解了我.
我的意思是素数是得到数字的所有素因子.
对不起我的英语,在我的语言素数和因素是相同的:)
澄清(来自OP的其他帖子):
我需要的是一种使用C++和GMP(Gnu Multiple Precession lib)有效地计算(找到数字的素数因子)大数(可能达到2048位)的方法,或者更不用说任何其他方式.这些数字实际上是随机的,所以几乎没有机会难以分解,即使这个数字难以计算,我也可以重新编号(尽管不能选择).
我在C中有一个非常简单的GMP程序(下面)
#include <stdio.h>
#include <gmp.h>
int main() {
mpf_t a, b, inter;
mpf_init(a);
mpf_init(b);
mpf_init(inter);
mpf_set_d(a, 3.0);
mpf_set_d(b, 5.0);
mpf_add(inter, a, b);
gmp_printf("%F+%F=%F\n", a, b, inter);
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它编译正常,但在运行时,它会产生
error while loading shared libraries: libgmp.so.10: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
怎么了?
我花了几天时间尝试在MINGW windows安装上安装GMP库.我完成了几十次的安装过程,遵循互联网上的任何单一指南,但我无法让事情发挥作用.所以,我迫不及待地请某人帮助我强行解决这个问题:是否有人在GMP上成功构建并正在进行工作mingw(32位)安装?有人拉链并以某种方式发送给我吗?喜欢在mediafire/megaupload上传它并共享链接?我知道这不是很优雅,但我真的很绝望.我只需要在MINGW上安装GMP,可能会编译c ++源代码,这样我就可以直接使用运算符重载,但C版本也可以.
请有人帮忙,因为这个血腥的图书馆,我无法完成我的工作
再次感谢你
马特奥
我试图安装,Math::GMP但它一直在失败,我不知道从哪里去.这就是我输入的内容,这里是指向日志文件的输出:
[root@confeng Math-GMP-2.06-VEVNp7]# cpanm Math::GMP
--> Working on Math::GMP
Fetching http://www.cpan.org/authors/id/T/TU/TURNSTEP/Math-GMP-2.06.tar.gz ... OK
Configuring Math-GMP-2.06 ... OK
Building and testing Math-GMP-2.06 ... FAIL
! Installing Math::GMP failed. See /root/.cpanm/build.log for details.
[root@confeng Math-GMP-2.06-VEVNp7]#
Run Code Online (Sandbox Code Playgroud)
我检查了日志,我不知道我应该在这里有什么结构的日志 /root/.cpanm/build.log
cpanm (App::cpanminus) 1.5011 on perl 5.008008 built for i386-linux-thread-multi
Work directory is /root/.cpanm/work/1336128898.6464
You have make /usr/bin/make
You have /usr/bin/wget
You have /bin/tar: tar (GNU tar) 1.15.1
You have /usr/bin/unzip
Searching Math::GMP on cpanmetadb ...
--> Working on Math::GMP
Fetching http://www.cpan.org/authors/id/T/TU/TURNSTEP/Math-GMP-2.06.tar.gz
-> OK …Run Code Online (Sandbox Code Playgroud) 两者似乎都是不错的bignum图书馆,但我不确定每个图书馆的优点/缺点.我知道这是一个广泛的问题,但我主要是在突出的差异之后.
所以根据我之前提出的问题,我下载并设置了boost.我有这个代码:
#include <stdlib.h>
#include <boost\multiprecision\gmp.hpp>
using namespace std;
using namespace boost::multiprecision;
void main() {
mpz_int N(567014094304930933548155069494723691156768423655208899778686163624192868328194365094673392756508907687565332345345678900976543567890976543565789054335678097654680986564323567890876532456890775646780976543556789054367890765435689876545898876587907876535976565578907654538790878656543687656543467898786565457897675645657689756456578656456768654657898865567689656890795587907654678798765787897865654657897654678965465786867278762795432151914451557727529104757415030674806148138138281214236089749601911974949125689884222023119844272122501649909415937);
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译它时说
IntelliSense: integer constant is too large
Run Code Online (Sandbox Code Playgroud)
如果mpz_int不是我应该使用的,那么我应该使用什么来提升大量的int?
我正在编写一个使用Paillier Cryptosystem来加密矩阵的程序.要加密50 x 50矩阵,大约需要12秒!考虑到我打算加密大小为5000 x 5000及以上的矩阵,这是痛苦的.在Xcode上分析程序我发现这个paillier_get_rand_devurandom()是罪魁祸首.
这是调用跟踪快照:

这是此特定Paillier C库函数的源代码
void paillier_get_rand_devurandom( void* buf, int len )
{
paillier_get_rand_file(buf, len, "/dev/urandom");
}
void paillier_get_rand_file( void* buf, int len, char* file )
{
FILE* fp;
void* p;
fp = fopen(file, "r");
p = buf;
while( len )
{
size_t s;
s = fread(p, 1, len, fp);
p += s;
len -= s;
}
fclose(fp);
}
Run Code Online (Sandbox Code Playgroud)
如果是的话,
<http://www.en.wikipedia.org/wiki/Paillier_cryptosystem>
Paillier Cryptosytem C library : <http://acsc.cs.utexas.edu/libpaillier/>
Run Code Online (Sandbox Code Playgroud)
我已经读过使用dev/random的随机数生成很慢而使用dev/urandom则更快.在我的情况下,两者都同样缓慢.这个随机数生成能否更快?
编辑:这是一个例子
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#include<paillier.h> …Run Code Online (Sandbox Code Playgroud) 有没有办法以二进制形式序列化GMP有理数?我只看到读取/写入a的函数FILE,但即便如此,它也是一种文本形式.我可以转换为分子/分母并使用整数函数,但同样只有FILE输出可用.我需要能够获取原始字节或写入C++流.
我正在编写一个 C++ 程序来生成 Mandelbrot 集缩放。我所有的复数最初都是两个double(一个代表实部,一个代表复数部分)。这工作得相当快;对于我生成的图像类型,每帧 15 秒。
由于缩放效果,我想提高更多放大帧的精度,因为这些帧在 和 之间的差异非常min_x小max_x。我向 GMP 寻求帮助来解决这个问题。
现在,速度要慢得多;每帧 15:38 分钟。图像的设置与之前相同,算法也相同。唯一改变的是我使用的是mpf_class需要精确的小数(即只是复数)。为了比较性能,我使用了与 double 相同的精度:mpf_set_default_prec(64);
GMP是否改变精度mpf_class来满足表达的需要?换句话说,如果我有两个 64 位mpf_class对象,我用它们进行计算并将结果存储在另一个对象中mpf_class,精度是否可能会提高?我认为随着时间的推移,这会破坏性能,但我不确定这就是导致我的问题的原因。
我的问题:这种性能下降是否只是 GMP 和其他任意精度库的本质?你会给出什么建议?
编辑 1
我正在(即一直)使用-O3标志进行优化。我还进行了一项测试,以验证 GMP 不会自动提高对象的精度mpf_class。因此,问题仍然在于性能急剧下降的原因。
编辑 2
作为一个演示性示例,我将以下代码编译g++ main.cpp -lgmp -lgmpxx一次,如下所示,并将 everydouble替换为mpf_class. 用double它跑了 12.75 秒,用mpf_class它跑了 24 分 54 分钟。当它们的精度相同时,为什么会出现这种情况?
#include <gmpxx.h>
double linear_map(double d, double a1, double …Run Code Online (Sandbox Code Playgroud)