【问题标题】:Is there a good reason why there's no mpz_tdiv_r_2exp_ui() in GMP?GMP 中没有 mpz_tdiv_r_2exp_ui() 有充分的理由吗?
【发布时间】:2022-08-19 00:48:10
【问题描述】:

GMP 是一个快速的任意精度数学库。我用它来做整数运算。

many functions for integer divisions and remainders,但我不见了

unsigned long int mpz_tdiv_r_2exp_ui(const mpz_t n, mp_bitcnt_t b)

它不存在有什么原因吗?

顺便说一句,为什么现有的

unsigned long int mpz_tdiv_r_ui(mpz_t r, const mpz_t n, unsigned long int d);

需要mpz_t r 作为参数来获取结果,而结果保证适合unsigned long int 并且这已经返回?这似乎是不必要的性能损失。 (请注意,文档在“实际上返回余数是所有div_ui 函数所做的”中是错误的。那是错误的,因为mpz_tdiv_r_ui() 也修改了r(如您所料))。

这些奇怪的事情有什么原因吗?如果没有,那么我将提出更改请求。

    标签: gmp


    【解决方案1】:

    我迷路了

    unsigned long int mpz_tdiv_r_2exp_ui(const mpz_t n, mp_bitcnt_t b)
    

    有什么理由不存在吗?

    当参数是一个小整数时,GMP 有_ui 函数,而当参数是 2 的幂时,GMP 有 _2exp 函数,但我不相信它为 2 的小幂提供任何特定函数。如果你有需要(如果原型显示出有趣的性能优势,它会有所帮助,尽管它可能不是必需的),您应该在 gmp-discuss 邮件列表上发布以推荐这个新 API。我不确定它应该如何命名,_2exp_ui 看起来有 2 个参数,其中一个是 2 的幂,另一个是小整数。 mpz_and_ui 可能是另一种选择。

    为什么现有的

    unsigned long int mpz_tdiv_r_ui(mpz_t r, const mpz_t n, unsigned long int d);
    

    需要 mpz_t r 作为参数来获取结果,而结果 保证适合 unsigned long int 并且这已经是 回来?

    对于mpz_tdiv_r_ui,返回值是余数的绝对值,可能是正数也可能是负数,所以它缺少信息,我们需要别的东西(好吧,我们可以很容易地从输入中推断出符号,更难的情况会四舍五入到最接近的值,未提供)。为所有变体保持界面相同是很方便的。

    你注意到函数unsigned long int mpz_tdiv_ui (const mpz_t n, unsigned long int d)了吗(div之后没有rq)?它似乎完全按照您的意愿行事。

    【讨论】:

      最近更新 更多