【问题标题】:GMP mpz_t return type for function函数的 GMP mpz_t 返回类型
【发布时间】:2020-04-26 14:11:25
【问题描述】:

我试图有一个递归函数,最终将返回一个 mpz_t 数据类型。我曾尝试使用mpz_get_ui() 来实现这一点,但这无法以非常大的数字(15 位数字+)给出正确的结果。该程序的目的是密码学。

我也尝试过创建 void 类型的函数并添加一个 mpz_t 参数作为答案占位符,如下所示:void fme(mpz_t y, mpz_t g, mpz_t x, mpz_t p) 但这消除了递归调用该函数的可能性,因为它不再返回任何内容。

我想知道是否可以使用 mpz_t 指针数据类型 mpz_t* 做任何事情?

这是我目前所拥有的:

unsigned long int fme(mpz_t g, mpz_t x, mpz_t p) {

  mpz_t result, temp;
  mpz_init(result);
  mpz_init(temp);

  if (mpz_cmp_d(x, 0) == 0) {

    mpz_clear(result);
    mpz_clear(temp);
    return 1;
  } else if (mpz_even_p(x) != 0) {

    mpz_fdiv_q_ui(temp, x, 2);
    mpz_set_ui(result, fme(g, temp, p));
    mpz_mul(result, result, result);
    mpz_mod(result, result, p);

    unsigned long int answer = mpz_get_ui(result);
    mpz_clear(result);
    mpz_clear(temp);
    return answer;
  }

【问题讨论】:

  • 为什么不直接返回mpz_t??
  • 它是array_type。 C 不允许这样做。
  • 当然可以。 but this eliminates the possibility of recursive 是假的。
  • 我想过简单地单独调用它,但 fme() 最终返回的结果是我需要在括号中使用的结果。不是它的变量之一。如果有任何关于如何做到这一点的建议将是完美的!我想让它尽可能靠近这个结构。
  • 请注意,如果if 的两个条件都为假,则函数返回的内容不清楚。

标签: c return-type gmp


【解决方案1】:

我认为只是:

// note: places result in the first argument, that has to initialized
void fme(mpz_t result, mpz_t g, mpz_t x, mpz_t p) {
    if (mpz_cmp_d(x, 0) == 0) {
         mpz_set_ui(result, 1);
         return;
    } else if (mpz_even_p(x) != 0) {
         mpz_t temp;
         mpz_init(temp);
         mpz_fdiv_q_ui(temp, x, 2);
         fme(result, g, temp, p);
         mpz_clear(temp);

         mpz_mul(result, result, result);
         mpz_mod(result, result, p);
    }
}

// should work the same as original
unsigned long int fme_old(mpz_t g, mpz_t x, mpz_t p) {
    mpz_t result;
    mpz_init(result);
    fme(result, g, x, p);
    unsigned long int ret = mpz_get_ui(result);
    mpz_clear(result);
    return ret;
}

【讨论】:

  • 我现在就试试这个,然后回来反馈。顺便说一句,我假设当您递归调用您的函数时,您的意思是 fme2?编辑:没关系你修好了:)
  • 我已经尝试了您建议的代码,我已经重构了我的代码,使其适合“返回”答案的新方式,但它似乎没有返回我的预期。在我的程序中的任何 fme() 事件中。编辑:我不够清楚,使用 fme(result, g, x, p) 的实例我稍后继续执行 mpz_set(var, result)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2013-07-16
  • 2018-04-09
相关资源
最近更新 更多