gmp 的固定大小整数...?

发布于 2024-12-02 12:27:53 字数 349 浏览 4 评论 0原文

几天来我一直在尝试在 MINGW 下安装 GMP 库。我已经在 linux64 位环境下使用 gcc 和 __uint128_t 几个星期了,然后在 GMP 和 mingw(32 位版本)下移植了相同的程序。我使用了 mpz_class 整数而不是 __uint128_t 。然后我开始了我的新计划并且......!使用 __uint128_t 和 64 位需要 16 分钟才能完成,使用 GMP 和 MINGW 需要 91 小时!

我应该怎么做才能加快速度呢?有没有更快的方法在 32 位环境下进行 128 位整数数学运算?我不需要超过 128 位,那么有什么方法可以告诉 GMP“好吧,我只需要 128 位,保持精度固定,但请加快速度”?

I've been trying for days to install GMP library under MINGW. I have been using for weeks __uint128_t with gcc under a linux64 bit environment, then ported the same program under GMP and mingw (32 bit version). I used mpz_class integers instead of __uint128_t. Then I started my new program and...! With __uint128_t and 64 bit it takes 16 minutes to complete, with GMP and MINGW it takes 91 HOURS!!!

What should I do to speed up things a bit? Is there any faster way to do 128 bit integer math under a 32 bit environment? I don't need more than 128 bit, so is there any way to tell GMP "ok, I just need 128 bits, keep presicion fixed but please GO FASTER"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

痕至 2024-12-09 12:27:53

不,当您使用 mpz_t 时,您不能将 GMP 限制为固定长度整数。 mpz_t 是一个具有肢体数组长度(已分配;使用)和一个指向实际值的指针的结构,该实际值存储为整数数组(肢体;int32 或 int64 数组)。当任何值变大时,GMP 已准备好扩展它的长度。

您可以使用 mpz_init2 在 init 处为每个 mpz_t 分配 128 位:

 mpz_init2(mpz_t*, bit_number);

但是这样的加速很小,仍然存在数据间接和长度处理。

您可以直接使用肢体并切换到 mpn_ 低级函数:

http://www.gnu.org/software/gmp/manual/html_node/Low-level-Functions.html#Low-level%20Functions

不会有指向肢体的指针(这有利于缓存),没有简单的输入/输出代码;并且没有自动肢体尺寸处理(也没有自动扩展;也没有分配)。您应该自己完成所有存储工作;甚至可能有些进位必须手动处理,但会有 GMP 的快速 */% 操作;您可以使用 mpz_t t;t._mp_size = t._mp_alloc=limb_number;t._mp_d=pointer_to_limb_array 重构 mpz_t 以方便输入/输出。

另外,如果您要切换到 64 位 mingw,则可以使用 uint128_t。

No, when you are using an mpz_t, you can't limit GMP to fixed-len integers. mpz_t is a struct with lenght of limbs array (allocated; used) and a pointer to actual value which is stored as array of ints (limbs; array of int32 or int64). GMP is ready to expand length of any value when it will grow to big.

You can allocate 128 bits for every mpz_t at init, using mpz_init2:

 mpz_init2(mpz_t*, bit_number);

But the speedup from this is small, there is still data-indirection and length-handling.

You can use limbs directly with switching to mpn_ low-level functions:

http://www.gnu.org/software/gmp/manual/html_node/Low-level-Functions.html#Low-level%20Functions

There will be no pointer to limbs (this is good for cache), no easy input/output code; and no automatic limbs size handling (nor auto-expand; nor allocation). You should do all storage by yourself; may be even some carry must be handled manually, but there will be GMP's fast *, / and % operations; you can reconstruct mpz_t for easy input/output with mpz_t t;t._mp_size = t._mp_alloc=limb_number;t._mp_d=pointer_to_limb_array.

Also, you just can use uint128_t if you will switch to 64-bit mingw.

夜雨飘雪 2024-12-09 12:27:53

如果您的目标 Windows 计算机足够新,可以使用 MinGW-w64 来代替64 位Windows(例如Vista 或7)。

You can use MinGW-w64 instead, if the Windows machines you're targeting are new enough to ship with 64-bit Windows (e.g. Vista or 7).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文